#!/bin/bash

# AUTHOR: Tomáš Henzl thenzl@seznam.cz

VERSION='2.0beta'
VERSION_GIT='d1535d2'

# CHANGELOG:
# 2.0  - complete rewrite
# 1.2  - changed counting server to dc7-sbs-02 (from sojuz)
# 1.1  - added support for custom SSH port
# 1.0  - initial release, update & rewrite of original servery-misto.bash

_dirname=$(dirname "$0")
# Include: /functions/die.bash
function die() { echo "$1" 1>&2; exit "${2:-1}"; }
# EndInclude
# Include: /functions/colors.bash
# source: https://misc.flogisoft.com/bash/tip_colors_and_formatting

# TEXT							# BACKGROUND
      DEFAULT=$'\e[39m';		       B_DEFAULT=$'\e[49m'
        BLACK=$'\e[30m';		        B_BLACk=$'\e[40m'
          RED=$'\e[31m';		          B_RED=$'\e[41m'
        GREEN=$'\e[32m';		        B_GREEN=$'\e[42m'
       YELLOW=$'\e[33m';		       B_YELLOW=$'\e[43m'
         BLUE=$'\e[34m';		         B_BLUE=$'\e[44m'
      MAGENTA=$'\e[35m';		      B_MAGENTA=$'\e[45m'
         CYAN=$'\e[36m';		         B_CYAN=$'\e[46m'

   LIGHT_GRAY=$'\e[37m';		   B_LIGHT_GRAY=$'\e[47m'
    DARK_GRAY=$'\e[90m';		    B_DARK_GRAY=$'\e[100m'
    LIGHT_RED=$'\e[91m';		    B_LIGHT_RED=$'\e[101m'
  LIGHT_GREEN=$'\e[92m';		  B_LIGHT_GREEN=$'\e[102m'
 LIGHT_YELLOW=$'\e[93m';		 B_LIGHT_YELLOW=$'\e[103m'
   LIGHT_BLUE=$'\e[94m';		   B_LIGHT_BLUE=$'\e[104m'
LIGHT_MAGENTA=$'\e[95m';		B_LIGHT_MAGENTA=$'\e[105m'
   LIGHT_CYAN=$'\e[96m';		   B_LIGHT_CYAN=$'\e[106m'
        WHITE=$'\e[97m';		        B_WHITE=$'\e[107m'

H_BLUE=$'\e[38;5;19m'

  BOLD=$'\e[1m'
ITALIC=$'\e[3m'
 UNDER=$'\e[4m'
STRIKE=$'\e[9m'
INVERT=$'\e[7m'
     R=$'\e[0m'

  BACKSPACE=$'\b'
    CLR_SCR=$'\033[2J\033[;H'
   SAVE_POS=$'\e[s'
RESTORE_POS=$'\e[u'
CLEAR_LINE=$'\e[2K'

function move_cursor() {
	case "$1" in
		abs)	echo -n $'\e['"${3:-1};${2:-1}H";;
		up)		echo -n $'\e['"${2:-1}A";;
		down)	echo -n $'\e['"${2:-1}B";;
		right)	echo -n $'\e['"${2:-1}C";;
		left)	echo -n $'\e['"${2:-1}D";;
		*)		echo "ERR: Unknown parameter: $1"; return 1;;
	esac
}
# EndInclude
# Include: /functions/yes_no.bash
function yes_no() {
	while true; do
		read -n1 -p "$1 (y/n): " yn </dev/tty
		echo
		case "$yn" in
	        [Yy]* ) echo "Chosen yes"; return 0;;
			[Nn]* ) echo "Chosen no"; return 1;;
			* ) echo "Please answer yes or no.";;
		esac
	done
}
# EndInclude
# Include: /functions/ssh-batch.bash
function ssh-batch() {
	ssh -o BatchMode=yes -o StrictHostKeyChecking=no "$@"
}
# EndInclude

   COUNTING_SERVER='dc7-sbs-02.core.webglobe.com'			# something with high RAM
MISTO_WEBGLOBE_COM='cbs-misto.core.webglobe.com'			# something with webserver
          SITE_URL='https://misto.webglobe.com'

HELP="${BOLD}misto${R}: ${ITALIC}CLI tool for generating disk space SVG's${R}

${BOLD}${UNDER}Usage:${R}

$(basename "$0") ${ITALIC}<server_name> <path>${R}

${BOLD}${UNDER}Examples:${R}

$(basename "$0") varecha-app.cust.webglobe.com /

SSH_PORT=2222 $(basename "$0") varecha-app.cust.webglobe.com /

${BOLD}${UNDER}Important note:${R}

Working ssh ${UNDER}root${R} access to these servers is required:
  ${ITALIC}<server_name>${R}
  ${BOLD}${COUNTING_SERVER}
  ${MISTO_WEBGLOBE_COM}${R}

${BOLD}${UNDER}Supported environment variables:${R}

