#!/bin/bash

export LC_ALL=C

# Check tritcask data readability
# Check whether syncdaemon is running
# Check whether syncdaemon is connected

LOG_DIRECTORIES="$HOME/.cache/sso \
                 $HOME/.cache/ubuntuone/log"

DIAG_HOME_ECRYPTFS=no
DIAG_TRITCASK_READABLE=yes
DIAG_SYNCDAEMON_RUNNING=no
DIAG_SYSTEMWIDE_PYTHON=no

SYNCDATEMON_CONFIG="$HOME/.config/ubuntuone/syncdaemon.conf"
TRITCASK_FOLDER="$HOME/.local/share/ubuntuone/syncdaemon/tritcask"
UBUNTU_ONE_ROOT="$HOME/Ubuntu One"

function report {
    echo "Stage: $DIAG_STAGE"
    echo "Report:"
    echo "    Is user home encrypted? $DIAG_HOME_ECRYPTFS"
    echo "    Is metadata readable? $DIAG_TRITCASK_READABLE"
    echo "    Is syncdaemon running? $DIAG_SYNCDAEMON_RUNNING"

    TEMPDIR=$(mktemp -d)
    mkdir "$TEMPDIR/meta"

    echo "Collecting logs..."
    . $HOME/.config/user-dirs.dirs

    set | grep ^DIAG_ > "$TEMPDIR/meta/diag.txt"

    dmesg > "$TEMPDIR/meta/dmesg.txt"

    dpkg -l 'ubuntuone-*' > "$TEMPDIR/meta/ubuntuone-versions.txt"
    dpkg -l 'ubuntu-sso-*' > "$TEMPDIR/meta/ubuntu-sso-versions.txt"

    lsb_release -a > "$TEMPDIR/meta/system-release.txt"

    python -c 'import sys; print "\n".join(sys.path)' > "$TEMPDIR/meta/pythonpath.txt"

    which nm-tool >/dev/null 2>&1 && nm-tool > "$TEMPDIR/meta/nm-tool.txt" 2>&1

    df -h > "$TEMPDIR/meta/disk.txt"

    GS_PROXY_MODE=$(gsettings get org.gnome.system.proxy mode)
    GS_PROXY_HTTP_ENABLED=$(gsettings get org.gnome.system.proxy.http enabled)
    GS_PROXY_HTTP_HOST=$(gsettings get org.gnome.system.proxy.http host)
    GS_PROXY_HTTPS_HOST=$(gsettings get org.gnome.system.proxy.https host)

    (echo "GSettings:"
     echo "Proxy mode: $GS_PROXY_MODE"
     echo "HTTP Proxy enabled: $GS_PROXY_HTTP_ENABLED"
     echo "HTTP Proxy host: $GS_PROXY_HTTP_HOST"
     echo "HTTPS Proxy host: $GS_PROXY_HTTPS_HOST"
     echo 
     echo "Environment:"
     echo "http_proxy: $http_proxy $HTTP_PROXY"
     echo "https_proxy: $https_proxy $HTTPS_PROXY"
    ) > "$TEMPDIR/meta/proxy-settings.txt"

    if [ -f "$SYNCDATEMON_CONFIG" ]; then
        cp "$SYNCDATEMON_CONFIG" "$TEMPDIR/meta/"
    fi

    TARGET_DIR=${XDG_DESKTOP_DIR:-/tmp}
    LOG_FILENAME=$(date +ubuntuone-logs-%Y-%m-%d-%s.tar.gz)

    ARCHIVE_PATH="$TARGET_DIR/$LOG_FILENAME"

    cd "$TEMPDIR"

    tar cfz "$ARCHIVE_PATH" $LOG_DIRECTORIES meta
    rv=$?
    if [ "$rv" != "0" ]; then
        echo "Failed to create log archive: $rv"
    else
        echo "The log archive was created at $ARCHIVE_PATH"
    fi

    rm -r "$TEMPDIR"
}

trap report EXIT

DIAG_STAGE="Python check"
DIAG_PYTHON_PATH=`which python`
if [ "$DIAG_PYTHON_PATH" == "/usr/bin/python" ]; then
    DIAG_SYSTEMWIDE_PYTHON=yes
else
    echo "Ubuntu SSO may fail - non system-wide python:"
    echo "https://launchpad.net/bugs/711162"
fi

DIAG_STAGE="eCryptFS check"

mount | grep -q "$HOME type ecryptfs"
rv=$?

if [ "$rv" == "0" ]; then
    DIAG_HOME_ECRYPTFS=yes
fi

DIAG_STAGE="Ubuntu One root check"

if [ ! -d "$UBUNTU_ONE_ROOT" ]; then
    echo "$UBUNTU_ONE_ROOT does not exist. Exiting."
    exit
fi

DIAG_STAGE="Tritcask check"

TRITCASK_FILES=`find $TRITCASK_FOLDER -type f`;
READ_START=`date +%s`
for X in $TRITCASK_FILES; do
    # Try reading the whole file
    cat $X > /dev/null
    rv=$?
    if [ "$rv" != "0" ]; then
        echo "$X is unreadable"
        DIAG_TRITCASK_READABLE=no
        exit
    fi
done
READ_END=`date +%s`
DIAG_TRITCASK_READ_TIME=$(($READ_END - $READ_START))

DIAG_STAGE="Syncdaemon state check"
DIAG_SYNCDAEMON_STATUS=$(dbus-send --print-reply=literal --reply-timeout=1000 \
    --dest=com.ubuntuone.SyncDaemon /status \
    com.ubuntuone.SyncDaemon.Status.current_status)
rv=$?
if [ "$rv" == "0" ]; then
    DIAG_SYNCDAEMON_RUNNING=yes
fi

DIAG_STAGE="All checks completed"

