#!/bin/bash

# Снять треддамп по pid в упакованном формате и записать в лог
# Если на вход приходит не pid, а pid-файл - читаем пид из него.
# Если прочитали pid switchman-а - ищем его потомка

set -e

USAGE="Usage: $0 <service-name> [ <pid> | <pid-file> ]"
SERVICE="${1?$USAGE}"
PID="${2?$USAGE}"

if test -z $DEPLOY_WORKLOAD_ID; then
    pipe_cmd=true
    iterations=1
else
    pipe_cmd='/usr/local/bin/uaclient --logger_name JAVA_THREADDUMP.log --uri localhost:16400'
    iterations=2000
fi

for i in `seq 1 "$iterations"`; do

if [[ ! "$PID" =~ ^[0-9]+$ ]]; then
    if [ -f "$PID" ] ; then
        PID=$(cat "$PID")
    else
        exit 1
    fi
fi

if [[ -z "$PID" ]]; then
    exit 1
fi

COMM=$(ps -h -o comm --pid "$PID"|awk '{print $1}')
if [[ -z "$COMM" ]]; then
    exit 1
elif [[ "$COMM" == "finish" ]]; then
    # runit finish script
    exit 1
elif [[ "$COMM" == "switchman" ]]; then
    PID=$(ps -h -o pid --ppid "$PID"|awk '{print $1}')
fi

datetime=$(date +%Y-%m-%d:%T)
date=${datetime:0:4}${datetime:5:2}${datetime:8:2}

LOG="/var/log/yandex/java-threaddump.log.$date"

set -o pipefail
dump=$(/usr/local/bin/jattach "$PID" threaddump | gzip | base64 -w0)

if [ $? -eq 0 ]; then
    if test -z $DEPLOY_WORKLOAD_ID; then
    flock -x $LOG echo "$datetime $(hostname -f) $PID $SERVICE $dump" >> $LOG
    else
    flock -x $LOG echo "$datetime $(hostname -f) $PID $SERVICE $dump"
    fi
fi

if [ "$i" -lt "$iterations" ]; then
    sleep 60
fi

done | $pipe_cmd
