summaryrefslogtreecommitdiffstats
path: root/linhes/linhes-system/lh_system_backup_job
diff options
context:
space:
mode:
Diffstat (limited to 'linhes/linhes-system/lh_system_backup_job')
-rwxr-xr-xlinhes/linhes-system/lh_system_backup_job339
1 files changed, 339 insertions, 0 deletions
diff --git a/linhes/linhes-system/lh_system_backup_job b/linhes/linhes-system/lh_system_backup_job
new file mode 100755
index 0000000..6d16596
--- /dev/null
+++ b/linhes/linhes-system/lh_system_backup_job
@@ -0,0 +1,339 @@
+#!/bin/bash
+#process that uses this system backup script
+# - lh_mtc.py
+
+MYTH_RUN_STATUS="1"
+. /etc/profile
+. /etc/systemconfig
+PLEXDIR=/var/lib/plex
+KeepBackups=14
+DATE=`date +%F_%H-%M`
+backup_status=0
+MYTHHOME=`lh_home_check.sh`
+MYTHSHUTDOWN="/usr/bin/mythshutdown"
+
+#find primary backup location
+for dir in /data/storage/disk*
+do
+ if [ $dir == /data/storage/disk0 ]; then
+ continue
+ fi
+ TESTDIR=`readlink $dir`
+ if [ -n $TESTDIR ]; then
+ BACKUPLINK=$dir
+ BACKUPDISK=$TESTDIR
+ BACKUPDIR=$TESTDIR/backup/system_backups
+ break
+ fi
+done
+
+if [ `mountpoint -q $BACKUPDISK 2> /dev/null` ]; then
+ echo " The system doesn't have a second drive. Backup skipped."
+ exit $backup_status
+fi
+
+
+#find secondary backup location
+for dir in /data/storage/disk*
+do
+ if [[ $dir == /data/storage/disk0 || $dir == $BACKUPLINK ]]; then
+ continue
+ fi
+ TESTDIR=`readlink $dir`
+ if [ -n $TESTDIR ]; then
+ SECBACKUPLINK=$dir
+ SECBACKUPDISK=$TESTDIR
+ SECBACKUPDIR=$TESTDIR/backup/system_backups
+ break
+ fi
+done
+
+function lock_myth(){
+ $MYTHSHUTDOWN --lock
+}
+
+function unlock_myth(){
+ $MYTHSHUTDOWN --unlock
+}
+
+function backup_status_check(){
+ if [ $1 -ne 0 ]
+ then
+ backup_status=1
+ fi
+}
+
+
+function backup(){
+
+ echo
+ echo "Starting Backup"
+ echo "Backup Directory: $BACKUPLINK --> $BACKUPDIR"
+ echo "Secondary Backup Directory: $SECBACKUPLINK --> $SECBACKUPDIR"
+ echo
+ mkdir -p $BACKUPDIR/$DATE
+
+ #backup database
+ if [ $SystemType = MasterBackend -o $SystemType = Standalone ]
+ then
+ echo
+ echo "Backup mariadb databases"
+ pacman -Q mysql 2>/dev/null
+ if [ $? = 0 ]
+ then
+ echo " mythconverg (mythtv database)"
+ /usr/bin/mariadb-dump -x mythconverg > $BACKUPDIR/$DATE/mythconverg
+ backup_status_check $?
+
+ #this is everything
+ echo " All databases in one file"
+ /usr/bin/mariadb-dump -x --all-databases > $BACKUPDIR/$DATE/all_databases
+ backup_status_check $?
+ fi
+ fi
+
+ echo "Backup saved settings"
+ if [ -e /usr/MythVantage/templates/settings ]
+ then
+ cp -rp /usr/MythVantage/templates/settings $BACKUPDIR/$DATE/settings
+ backup_status_check $?
+ fi
+
+ echo "Backup etc"
+ cp -rp /etc $BACKUPDIR/$DATE/etc
+
+ echo "Backup Plex Media Server databases and preferences"
+ if [ -e $PLEXDIR/Plex\ Media\ Server/Plug-in\ Support ]
+ then
+ mkdir $BACKUPDIR/$DATE/plex
+ backup_status_check $?
+ fi
+ if [ -e $PLEXDIR/Plex\ Media\ Server/Plug-in\ Support/Databases ]
+ then
+ mkdir -p $BACKUPDIR/$DATE/plex/Databases/
+ backup_status_check $?
+ cp -rp $PLEXDIR/Plex\ Media\ Server/Plug-in\ Support/Databases/*.db $BACKUPDIR/$DATE/plex/Databases/
+ backup_status_check $?
+ cp -rp $PLEXDIR/Plex\ Media\ Server/Plug-in\ Support/Databases/*.db-wal $BACKUPDIR/$DATE/plex/Databases/
+ backup_status_check $?
+ cp -rp $PLEXDIR/Plex\ Media\ Server/Plug-in\ Support/Databases/*.db-shm $BACKUPDIR/$DATE/plex/Databases/
+ backup_status_check $?
+ fi
+ if [ -e $PLEXDIR/Plex\ Media\ Server/Plug-in\ Support/Preferences ]
+ then
+ cp -rp $PLEXDIR/Plex\ Media\ Server/Plug-in\ Support/Preferences $BACKUPDIR/$DATE/plex/Preferences
+ backup_status_check $?
+ fi
+
+ #create default backup_exclude.txt
+ if [ ! -f $MYTHHOME/backup_config/backup_exclude.txt ]
+ then
+ mkdir -p $MYTHHOME/backup_config/
+ touch $MYTHHOME/backup_config/backup_exclude.txt
+ chmod 777 $MYTHHOME/backup_config/backup_exclude.txt
+ fi
+
+ for i in ".mythtv/cache" ".mythtv/themecache" ".mythtv/remotecache" ".mythtv/Cache-myth*" ".cache" "tmp" ".vnc/*log" ".vnc/*pid" ".plexht/userdata/Thumbnails" ".plexht/userdata/ThemeMusicCache" ".kodi/userdata/Thumbnails"
+ do
+ grep -qF "$i" $MYTHHOME/backup_config/backup_exclude.txt
+ rc=$?
+ if [ $rc != 0 ]
+ then
+ echo "$i" >> $MYTHHOME/backup_config/backup_exclude.txt
+ fi
+ done
+
+ echo "Backup home dirs"
+ HOMEDIRS=""
+ tar -I pigz -cf $BACKUPDIR/$DATE/home_dir.tar.gz -X $MYTHHOME/backup_config/backup_exclude.txt $MYTHHOME $HOMEDIRS
+
+ if [ -f $MYTHHOME/backup_config/backup_include.txt ]
+ then
+ echo
+ echo "Backup items from $MYTHHOME/backup_config/backup_include.txt"
+ tar -I pigz -cf $BACKUPDIR/$DATE/other.tar.gz -T $MYTHHOME/backup_config/backup_include.txt
+ backup_status_check $?
+ fi
+
+ echo "Compress backup file"
+ cd $BACKUPDIR
+ tar -I pigz -cf $BACKUPDIR/backup.$DATE.tgz $DATE
+ backup_status_check $?
+ if [ -d $BACKUPDIR/$DATE ]
+ then
+ rm -rf $BACKUPDIR/$DATE
+ fi
+
+ if [ $backup_status -eq 0 ]
+ then
+ BACKUPPATH=$BACKUPDIR/backup.$DATE.tgz
+ else
+ echo "Backup had an error"
+ mkdir $BACKUPDIR/errored_backups
+ mv $BACKUPDIR/backup.$DATE.tgz $BACKUPDIR/errored_backups/backup.$DATE.tgz
+ BACKUPPATH=$BACKUPDIR/errored_backups/backup.$DATE.tgz
+ fi
+
+ if [ -f /home/xymon/server/ext/hbnotes.py ]
+ then
+ /home/xymon/server/ext/hbnotes.py
+ chown nobody:nobody /data/srv/httpd/htdocs/hobbit/notes/* 2> /dev/null >/dev/null
+ fi
+ echo
+ echo "Created backup file:"
+ echo " $BACKUPPATH"
+}
+
+function update_backup_status(){
+ echo
+ # Add Last backup status to menu item
+ #if description not in the backup xml file, add it
+ if [ $rc=0 ]
+ then
+ COMPLETE_MSG="Last backup completed `date '+%D %-I:%M %p'`"
+ else
+ COMPLETE_MSG="Last backup FAILED `date '+%D %-I:%M %p'`"
+ fi
+ echo "Updating menu with:"
+ echo " $COMPLETE_MSG"
+ xmlfile="/usr/share/mythtv/themes/defaultmenu/mythbackup.xml"
+
+ grep -q "<description>" $xmlfile >/dev/null
+ desc_check=$?
+
+ if [ $desc_check = 0 ]
+ then
+ sed -i "0,/<description\>.*\<description\>/s||\<description\>$COMPLETE_MSG<\/description|" $xmlfile
+ #sed -i "0,/\<description\>.*\<description\>/s//\<description\>$COMPLETE_MSG\<\/description/" $xmlfile
+ else
+ sed -i " /NONE/ i\ \<description\>$COMPLETE_MSG\<\/description\>" $xmlfile
+ fi
+}
+
+function remove_old_backups(){
+ #remove old backups
+ NumBackups=`ls $BACKUPDIR/backup*.tgz|wc -l`
+ if [[ $NumBackups -gt $KeepBackups ]]; then
+ numdel=$(($NumBackups-$KeepBackups))
+ rm -f `ls $BACKUPDIR/backup*.tgz -tr1|head -$numdel`
+ fi
+}
+
+
+function remote_backup(){
+ echo
+ echo "Remote backup"
+ #Remote copy
+ if [ x$RemoteBackup = x1 ]
+ then
+ localRemoteCheck=`echo $RemoteBackupDir | cut -d: -f1`
+ if [ x$localRemoteCheck = xdir ]
+ then
+ localRemotedir=`echo $RemoteBackupDir | cut -d: -f2`
+ echo " copying $BACKUPDIR/backup.$DATE.tgz to $localRemotedir "
+ cp $BACKUPDIR/backup.$DATE.tgz $localRemotedir
+ else
+ /usr/bin/func ${RemoteBackupDir} ping| grep -q "FAILED"
+ rc=$?
+ if [ $rc = 0 ]
+ then
+ #this is here to mark failed copy of the backup.
+ #There is a cron.hourly job that will attempt to retransfer the file
+ echo " Remote backup failed to ${RemoteBackupDir}"
+ echo backup.$DATE.tgz >> $BACKUPDIR/remote_backup_failed.txt
+ else
+ echo " copying $BACKUPDIR/backup.$DATE.tgz to ${RemoteBackupDir}:$BACKUPDIR/MBE_$DATE.tgz"
+ /usr/bin/func ${RemoteBackupDir} copyfile -f $BACKUPDIR/backup.$DATE.tgz --remotepath $BACKUPDIR/MBE_$DATE.tgz
+ fi
+ fi
+ else #do local copy to SECBACKUPLINK
+ echo " Remote backup is not enabled, copying backup to another drive on this system."
+
+ if [ -n "$SECBACKUPDISK" ]; then
+ SECBACKUP=$SECBACKUPDISK/backup
+ if [ ! `mountpoint -q $SECBACKUPDISK 2> /dev/null` ]; then
+ if [ ! -d "$SECBACKUPDIR" ]; then
+ mkdir -p -m 775 $SECBACKUPDIR
+ echo " Created $SECBACKUPDIR"
+ chown mythtv:users $SECBACKUPDIR
+ fi
+ echo " Copying system backups to $SECBACKUPDIR"
+ rsync -au --delete $BACKUPDIR/ $SECBACKUPDIR/
+ else
+ echo " $SECBACKUPDISK isn't mounted."
+ fi
+ else
+ echo " Could not find another drive on this system."
+ fi
+ fi
+}
+
+function remote_transfer(){
+ transfer_file=${1}
+ echo $transfer_file
+ /usr/bin/func ${RemoteBackupDir} ping| grep -q "FAILED"
+ rc=$?
+ if [ $rc = 0 ]
+ then
+ #this is here to mark a failed copy of the backup.
+ #There is a cron.hourly job that will attempt to retransfer the file
+ echo " Remote backup failed to ${RemoteBackupDir}"
+ echo $transfer_file >> $BACKUPDIR/remote_backup_failed.txt
+ else
+ echo " copying $BACKUPDIR/$transfer_file to ${RemoteBackupDir}:$BACKUPDIR/MBE_$transfer_file"
+ /usr/bin/func ${RemoteBackupDir} copyfile -f $BACKUPDIR/$transfer_file --remotepath $BACKUPDIR/MBE_$transfer_file
+ fi
+}
+
+function add_link(){
+ if [ -f $BACKUPDIR/remote_backup_failed.txt ]
+ then
+ RETRYFILE="/etc/cron.hourly/lh_backup_retry.sh"
+ echo "#!/bin/bash" > $RETRYFILE
+ echo "#This file was autogenerated and will be removed by lh_system_backup_job" >> $RETRYFILE
+ echo "MYTH_RUN_STATUS=1">> $RETRYFILE
+ echo ". /etc/profile">> $RETRYFILE
+ echo "lh_system_backup_job retry">> $RETRYFILE
+ chmod 755 $RETRYFILE
+ fi
+}
+
+function remove_link(){
+ RETRYFILE="/etc/cron.hourly/lh_backup_retry.sh"
+ if [ ! -f $BACKUPDIR/remote_backup_failed.txt ]
+ then
+ rm -f $RETRYFILE
+ fi
+}
+
+
+#------------------------------------
+lock_myth
+if [ "x$1" = "x" ]
+then
+ backup
+ #update_backup_status
+ #only remove old backups if there was no problems
+ if [ $backup_status -eq 0 ]
+ then
+ remove_old_backups
+ fi
+ remote_backup
+ add_link
+else
+ #this is where we attempt to transfer again as part of the cronjob
+ if [ -f $BACKUPDIR/remote_backup_failed.txt ]
+ then
+ mv -f $BACKUPDIR/remote_backup_failed.txt /tmp
+ while read line
+ do
+ echo $line
+ remote_transfer $line
+ done < /tmp/remote_backup_failed.txt
+ rm -f /tmp/remote_backup_failed.txt
+ fi
+ remove_link
+fi
+unlock_myth
+echo $backup_status > /var/run/systembackup.rc
+exit $backup_status