#!/bin/bash

# Dumps disk usage to stdout or to the file
#
# Parameters:
# - $1 (optional): Filename to append the output to.
#
# Usage:
# - Dump disk usage to stdout:
#   ./disk-usage-dump.sh
#
# - Dump disk usage appending to th file:
#   ./disk-usage-dump.sh my-log-file.log
#
# Use docker container to get root (script can be run under regular user, no
# need for sudo)

dump () {
    echo
    echo "### Disk usage dump at $(date) ###"

    # Free disk space
    echo
    df -h /home/user

    # Root dirs
    echo
    echo "Root dirs:"
    docker run -v /:/host-root alpine:3.15.0 sh -c 'du -hs /host-root/*' | sed 's#/host-root##'

    # Home dirs
    echo
    echo "Home dirs:"
    docker run -v /home/user:/home/user alpine:3.15.0 du -hs /home/user/*

    # Skynet webportal dirs
    echo
    echo "skynet-webportal dirs:"
    docker run -v /home/user:/home/user alpine:3.15.0 du -hs /home/user/skynet-webportal/*

    # Docker data dirs
    echo
    echo "Docker data dirs:"
    docker run -v /home/user:/home/user alpine:3.15.0 du -hs /home/user/skynet-webportal/docker/data/*

    # Largest dirs/files
    echo
    echo "Dirs or files over 1GB (first 100):"
    docker run -v /home/user:/home/user alpine:3.15.0 du -h /home/user | grep -E "^[0-9]+\.?[0-9]*G" | sort -r -n | head -100
}

# Check argument is present
if [ -z "$1" ]; then
    # Dump to stdout
    dump
else
    # Handle log paths
    filename=$(basename "$1")
    dirname=$(dirname "$1")
    abs_dirname=$(realpath "$dirname")

    # Make sure log dir exists
    mkdir -p "$abs_dirname"

    # Append to file
    {
        dump
    } >> "$abs_dirname/$filename" 2>&1
fi
