From 6eddeb0330d50d2afaf3ae1458b0e61a0f626bbe Mon Sep 17 00:00:00 2001 From: Britney Fransen Date: Sat, 18 Feb 2023 00:56:05 -0500 Subject: linhes-system: move myth_mtc to lh_mtc and rework --- linhes/linhes-system/PKGBUILD | 19 +- linhes/linhes-system/lh_mtc.cron | 80 ++++++++ linhes/linhes-system/lh_mtc.py | 153 ++++++++++++++ linhes/linhes-system/lh_system_backup | 29 +++ linhes/linhes-system/lh_system_backup_job | 330 ++++++++++++++++++++++++++++++ linhes/linhes-system/lh_system_start.sh | 7 +- linhes/linhes-system/myth_mtc.cron | 79 ------- linhes/linhes-system/myth_mtc.py | 155 -------------- 8 files changed, 605 insertions(+), 247 deletions(-) create mode 100644 linhes/linhes-system/lh_mtc.cron create mode 100755 linhes/linhes-system/lh_mtc.py create mode 100755 linhes/linhes-system/lh_system_backup create mode 100755 linhes/linhes-system/lh_system_backup_job delete mode 100644 linhes/linhes-system/myth_mtc.cron delete mode 100755 linhes/linhes-system/myth_mtc.py diff --git a/linhes/linhes-system/PKGBUILD b/linhes/linhes-system/PKGBUILD index ab75da9..62bee0b 100755 --- a/linhes/linhes-system/PKGBUILD +++ b/linhes/linhes-system/PKGBUILD @@ -1,6 +1,6 @@ pkgname=linhes-system pkgver=9.0.0 -pkgrel=46 +pkgrel=47 arch=('x86_64') #install=$pkgname.install pkgdesc="Everything that makes LinHES a system" @@ -11,14 +11,15 @@ depends=('cronie' 'dbus-python' 'dvb-firmware' 'expect' 'flatpak' 'firefox' 'gla 'intel-media-driver' 'libva-intel-driver' 'libva-vdpau-driver') binfiles="add_storage.py balance_storage_groups.py empty_storage_groups.py remove_storage.py checkXFSfrag.sh enableIRWake.sh idle.py lh_system_start.sh lh_notify-send - lh_home_check.sh lh_myth_status.py jobqueue_helper.py gen_lib_xml.py - diskspace.sh find_orphans.py optimize_mythdb.py myth_mtc.py + lh_home_check.sh lh_myth_status.py lh_system_backup lh_system_backup_job + jobqueue_helper.py gen_lib_xml.py + diskspace.sh find_orphans.py optimize_mythdb.py lh_mtc.py misc_recent_recordings.pl misc_status_config.py misc_status_info.sh misc_upcoming_recordings.pl misc_which_recorder.pl create_media_dirs.sh be_check.py myth2mkv myth2mp3 myth2videos udev_link.sh" source=($binfiles - 'myth_mtc.cron' 'paccache.cron' 'flatpak_update.cron' 'xfs_defrag.cron' + 'lh_mtc.cron' 'paccache.cron' 'flatpak_update.cron' 'xfs_defrag.cron' 'readme_is_xml' 'add_storage.readme' 'LinHES-release' 'lh_log_care.cron' '79-cronie.hook' 'fstrim.hook' 'openssh.hook' 'plex_lib.conf' 'rsyslog.hook' '10-monitor.conf' 'x11vnc.override.conf' 'lh_lighttpd.conf' 'lh_php.ini' @@ -31,16 +32,18 @@ sha256sums=('525bfe29b63d3ec5a17a32fa29745e24070020490c3f5b6dd6b03250348fb324' 'c7a2b2de44645e3a905b39d7411e5b8b27b60bd2944533fd4655c3b175755da1' 'ae34515e144830f424d3bd3f6b1b446892d62beed20bca6f0fb19b0bbb779f27' '5e6d128f879b0fe7c1a190cccd75d4e5d00afc161f3bc9e92ffa2d87242cc9df' - '7667518308cbb2ff7fbc52e6e0ba918b11ee04e5e26cee85d98297df4929da41' + '7d4c5397326565b517799aef4e6301d12b672a5995e4de03cf6817f5de05855d' '6d4fb0ed1a5ed961b3a3884dce093118e50c2981a9cd5837d20abc5a6d4fd8aa' '87875d9e5f5ce18208f419698ce69b6bcbcd08955a57a4a13940e715af58b787' '93d664f4a46fda05d0f754d19df40cbda120e325b80c07092345b14763993833' + '8d6d09cedc85e49712144699ccb905be6ef663e9ab0bc01abd434370ab12fede' + 'e5ffd470e43b4993b5212b128c2e92aa55d18538b130de671fcf56c0d0a5e9d4' '91bdec992bb2c933e15625c181f2195c402060b879168ebf35944cb064c904b9' '5cacfdd02833e5a3130d765573e772e6bd5030336ba86239c5e4db5ffa36fc69' 'ebdb3ee0212e0cc72526bb5e50a032573e1894acb7bf75617243b0b49aa1f8f2' '4d006f0fe3b13e67de1b961d611e81911905a30d140849dfdb8e5c0dc4da2f7c' 'e371c6a289c68fe200d7da856c20a8c579efa23178f4d62235f7359d7f6e49a1' - 'c9b52a5be54f920ca5fb16423977cb685c9b2db8b39fe9b1c743abf12228a700' + '048a978774c4f05a5a9482f0aab32e00d2c21217d6faf8c578ed6b26cb5de67d' 'd2d69b2bf6315bd37ff5f5b2f0cde8ab2fb89bae18f8796dc5208ffc1a9d743e' 'a3f8ba840853e4a189dd52520a6958f4030e1cc3391200a6aeef055fb469f0b4' '1819085bd2c9106482c5f243b95fddf3dae69212330ab76cb493add5c26a45a4' @@ -52,7 +55,7 @@ sha256sums=('525bfe29b63d3ec5a17a32fa29745e24070020490c3f5b6dd6b03250348fb324' 'a961cfdc6f02b12fb445777dd2c144fed96306ca2f430cc8853ae307c759c1ad' 'd8574104b75c6d41284488612ec5583c50a8dab438492fa42c47231add4cfc54' '6bdbf593d3e1348d1a8f7c4c17cb2e893f7e18ae355daf978173e669cfe3be80' - '9e97b4d68c9e8988daacadd40f1de9f0b5945d870eba596a2ceb5e0c023fa9c0' + 'b3f02ec3f8cedc98c74b3169049b7b6aa78bd79d558a8bc98d00e064b983965c' '186203d3c0520bb3d611da99d33a7713e9c1563814285f1f101097234f214b2f' 'd8d36a501928d0cc505957d392291fad317b1e895ff99847d90643cf5f622a89' 'cdfc0c836b8194f631f4a9e022c232ff75a13ff1a161a1a011858578bea5f930' @@ -126,7 +129,7 @@ package() { #cron files install -Dm755 $srcdir/paccache.cron $pkgdir/etc/cron.weekly/paccache install -Dm755 $srcdir/xfs_defrag.cron $pkgdir/etc/cron.weekly/xfs_defrag - install -Dm755 $srcdir/myth_mtc.cron $pkgdir/etc/cron.hourly/myth_mtc + install -Dm755 $srcdir/lh_mtc.cron $pkgdir/etc/cron.hourly/lh_mtc install -Dm755 $srcdir/flatpak_update.cron $pkgdir/etc/cron.daily/flatpak_update install -Dm755 $srcdir/lh_log_care.cron $pkgdir/etc/cron.daily/lh_log_care diff --git a/linhes/linhes-system/lh_mtc.cron b/linhes/linhes-system/lh_mtc.cron new file mode 100644 index 0000000..b556d60 --- /dev/null +++ b/linhes/linhes-system/lh_mtc.cron @@ -0,0 +1,80 @@ +#!/bin/bash +MYTH_RUN_STATUS=1 +. /etc/systemconfig +. /etc/profile + +date=`date +%Y-%m-%d` +timestamp=`date +'%Y-%m-%d %H:%M'` +hostname=`/usr/bin/hostnamectl hostname` +logFile="/var/log/${date}/${hostname}_lh_mtc.log" +log="logger -t lh_mtc -p local6.info" + +if [ ! -f $logFile ]; then + touch $logFile + echo "" | $log +fi + +#check logfile for Finished and if not run lh_mtc.py +if ! grep -q "Finished Maintenance" $logFile +then + + if ! grep -q "Finished checking size of MythTV home" $logFile + then + sudo -u mythtv bash -c "MYTHCONFDIR=/usr/share/mythtv unbuffer lh_mtc.py --check_home | $log" + if [ $? = 0 ] + then + echo "" | $log + else + echo "Time Exceeded" | $log + exit + fi + fi + + if ! grep -q "Finished Optimize" $logFile + then + if [ $SystemType = FrontendOnly ] + then + echo "Will not run Optimize on Frontend Only systems." | $log + echo "Finished Optimize" | $log + else + sudo -u mythtv bash -c "MYTHCONFDIR=/usr/share/mythtv unbuffer lh_mtc.py --optimize | $log" + if [ $? = 0 ] + then + echo "" | $log + else + echo "Time Exceeded" | $log + exit + fi + fi + fi + + if ! grep -q "Finished Backup" $logFile && grep -q "Finished Optimize" $logFile + then + sudo -u mythtv bash -c "MYTHCONFDIR=/usr/share/mythtv unbuffer lh_mtc.py --backup | $log" + if [ $? = 0 ] + then + echo "" | $log + else + echo "Time Exceeded" | $log + exit + fi + fi + +# if ! grep -q "Finished Update" $logFile +# then +# sudo -u mythtv bash -c "MYTHCONFDIR=/usr/share/mythtv unbuffer lh_mtc.py --update | $log" +# if [ $? = 0 ] +# then +# echo "" | $log +# else +# echo "Time Exceeded" | $log +# exit +# fi +# fi + +# if grep -q "Finished checking size of MythTV home" $logFile && grep -q "Finished Optimize" $logFile && grep -q "Finished Backup" $logFile && grep -q "Finished Update" $logFile + if grep -q "Finished checking size of MythTV home" $logFile && grep -q "Finished Optimize" $logFile && grep -q "Finished Backup" $logFile + then + echo "Finished Maintenance" | $log + fi +fi diff --git a/linhes/linhes-system/lh_mtc.py b/linhes/linhes-system/lh_mtc.py new file mode 100755 index 0000000..f79314e --- /dev/null +++ b/linhes/linhes-system/lh_mtc.py @@ -0,0 +1,153 @@ +#!/usr/bin/python +import sys, subprocess +import re +import socket +import os +import datetime,time +import shlex +sys.dont_write_bytecode = True + +try: + from MythTV import MythBE + mythtv = MythBE() +except: + mythtv = None + +#print mythtv.db.getSetting( 'Theme', socket.gethostname()) + +def get_timestamp(): + now = datetime.datetime.now() + date = (now.strftime('%Y-%m-%d %H:%M')) + return date + +def getFreePercentForDir(dir): + stats = os.statvfs(dir) + total = (stats.f_blocks) + avail = (stats.f_bavail) + return (total - avail) / float(total) + +def check_home(): + #get the mythtv home dir + MYTHHOME=subprocess.check_output("lh_home_check.sh").decode('utf-8').strip() + + freePcent = getFreePercentForDir(MYTHHOME) + print(" Home directory percent used: " + str(freePcent * 100) + "%") + if float(freePcent) > .9: + print(" Home directory is greater than 90% used. Clearing caches...") + cmd = "/usr/bin/rm -rf " + MYTHHOME + "/.mythtv/{*cache,Cache-*,tmp/*,MythMusic/AlbumArt/*}" + subprocess.call(["sh", "-c", cmd]) + print(" Restarting mythfrontend...") + subprocess.call(["killall", "mythfrontend"]) + cmd = "/usr/bin/rm -rf " + MYTHHOME + "/.cache/*" + subprocess.call(["sh", "-c", cmd]) + cmd = "/usr/bin/rm -rf " + MYTHHOME + "/.plexht/userdata/Thumbnails/*" + subprocess.call(["sh", "-c", cmd]) + cmd = "/usr/bin/rm -rf " + MYTHHOME + "/.plexht/userdata/ThemeMusicCache/*" + subprocess.call(["sh", "-c", cmd]) + freePcent = getFreePercentForDir(MYTHHOME) + print(" Home directory percent used: " + str(freePcent * 100) + "%") + else: + print(" Home directory is less than 90% used. Not clearing caches.") + return 0 + +def optimize(): + try: + cursor = mythtv.db.cursor() + cursor.execute("SHOW tables") + result = cursor.fetchall() + except: + print("\n%s Problem getting tables from the database" %(get_timestamp())) + return 1 + ops=["REPAIR","OPTIMIZE","ANALYZE"] + for row in result: + ctable=row[0] + for op in ops: + print(" %s %s" %(op,ctable)) + cmd= "%s table %s" %(op,ctable) + cursor.execute(cmd) + return 0 + +def cleanup_inuseprograms(): + fourHoursAgo=datetime.datetime.today() - datetime.timedelta(hours=4) + cmd="DELETE FROM inuseprograms WHERE lastupdatetime < '%s';" %fourHoursAgo + try: + cursor = mythtv.db.cursor() + cursor.execute(cmd) + except: + print("\n%s Problem cleaning inuseprograms in database" %(get_timestamp())) + + +def bail_if_another_is_running(): + cmd = shlex.split("pgrep -u {} -f {}".format(os.getuid(), __file__)) + pids = subprocess.check_output(cmd).decode('utf-8').strip().split('\n') + if len(pids) > 1: + pids.remove("{}".format(os.getpid())) + print("Exiting! Found {} is already running (pids): {}".format( + __file__, " ".join(pids))) + raise SystemExit(1) + +def run_stuff(): + print("\n%s" %get_timestamp()) + + if (len(sys.argv) == 1) or ("--noidlecheck" in sys.argv) and (len(sys.argv) == 2): + runall = True + else: + runall = False + + if ("--noidlecheck" in sys.argv): + print("No system idle check will be done.") + idle = 0 + else: + idle = subprocess.call(["/usr/bin/python", "/usr/bin/idle.py"]) + + if not idle: + if ("--check_home" in sys.argv) or runall: + print("\n#######################################") + print("\n%s Checking size of MythTV home" %(get_timestamp())) + if not check_home(): + print("\nFinished checking size of MythTV home") + else: + return True + + if ("--optimize" in sys.argv) or runall: + print("\n#######################################") + print("\n%s Running Optimize" %(get_timestamp())) + if not optimize(): + print("\nFinished Optimize") + else: + return True + + if ("--backup" in sys.argv) or runall: + print("\n#######################################") + print("\n%s Running Backup" %(get_timestamp())) + if not os.system('/usr/bin/lh_system_backup_job'): + print("\nFinished Backup") + + if ("--update" in sys.argv) or runall: + print("\n#######################################") + print("\n%s Running System Update" %(get_timestamp())) + if not os.system('/usr/bin/lh_system_host_update'): + print("\nFinished Update") + + print("\n#######################################") + continue_loop=False + else: + continue_loop=True + return continue_loop + +#--------------------------------- +bail_if_another_is_running() +starttime=time.time() +ctin=True +while ctin: + cleanup_inuseprograms() + ctin=run_stuff() + if ctin: + print("\n%s Waiting 10 minutes before trying again." %(get_timestamp())) + time.sleep(600) + + current_time=time.time() + if (current_time - starttime) > 3000 : + ctin = False + print("\n%s Time Exceeded 50 minutes. Quitting.)" %(get_timestamp())) + exit(1) diff --git a/linhes/linhes-system/lh_system_backup b/linhes/linhes-system/lh_system_backup new file mode 100755 index 0000000..f970f4f --- /dev/null +++ b/linhes/linhes-system/lh_system_backup @@ -0,0 +1,29 @@ +#!/bin/bash +. /etc/systemconfig +lh_notify-send "Starting Backup..." +#alert user the database will not be backed up +if [ $SystemType != MasterBackend -a $SystemType != Standalone ] +then + lh_notify-send "This is not the Master backend.\n Skipping backup of database." +fi + +if [ $SystemType = MasterBackend -o $SystemType = Standalone ] +then + backend_control.sh stop 127.0.0.1 +fi + +#do the backup +lh_system_backup_job 2>&1 > /var/run/backup.log +rc=$? +if [ $SystemType = MasterBackend -o $SystemType = Standalone ] +then + backend_control.sh start 127.0.0.1 +fi + +if [ $rc = 0 ] +then + complete_message="Backup completed successfully." +else + complete_message="Backup failed." +fi +lh_notify-send "$complete_message" diff --git a/linhes/linhes-system/lh_system_backup_job b/linhes/linhes-system/lh_system_backup_job new file mode 100755 index 0000000..257bb87 --- /dev/null +++ b/linhes/linhes-system/lh_system_backup_job @@ -0,0 +1,330 @@ +#!/bin/bash +#process that uses this system backup script +# - lh_mtc.py + +MYTH_RUN_STATUS="1" +. /etc/profile +. /etc/systemconfig +BACKUPDIR=/data/storage/disk0/backup/system_backups +SECBACKUPLINK=/data/storage/disk1 +KeepBackups=14 +DATE=`date +%F_%H-%M` +backup_status=0 +# + +MYTHSHUTDOWN="/usr/bin/mythshutdown" + +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" + mkdir -p $BACKUPDIR/$DATE + + #backup database + if [ $SystemType = Master_backend -o $SystemType = Standalone ] + then + echo + echo "Backup mysql databases" + pacman -Q mysql 2>/dev/null + if [ $? = 0 ] + then + echo " mythconverg (mythtv database)" + mysqldump -x mythconverg > $BACKUPDIR/$DATE/mythconverg + backup_status_check $? + + echo " ncid (caller id)" + mysqldump -x ncid > $BACKUPDIR/$DATE/ncid 2>/dev/null + + #this is all the users + echo " users" + mysqldump -x mysql > $BACKUPDIR/$DATE/mysql_table + + #this is everything + echo " All databases in one file" + mysqldump -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 + if [ -e /var/lib/oss ] + then + cp -rp /var/lib/oss $BACKUPDIR/$DATE/oss + backup_status_check $? + fi + + echo "Backup func keys" + cp -rp /etc/pki $BACKUPDIR/$DATE/pki + + echo "Backup Plex Media Server databases and preferences" + if [ -e /data/storage/disk0/media/plex/Plex\ Media\ Server/Plug-in\ Support ] + then + mkdir $BACKUPDIR/$DATE/plex + backup_status_check $? + fi + if [ -e /data/storage/disk0/media/plex/Plex\ Media\ Server/Plug-in\ Support/Databases ] + then + cp -rp /data/storage/disk0/media/plex/Plex\ Media\ Server/Plug-in\ Support/Databases $BACKUPDIR/$DATE/plex/Databases + backup_status_check $? + fi + if [ -e /data/storage/disk0/media/plex/Plex\ Media\ Server/Plug-in\ Support/Preferences ] + then + cp -rp /data/storage/disk0/media/plex/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 -zcf $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 -zcf $BACKUPDIR/$DATE/other.tar.gz -T $MYTHHOME/backup_config/backup_include.txt + backup_status_check $? + fi + + echo "Compress backup file" + cd $BACKUPDIR + tar -zcf $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 "" $xmlfile >/dev/null + desc_check=$? + + if [ $desc_check = 0 ] + then + sed -i "0,/.*\/s||\$COMPLETE_MSG<\/description|" $xmlfile + #sed -i "0,/\.*\/s//\$COMPLETE_MSG\<\/description/" $xmlfile + else + sed -i " /NONE/ i\ \$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." + SECBACKUPDISK=`readlink $SECBACKUPLINK` + + if [ -z $SECBACKUPDISK ] + then + for dir in /data/storage/disk* + do + if [ $dir == /data/storage/disk0 ] + then + continue + fi + TESTDIR=`readlink $dir` + if [ -n $TESTDIR ] + then + SECBACKUPDISK=$TESTDIR + break + fi + done + fi + + if [ -n "$SECBACKUPDISK" ]; then + SECBACKUP=$SECBACKUPDISK/backup + if [ `mountpoint -q -d $SECBACKUPDISK` ]; then + if [ ! -d "$SECBACKUP" ]; then + mkdir -p -m 775 $SECBACKUP + echo " Created $SECBACKUP" + chown mythtv:users $SECBACKUP + fi + echo " Copying system backups to $SECBACKUP" + rsync -au --delete $BACKUPDIR $SECBACKUP + 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 diff --git a/linhes/linhes-system/lh_system_start.sh b/linhes/linhes-system/lh_system_start.sh index 5e84bc6..eab8594 100755 --- a/linhes/linhes-system/lh_system_start.sh +++ b/linhes/linhes-system/lh_system_start.sh @@ -66,7 +66,7 @@ function install_lh_apps(){ #install programs that are not needed on the iso #check network connection netwait=0 - while ! nc -zw1 1.1.1.1 443; do + while [ ! nc -zw1 1.1.1.1 443 ]; do [ $netwait -gt 12 ] && msg "Could not install apps. Check internet connection. Cancelling Setup." && exit 1 msg "Waiting for internet connectivity..." ((netwait++)) @@ -74,12 +74,8 @@ function install_lh_apps(){ done msg "Installing apps." konsole -e /bin/bash -i -c "sudo pacman -Syyy --noconfirm archlinux-keyring && sudo pacman -Syyy --noconfirm mythtv mythplugins-mytharchive mythplugins-mythmusic mythplugins-mythweb && flatpak install tv.plex.PlexHTPC --noninteractive --assumeyes && sudo flatpak override tv.plex.PlexHTPC --filesystem=/run/lirc/lircd" - #sudo pacman -Syyy --noconfirm archlinux-keyring - #sudo pacman -Syyy --noconfirm flatpak firefox glances mlocate mythtv mythplugins-mytharchive mythplugins-mythmusic mythplugins-mythweb ncdu x11vnc - #sudo pacman -Syyy --noconfirm mythtv mythplugins-mytharchive mythplugins-mythmusic mythplugins-mythweb status=$? [ $status -eq 1 ] && msg "Could not install apps. Check internet connection. Cancelling Setup." && exit 1 - #flatpak install tv.plex.PlexHTPC --noninteractive --assumeyes gen_lib_xml.py } @@ -122,6 +118,7 @@ function first_configure(){ # create media directory structure sudo mkdir -p /data/storage/disk0 sudo create_media_dirs.sh /data/storage/disk0 + sudo ln -s /data/storage/disk0/media/ /myth # setup DB sql_setup # run mythtv-setup diff --git a/linhes/linhes-system/myth_mtc.cron b/linhes/linhes-system/myth_mtc.cron deleted file mode 100644 index 6d70058..0000000 --- a/linhes/linhes-system/myth_mtc.cron +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash -MYTH_RUN_STATUS=1 -. /etc/systemconfig -. /etc/profile - -date=`date +%Y-%m-%d` -timestamp=`date +'%Y-%m-%d %H:%M'` -hostname=`hostname` -logFile="/var/log/${date}/${hostname}_myth_mtc.log" -log="logger -t myth_mtc -p local6.info" - -if [ ! -f $logFile ]; then - touch $logFile - echo "" | $log -fi - -#check logfile for Finished and if not run myth_mtc.py -if ! grep -q "Finished Maintenance" $logFile -then - - if ! grep -q "Finished checking size of MythTV home" $logFile - then - MYTHCONFDIR=/usr/share/mythtv unbuffer myth_mtc.py --check_home | $log - if [ $? = 0 ] - then - echo "" | $log - else - echo "Time Exceeded" | $log - exit - fi - fi - - if ! grep -q "Finished Optimize" $logFile - then - if [ $SystemType = Frontend_only ] - then - echo "Will not run Optimize on Frontend Only systems." | $log - echo "Finished Optimize" | $log - else - MYTHCONFDIR=/usr/share/mythtv unbuffer myth_mtc.py --optimize | $log - if [ $? = 0 ] - then - echo "" | $log - else - echo "Time Exceeded" | $log - exit - fi - fi - fi - - if ! grep -q "Finished Backup" $logFile && grep -q "Finished Optimize" $logFile - then - MYTHCONFDIR=/usr/share/mythtv unbuffer myth_mtc.py --backup | $log - if [ $? = 0 ] - then - echo "" | $log - else - echo "Time Exceeded" | $log - exit - fi - fi - - if ! grep -q "Finished Update" $logFile - then - MYTHCONFDIR=/usr/share/mythtv unbuffer myth_mtc.py --update | $log - if [ $? = 0 ] - then - echo "" | $log - else - echo "Time Exceeded" | $log - exit - fi - fi - - if grep -q "Finished checking size of MythTV home" $logFile && grep -q "Finished Optimize" $logFile && grep -q "Finished Backup" $logFile && grep -q "Finished Update" $logFile - then - echo "Finished Maintenance" | $log - fi -fi diff --git a/linhes/linhes-system/myth_mtc.py b/linhes/linhes-system/myth_mtc.py deleted file mode 100755 index 1a71aa9..0000000 --- a/linhes/linhes-system/myth_mtc.py +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/python -import sys, subprocess -import re -import socket -import os -import datetime,time -import shlex -sys.dont_write_bytecode = True - -try: - from MythTV import MythBE - mythtv = MythBE() -except: - mythtv = None - -#print mythtv.db.getSetting( 'Theme', socket.gethostname()) - -def get_timestamp(): - now = datetime.datetime.now() - date = (now.strftime('%Y-%m-%d %H:%M')) - return date - -def getFreePercentForDir(dir): - stats = os.statvfs(dir) - total = (stats.f_blocks) - avail = (stats.f_bavail) - return (total - avail) / float(total) - -def check_home(): - #get the mythtv home dir - sys.path.append('/usr/MythVantage/bin/') - config_file = "mv_config" - data_config = __import__(config_file, globals(), locals(), []) - - freePcent = getFreePercentForDir(data_config.MYTHHOME) - print(" Home directory percent used: " + str(freePcent * 100) + "%") - if float(freePcent) > .9: - print(" Home directory is greater than 90% used. Clearing caches...") - cmd = "/usr/bin/rm -rf " + data_config.MYTHHOME + "/.mythtv/{*cache,Cache-*,tmp/*,MythMusic/AlbumArt/*}" - subprocess.call(["sh", "-c", cmd]) - print(" Restarting mythfrontend...") - subprocess.call(["killall", "mythfrontend"]) - cmd = "/usr/bin/rm -rf " + data_config.MYTHHOME + "/.cache/*" - subprocess.call(["sh", "-c", cmd]) - cmd = "/usr/bin/rm -rf " + data_config.MYTHHOME + "/.plexht/userdata/Thumbnails/*" - subprocess.call(["sh", "-c", cmd]) - cmd = "/usr/bin/rm -rf " + data_config.MYTHHOME + "/.plexht/userdata/ThemeMusicCache/*" - subprocess.call(["sh", "-c", cmd]) - freePcent = getFreePercentForDir(data_config.MYTHHOME) - print(" Home directory percent used: " + str(freePcent * 100) + "%") - else: - print(" Home directory is less than 90% used. Not clearing caches.") - return 0 - -def optimize(): - try: - cursor = mythtv.db.cursor() - cursor.execute("SHOW tables") - result = cursor.fetchall() - except: - print("\n%s Problem getting tables from the database" %(get_timestamp())) - return 1 - ops=["REPAIR","OPTIMIZE","ANALYZE"] - for row in result: - ctable=row[0] - for op in ops: - print(" %s %s" %(op,ctable)) - cmd= "%s table %s" %(op,ctable) - cursor.execute(cmd) - return 0 - -def cleanup_inuseprograms(): - fourHoursAgo=datetime.datetime.today() - datetime.timedelta(hours=4) - cmd="DELETE FROM inuseprograms WHERE lastupdatetime < '%s';" %fourHoursAgo - try: - cursor = mythtv.db.cursor() - cursor.execute(cmd) - except: - print("\n%s Problem cleaning inuseprograms in database" %(get_timestamp())) - - -def bail_if_another_is_running(): - cmd = shlex.split("pgrep -u {} -f {}".format(os.getuid(), __file__)) - pids = subprocess.check_output(cmd).decode('utf-8').strip().split('\n') - if len(pids) > 1: - pids.remove("{}".format(os.getpid())) - print("Exiting! Found {} is already running (pids): {}".format( - __file__, " ".join(pids))) - raise SystemExit(1) - -def run_stuff(): - print("\n%s" %get_timestamp()) - - if (len(sys.argv) == 1) or ("--noidlecheck" in sys.argv) and (len(sys.argv) == 2): - runall = True - else: - runall = False - - if ("--noidlecheck" in sys.argv): - print("No system idle check will be done.") - idle = 0 - else: - idle = subprocess.call(["/usr/bin/python", "/usr/bin/idle.py"]) - - if not idle: - if ("--check_home" in sys.argv) or runall: - print("\n#######################################") - print("\n%s Checking size of MythTV home" %(get_timestamp())) - if not check_home(): - print("\nFinished checking size of MythTV home") - else: - return True - - if ("--optimize" in sys.argv) or runall: - print("\n#######################################") - print("\n%s Running Optimize" %(get_timestamp())) - if not optimize(): - print("\nFinished Optimize") - else: - return True - - if ("--backup" in sys.argv) or runall: - print("\n#######################################") - print("\n%s Running Backup" %(get_timestamp())) - if not os.system('/usr/bin/lh_system_backup_job'): - print("\nFinished Backup") - - if ("--update" in sys.argv) or runall: - print("\n#######################################") - print("\n%s Running System Update" %(get_timestamp())) - if not os.system('/usr/bin/lh_system_host_update'): - print("\nFinished Update") - - print("\n#######################################") - continue_loop=False - else: - continue_loop=True - return continue_loop - -#--------------------------------- -bail_if_another_is_running() -starttime=time.time() -ctin=True -while ctin: - cleanup_inuseprograms() - ctin=run_stuff() - if ctin: - print("\n%s Waiting 10 minutes before trying again." %(get_timestamp())) - time.sleep(600) - - current_time=time.time() - if (current_time - starttime) > 3000 : - ctin = False - print("\n%s Time Exceeded 50 minutes. Quitting.)" %(get_timestamp())) - exit(1) -- cgit v0.12