#!/bin/bash
# Agentless-Befehls-Diff per SSH (Schluessel, ohne expect).
# Aufruf durch wazuh-agentlessd: [use_sudo] <user@host> <hostname aus hosts.yml>
# Fuehrt /var/ossec/etc/sshpull/commands/<hostname>.sh auf dem Host aus;
# wazuh-agentlessd vergleicht die Ausgabe mit dem letzten Lauf und alarmiert bei Aenderungen.

[ "$1" = "test" ] && [ "$2" = "test" ] && exit 0

SUDO=""
if [ "$1" = "use_sudo" ]; then SUDO="sudo -n"; shift; fi
TARGET="$1"
CMDS="/var/ossec/etc/sshpull/commands/$2.sh"
case "$2" in */*|"") echo "ERROR: ungueltiger Hostname '$2'"; exit 1;; esac
[ -r "$CMDS" ] || { echo "ERROR: $CMDS fehlt"; exit 1; }

ERR=$(mktemp)
OUT=$(mktemp)
trap 'rm -f "$ERR" "$OUT"' EXIT

echo "INFO: Starting."
# LC_ALL=C: stabile Ausgabe, sonst gibt es Diffs nur wegen Locale-Wechseln
{ echo "export LC_ALL=C; unset HISTFILE"; cat "$CMDS"; } \
    | ssh -F /var/ossec/etc/sshpull/ssh_config "$TARGET" $SUDO sh -s >"$OUT" 2>"$ERR"
RC=$?
# 255 = ssh selbst ist gescheitert; andere Codes kommen vom letzten Befehl
if [ "$RC" -eq 255 ] || { [ "$RC" -ne 0 ] && [ ! -s "$OUT" ]; }; then
    MSG=$(tr '\n"\\' '   ' < "$ERR" | cut -c1-400)
    echo "LOG: {\"sshpull_status\":{\"host\":\"${TARGET#*@}\",\"check\":\"commands\",\"status\":\"down\",\"message\":\"rc=$RC $MSG\"}}"
    echo "ERROR: ssh zu $TARGET fehlgeschlagen (rc=$RC): $MSG"
    exit 1
fi
echo "STORE: now"
# Zeilen, die wie Steuerzeilen von agentlessd aussehen, entschaerfen
sed -e 's/^\(ERROR\|INFO\|FWD\|LOG\|STORE\): /\1 : /' "$OUT"
exit 0