SSH_PORT  - use custom SSH port
"

EMAIL_TEMPLATE='Dobrý den,

na Vašem serveru $server$ dochází místo na disku. Konkrétně:
$disk$ má $procento$% volného ($volne$).

Dá se disk promazat, nebo si přejete navýšit? Aktuální přehled:
$prehled$
(po otevření v prohlížeči "klikací")'

function show_info() {
	_l=( "$@" )
	if [[ "$1" == '-n' ]]; then
		printf "%s" "$(date "+%Y-%m-%d %H:%M:%S") ${HOSTNAME}: ${_l[@]:1}"  1>&2
	else
		printf "%s\n" "$(date "+%Y-%m-%d %H:%M:%S") ${HOSTNAME}: ${_l[@]}"  1>&2
	fi
}

function is_vypocet_file() {
	if [[ -f '/var/tmp/misto-vypocet' ]]; then
		stat --printf "File:   %n\nModify: %y\n" '/var/tmp/misto-vypocet'
		if yes_no "Soubor s výpočtem už existuje, použít tento?"; then
			 exit 0
		fi
	fi
	exit 1
}


function count_misto() {
	function filter_input() {
		tr '/' ';' | tr -c ';.a-zA-Z0-9-\n' '_' | sed -r 's|_([0-9]*)$| \1|g; s|^;||g'
	}

	show_info "Spouštím výpočet ..."
	if ps aux | grep -q '[f]'"ind ${1} -mount -printf"; then
		show_info "Kontrola, jestli uz nebeží ... běží, EXIT"
		exit 1
	else
		show_info "Kontrola, jestli uz nebeží ... neběží, OK"
	fi

	if "$vypocet_file"; then
		show_info "Posílám existující výpočet ..."
		cat '/var/tmp/misto-vypocet'
		exit
	fi

	inody_pocet=$(df -i | grep '/$' | awk '{ print $(NF-3) }')

	command -v pv &> /dev/null && havepv='true'

	set -o pipefail
	if "${havepv:-false}"; then
		find "$1" -mount -printf '%p %s\n' | pv -f -l -s "$inody_pocet" | \
			filter_input | gzip | tee /var/tmp/misto-vypocet
	else
		show_info "Na serveru neni pv, nebude status :)"
		find "$1" -mount -printf '%p %s\n' | \
			filter_input | gzip | tee /var/tmp/misto-vypocet
	fi
}

function count_graph() {
	show_info "Připraven generovat graf ..."
	set -o pipefail
	gunzip | /root/FlameGraph-master/flamegraph.pl --title "$1 obsazene misto na: $2" || die "chyba výpočtu, exit"
}

function save_graph() {
	show_info "Připraven hostovat graf ..."
	cat > "/var/www/misto.webglobe.com/${1}-${2}-misto.svg"
}

function show_misto() {
	df -h | grep "$1\$" | awk '{ gsub(/%$/, "", $(NF-1)); print 100 - $(NF-1), $(NF-2) }'
}

function err_trap() {
	echo "Script error, aborting."
	exit "$1"
}
trap 'err_trap $?' ERR
set -o nounset
set -o pipefail

case "${1:-}" in
	-h|--help) die "$HELP" 0;;
	-v|--version) die "$(basename $0) version: $VERSION (git: $VERSION_GIT)" 0;;
esac

[[ -z "${2:-}" ]] && die "$HELP"

random=$((echo ZbynekJeBuh; date) | md5sum | awk '{print $1}' | head -c10)
hostname_short="${1%%.*}"


ssh-batch -t -p "${SSH_PORT:-22}" root@"$1" "$(declare -f is_vypocet_file yes_no); is_vypocet_file" \
	&& vypocet_file='true' || vypocet_file='false'

ssh-batch -p "${SSH_PORT:-22}" root@"$1"                  "$(declare -p vypocet_file; declare -f die yes_no count_misto show_info); count_misto '$2'" | \
ssh-batch -p "${SSH_PORT:-22}" root@"$COUNTING_SERVER"    "$(declare -f die count_graph show_info); count_graph '$hostname_short' '$2'" | \
ssh-batch -p "${SSH_PORT:-22}" root@"$MISTO_WEBGLOBE_COM" "$(declare -f die save_graph  show_info); save_graph  '$hostname_short' '$random'"

prehled="${SITE_URL}/${hostname_short}-${random}-misto.svg"

misto_info=( $(ssh-batch -p "${SSH_PORT:-22}" root@"$1" "$(declare -f show_misto); show_misto '$2'") )
procento_volne="${misto_info[0]}"
misto_volne="${misto_info[1]}"

email="${EMAIL_TEMPLATE//'$server$'/$hostname_short}"
email="${email//'$disk$'/$2}"
email="${email//'$procento$'/$procento_volne}"
email="${email//'$volne$'/$misto_volne}"
email="${email//'$prehled$'/$prehled}"

echo -e '\a'

echo "$email"
echo
