diff options
Diffstat (limited to 'abs')
| -rwxr-xr-x | abs/core/LinHES-system/PKGBUILD | 5 | ||||
| -rwxr-xr-x | abs/core/LinHES-system/balance_storage.py | 137 | 
2 files changed, 140 insertions, 2 deletions
| diff --git a/abs/core/LinHES-system/PKGBUILD b/abs/core/LinHES-system/PKGBUILD index 6b8670c..67f0c19 100755 --- a/abs/core/LinHES-system/PKGBUILD +++ b/abs/core/LinHES-system/PKGBUILD @@ -1,6 +1,6 @@  pkgname=LinHES-system  pkgver=8.3 -pkgrel=13 +pkgrel=14  arch=('i686' 'x86_64')  install=system.install  pkgdesc="Everything that makes LinHES an automated system" @@ -17,7 +17,7 @@ binfiles="LinHES-start optimize_mythdb.py myth_mtc.py   install_supplemental_service.sh get_airplay_key importfiles.sh   lh_system_backup lh_system_backup_job lh_system_restore_job   lh_system_host_update lh_system_all_host_update - add_storage.py diskspace.sh cacheclean lh_backend_control.sh + add_storage.py balance_storage.py diskspace.sh cacheclean lh_backend_control.sh   create_media_dirs.sh msg_client.py msg_daemon.py mythvidexport.py   gen_is_xml.py gen_lib_xml.py gen_light_include.py gen_game_xml.py   misc_recent_recordings.pl misc_status_config.py misc_status_info.sh @@ -98,6 +98,7 @@ md5sums=('76842f8cff548d2c1289e0992a8b84dd'           '74e17d6f7453c52d56fecaed5c3f6ad5'           '47e093e8cfe4b5b96602358e1f540832'           '63bbc62240f46a9997eaae4a84b09b76' +         '2aa1a285161c8bf3e2ab16ca9e511b00'           '2c005d95312018bef80092136f80f254'           'c8db6a83ecc089ea37ab7fcb0f7a01cf'           'ca63946920ba33de1f15abda83e74e40' diff --git a/abs/core/LinHES-system/balance_storage.py b/abs/core/LinHES-system/balance_storage.py new file mode 100755 index 0000000..a6995ca --- /dev/null +++ b/abs/core/LinHES-system/balance_storage.py @@ -0,0 +1,137 @@ +#!/usr/bin/python2 + +import argparse, glob, operator, os, random, shutil, subprocess, sys, signal +shouldQuit = False + +def getFreeSpaceForDir(dir): +    stats = os.statvfs(dir) +    return (stats.f_bavail * stats.f_frsize) + +def getFreePercentForDir(dir): +    stats = os.statvfs(dir) +    total = (stats.f_blocks) +    avail = (stats.f_bavail) +    return (total - avail) / float(total) + +def getFileSize(fullPath): +    return os.path.getsize(fullPath) + +def sizeof_fmt(num, suffix='B'): +    for unit in ['','Ki','Mi','Gi','Ti','Pi','Ei','Zi']: +        if abs(num) < 1024.0: +            return "%3.1f %s%s" % (num, unit, suffix) +        num /= 1024.0 +    return "%.1f %s%s" % (num, 'Yi', suffix) + +def signal_handler(signal, frame): +    print "\nWill quit when file has been moved.\nMoving File..." +    global shouldQuit +    shouldQuit = True + +if __name__ == '__main__': +    parser = argparse.ArgumentParser() +    parser.add_argument('-c', '--checkonly', action='store_true', help="Check only, don't move any files.") +    parser.add_argument('-p', '--percent', type=int, default=7, help="The percentage difference between the most full dir and least full dir that will stop balancing.") +    cmdargs = parser.parse_args() + +    SGDIRS = [] +    SGgrp = "Default" + +    signal.signal(signal.SIGINT, signal_handler) + +    print "\nBalance MythTV Storage Group Directories\nPress Ctrl+C to quit" + +    # Get Storage Groups from MythDB +    try: +        from MythTV import MythDB +        mythDB = MythDB() +        records = mythDB.getStorageGroup() +    except: +        print "Couldn't connect to MythTV database." +        sys.exit(1) + +    # Get Storage Group directories +    for record in records: +        if record.groupname == SGgrp: +            dirname = record.dirname +            SGDIRS.append(dirname) + +    # If there are less than 2 directories defined bail as we can't move anything +    if len(SGDIRS) < 2: +        print "There are less than 2 directories defined. Exiting." +        sys.exit(0) + +    while not shouldQuit: +        SGDIRSdata = [] +        print "\n------------------------------------------------" +        print "'" + SGgrp + "' Storage Group Directories - Percent Used:" +        # Get percent free and size free +        for directory in SGDIRS: +            # Check if SG path exists +            if not os.path.exists(directory): +                print "  " + directory + " - Not Mounted" +                continue +            freePcent = getFreePercentForDir(directory) +            freeSize = getFreeSpaceForDir(directory) +            # Check if SG has any mpg or nuv files and if so add to SGDIRSdata +            if len(glob.glob1(directory,"*.mpg")) or len(glob.glob1(directory,"*.nuv")): +                SGDIRSdata.append([directory, freePcent, freeSize]) +                print "  " + directory + " - " + str(freePcent * 100) + "%" + +        # Sort data on percent free +        SGDIRSdata = sorted(SGDIRSdata, reverse=True, key=operator.itemgetter(1)) +        #print SGDIRSdata +        mostFull = SGDIRSdata[0] +        leastFull = SGDIRSdata[-1] + +        print "------------------------------------------------" +        print "Most Used Storage Group Directory: " +        print "  " + str(mostFull[0]) + " - " + str(mostFull[1] * 100) + "%" +        print "Least Used Storage Group Directory: " +        print "  " + str(leastFull[0]) + " - " + str(leastFull[1] * 100) + "%" + +        # Check if mostFull and leastFull are within the percent var of each other +        if mostFull[1] - (float(cmdargs.percent) / 100) < leastFull[1]: +            print "\nThe most used and least used storage group directories are\nwithin " + str(cmdargs.percent) + "% used of each other. No files will be moved." +            sys.exit() + +        # Get random file from most used dir +        fileToMove = random.choice([f for f in os.listdir(mostFull[0]) if f.endswith(".mpg") or f.endswith(".nuv")]) +        fileToMove = mostFull[0] + "/" + fileToMove + +        # Check that the file isn't too big for least used dir +        fileSize = getFileSize(fileToMove) +        if (fileSize > getFreeSpaceForDir(leastFull[0])): +            # Too big to move +            print fileToMove + " is too big to move to " + leastFull[0] +            sys.exit() + +        print "------------------------------------------------" +        print "Move File:" +        print "  " + fileToMove +        print "  Size: " + sizeof_fmt(os.path.getsize(fileToMove)) +        print "To:" +        print "  " + leastFull[0] +        print "  Available: " + sizeof_fmt(getFreeSpaceForDir(leastFull[0])) + +        # Move file +        if cmdargs.checkonly: +            print "------------------------------------------------" +            print"Check Only option was used. No files were moved." +            shouldQuit = True +        else: +            print "------------------------------------------------" +            print "Checking System Status..." +            if subprocess.call(["/usr/bin/python2", "/usr/LH/bin/idle.py", "-s"]): +                print "  System is busy. The file will not be moved." +                sys.exit() +            print "Moving File..." +            shutil.move(fileToMove, leastFull[0]) + +            # Remove png files +            print "------------------------------------------------" +            print "Removing png Files:" +            pngFiles = glob.glob(fileToMove + "*.png") +            for p in pngFiles: +                os.remove(p) +                print "  " + p | 
