Skip to content

Instantly share code, notes, and snippets.

@vinitkumar
Created May 8, 2026 07:09
Show Gist options
  • Select an option

  • Save vinitkumar/aaf3e86709deaa3cfea1e89f6ad68951 to your computer and use it in GitHub Desktop.

Select an option

Save vinitkumar/aaf3e86709deaa3cfea1e89f6ad68951 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
set -euo pipefail
OUT="active-user-debug-$(hostname)-$(date +%Y%m%d-%H%M%S).log"
exec > >(tee "$OUT") 2>&1
echo "=== Host Info ==="
date -Is
hostnamectl || true
echo "kernel: $(uname -a)"
echo "whoami: $(whoami)"
echo "id: $(id)"
echo
echo "=== Binary Presence ==="
command -v loginctl || true
command -v who || true
command -v jq || true
echo
echo "=== who ==="
who || true
echo
echo "=== loginctl list-sessions (table) ==="
loginctl list-sessions || true
echo
echo "=== loginctl list-sessions (json) ==="
SESS_JSON="$(loginctl list-sessions --output=json 2>/dev/null || true)"
echo "$SESS_JSON"
echo
echo "=== Per-session details (raw) ==="
if [[ -n "${SESS_JSON}" ]] && command -v jq >/dev/null 2>&1; then
echo "$SESS_JSON" | jq -c '.[]' | while read -r s; do
sid="$(echo "$s" | jq -r '.session // empty')"
user="$(echo "$s" | jq -r '.user // empty')"
tty="$(echo "$s" | jq -r '.tty // empty')"
seat="$(echo "$s" | jq -r '.seat // empty')"
echo "--- session=$sid user=$user tty=$tty seat=$seat ---"
loginctl show-session "$sid" \
--property=Id \
--property=Name \
--property=User \
--property=Active \
--property=State \
--property=Remote \
--property=Type \
--property=Class \
--property=Seat \
--property=TTY \
--property=Display \
--property=Leader || true
echo
done
else
echo "No JSON sessions or jq missing."
fi
echo "=== Emulate current LoggedInUsers logic ==="
CURRENT_MATCH=""
if [[ -n "${SESS_JSON}" ]] && command -v jq >/dev/null 2>&1; then
while IFS= read -r s; do
sid="$(echo "$s" | jq -r '.session // empty')"
user="$(echo "$s" | jq -r '.user // empty')"
tty="$(echo "$s" | jq -r '.tty // empty')"
seat="$(echo "$s" | jq -r '.seat // empty')"
# Mirrors app/models/logged_in_users.rb console_session?
is_console="false"
if [[ -n "$seat" ]]; then
if [[ -z "$tty" || "$tty" == tty* ]]; then
is_console="true"
fi
fi
if [[ "$is_console" == "true" ]]; then
info="$(loginctl show-session "$sid" --property=Active --property=Name 2>/dev/null || true)"
if echo "$info" | grep -Eq '^Active=(yes|Yes)$'; then
CURRENT_MATCH="$user"
echo "matched_current_logic_session=$sid user=$user"
break
fi
fi
done < <(echo "$SESS_JSON" | jq -c '.[]')
fi
echo "current_logic_active_display_user='${CURRENT_MATCH}'"
echo
echo "=== Emulate robust logic (Active=yes OR State=active) ==="
ROBUST_MATCH=""
if [[ -n "${SESS_JSON}" ]] && command -v jq >/dev/null 2>&1; then
while IFS= read -r s; do
sid="$(echo "$s" | jq -r '.session // empty')"
user="$(echo "$s" | jq -r '.user // empty')"
seat="$(echo "$s" | jq -r '.seat // empty')"
tty="$(echo "$s" | jq -r '.tty // empty')"
if [[ -n "$seat" || -n "$tty" ]]; then
info="$(loginctl show-session "$sid" --property=Active --property=State --property=Name --property=Remote 2>/dev/null || true)"
active="$(echo "$info" | awk -F= '/^Active=/{print tolower($2)}')"
state="$(echo "$info" | awk -F= '/^State=/{print tolower($2)}')"
remote="$(echo "$info" | awk -F= '/^Remote=/{print tolower($2)}')"
name="$(echo "$info" | awk -F= '/^Name=/{print $2}')"
if [[ "$name" == "$user" && "$remote" != "yes" && ( "$active" == "yes" || "$state" == "active" ) ]]; then
ROBUST_MATCH="$user"
echo "matched_robust_logic_session=$sid user=$user active=$active state=$state remote=$remote"
break
fi
fi
done < <(echo "$SESS_JSON" | jq -c '.[]')
fi
echo "robust_logic_active_display_user='${ROBUST_MATCH}'"
echo
echo "=== done ==="
echo "saved_log=$OUT"
@vinitkumar
Copy link
Copy Markdown
Author

#!/usr/bin/env bash
set -euo pipefail

OUT="active-user-debug-$(hostname)-$(date +%Y%m%d-%H%M%S).log"

exec > >(tee "$OUT") 2>&1

echo "=== Host Info ==="
date -Is
hostnamectl || true
echo "kernel: $(uname -a)"
echo "whoami: $(whoami)"
echo "id: $(id)"
echo

echo "=== Binary Presence ==="
command -v loginctl || true
command -v who || true
command -v jq || true
echo

echo "=== who ==="
who || true
echo

echo "=== loginctl list-sessions (table) ==="
loginctl list-sessions || true
echo

