#!/usr/bin/python3

#
# Imports
#
import sys
import time
import subprocess
import argparse


#
# Methods
#
def get_disk_usage(path, human_readable):
    """disk usage in human readable format (e.g. '2,1GB')"""
    arguments = "-sh" if human_readable else "-s"
    command = "du %s %s" % (arguments, path)
    status, output = subprocess.getstatusoutput(command)

    if status != 0:
        raise Exception(command)

    disk_usage = output.split()[0]
    if not human_readable:
        # du reports in units of 1024 bytes, convert to plain number of bytes
        disk_usage = int(disk_usage) * 1024
    return disk_usage


#
# Directories to scan
#
hostname = 'shuttle'
interval = 10
directories = [
    ['rik',         '/media/data/Personal/Rik'],
    ['books',       '/media/data/Shared/Books'],
    ['games',       '/media/data/Shared/Games'],
    ['misc',        '/media/data/Shared/Miscellaneous'],
    ['shows',       '/media/data/Shared/Video/Shows'],
    ['movies',      '/media/data/Shared/Video/Movies'],
    ['music',       '/media/data/Shared/Music'],
    ['photographs', '/media/data/Shared/Photographs'],
    ['pictures',    '/media/data/Shared/Pictures'],
    ['software',    '/media/data/Shared/Software']
]

#
# Command line arguments
#
parser = argparse.ArgumentParser(description="Get DU disk usage")
parser.add_argument("-s", action="store_true", help="print in human readable format")
args = parser.parse_args()
human_readable = args.s


#
# Main
#
if human_readable:
    for (name, path) in directories:
        disk_usage = get_disk_usage(path, human_readable)
        print(("%s: %s" % (name, disk_usage)))
else:
    # RRD mode
    while True:
        for (name, path) in directories:
            disk_usage = get_disk_usage(path, human_readable)
            timestamp = int(time.time())
            size = float(disk_usage)
            print(
                (
                    "PUTVAL {}/exec-du_{}/gauge-size {}:{:.1f}".format(
                        hostname, name, timestamp, size
                    )
                )
            )
            sys.stdout.flush()
        time.sleep(interval)