echo "=== loginctl list-sessions (json) ==="
SESS_JSON_RAW="$(loginctl list-sessions --output=json 2>/dev/null || true)"
SESS_JSON=""
if command -v jq >/dev/null 2>&1 && [[ -n "$SESS_JSON_RAW" ]] && echo "$SESS_JSON_RAW" | jq -e . >/dev/null 2>&1; then
  SESS_JSON="$SESS_JSON_RAW"
  echo "$SESS_JSON"
else
  echo "loginctl JSON output is unavailable or invalid, attempting table fallback."
  echo "raw_json_output:"
  echo "$SESS_JSON_RAW"
  echo
  SESS_TABLE="$(loginctl list-sessions --no-legend --no-pager 2>/dev/null || true)"
  echo "fallback_table_output:"
  echo "$SESS_TABLE"
  if command -v jq >/dev/null 2>&1 && [[ -n "$SESS_TABLE" ]]; then
    SESS_JSON="$(
      printf '%s\n' "$SESS_TABLE" \
        | awk 'NF >= 1 { print $1 "|" $3 "|" $4 "|" $5 }' \
        | jq -R -s '
          split("\n")
          | map(select(length > 0))
          | map(split("|"))
          | map({
              session: (.[0] // ""),
              user: (.[1] // ""),
              seat: (.[2] // ""),
              tty: (.[3] // "")
            })
        '
    )"
    echo
    echo "constructed_fallback_json:"
    echo "$SESS_JSON"
  fi
fi
echo

echo "=== Per-session details (raw) ==="
if [[ -n "${SESS_JSON}" ]] && command -v jq >/dev/null 2>&1 && echo "$SESS_JSON" | jq -e . >/dev/null 2>&1; then
  echo "$SESS_JSON" | jq -c '.[]' | while read -r s; do
    sid="$(echo "$s" | jq -r '.session // empty')"
    user="$(echo "$s" | jq -r '.user // empty')"
    tty="$(echo "$s" | jq -r '.tty // empty')"
    seat="$(echo "$s" | jq -r '.seat // empty')"
    echo "--- session=$sid user=$user tty=$tty seat=$seat ---"
    loginctl show-session "$sid" \
      --property=Id \
      --property=Name \
      --property=User \
      --property=Active \
      --property=State \
      --property=Remote \
      --property=Type \
      --property=Class \
      --property=Seat \
      --property=TTY \
      --property=Display \
      --property=Leader || true
    echo
  done
else
  echo "No valid session JSON available or jq missing."
fi

echo "=== Emulate current LoggedInUsers logic ==="
CURRENT_MATCH=""
if [[ -n "${SESS_JSON}" ]] && command -v jq >/dev/null 2>&1 && echo "$SESS_JSON" | jq -e . >/dev/null 2>&1; then
  while IFS= read -r s; do
    sid="$(echo "$s" | jq -r '.session // empty')"
    user="$(echo "$s" | jq -r '.user // empty')"
    tty="$(echo "$s" | jq -r '.tty // empty')"
    seat="$(echo "$s" | jq -r '.seat // empty')"

    # Mirrors app/models/logged_in_users.rb console_session?
    is_console="false"
    if [[ -n "$seat" ]]; then
      if [[ -z "$tty" || "$tty" == tty* ]]; then
        is_console="true"
      fi
    fi

    if [[ "$is_console" == "true" ]]; then
      info="$(loginctl show-session "$sid" --property=Active --property=Name 2>/dev/null || true)"
      if echo "$info" | grep -Eq '^Active=(yes|Yes)$'; then
        CURRENT_MATCH="$user"
        echo "matched_current_logic_session=$sid user=$user"
        break
      fi
    fi
  done < <(echo "$SESS_JSON" | jq -c '.[]')
fi
echo "current_logic_active_display_user='${CURRENT_MATCH}'"
echo

echo "=== Emulate robust logic (Active=yes OR State=active) ==="
ROBUST_MATCH=""
if [[ -n "${SESS_JSON}" ]] && command -v jq >/dev/null 2>&1 && echo "$SESS_JSON" | jq -e . >/dev/null 2>&1; then
  while IFS= read -r s; do
    sid="$(echo "$s" | jq -r '.session // empty')"
    user="$(echo "$s" | jq -r '.user // empty')"
    seat="$(echo "$s" | jq -r '.seat // empty')"
    tty="$(echo "$s" | jq -r '.tty // empty')"

    if [[ -n "$seat" || -n "$tty" ]]; then
      info="$(loginctl show-session "$sid" --property=Active --property=State --property=Name --property=Remote 2>/dev/null || true)"
      active="$(echo "$info" | awk -F= '/^Active=/{print tolower($2)}')"
      state="$(echo "$info" | awk -F= '/^State=/{print tolower($2)}')"
      remote="$(echo "$info" | awk -F= '/^Remote=/{print tolower($2)}')"
      name="$(echo "$info" | awk -F= '/^Name=/{print $2}')"

      if [[ "$name" == "$user" && "$remote" != "yes" && ( "$active" == "yes" || "$state" == "active" ) ]]; then
        ROBUST_MATCH="$user"
        echo "matched_robust_logic_session=$sid user=$user active=$active state=$state remote=$remote"
        break
      fi
    fi
  done < <(echo "$SESS_JSON" | jq -c '.[]')
fi
echo "robust_logic_active_display_user='${ROBUST_MATCH}'"
echo

echo "=== done ==="
echo "saved_log=$OUT"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment