#!/bin/bash

#
# Name:         rsb-pam-acct.sh
# Version:      1.0.0
# Description:  Track PAM login events.
#
# /etc/pam.d/common-session
# .....
# session optional pam_exec.so seteuid /usr/local/sbin/rsb-pam-acct.sh
# .....
#
# (c) 2023, Rapidseedbox, alexey@rapidseedbox.com
#

set -o pipefail

export PATH=/usr/sbin:/usr/bin:/sbin:/bin

SC_NAME="$( basename "${0}" )"
SC_VER="$( grep -m 1 -E '^#\s*Version:\s+' "${0}" | awk '{print $NF}' )"

[ -z "${XDG_SESSION_ID}" ] && exit 0

which sqlite3 > /dev/null 2>&1 || exit 0

# -- Skip some services
case "${PAM_SERVICE}" in
  "cron")
      exit 0
      ;;
esac

HOSTNAME="$( hostname )"

STATS_DIR="/var/db/rsb"
[ ! -d "${STATS_DIR}" ] && mkdir -p "${STATS_DIR}"
STATS_DB="${STATS_DIR}/pam.db"

#env >> "${STATS_DIR}/pam-debug.log"
#set >> "${STATS_DIR}/pam-debug.log"

if [ ! -e "${STATS_DB}" ] ; then
    sqlite3 "${STATS_DB}" <<EOF
CREATE TABLE version ( 
    id TEXT
);
INSERT INTO version ( id ) VALUES ( "${SC_VER}" );
CREATE TABLE session(
    id                INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    PAM_TTY           TEXT,
    PAM_USER          TEXT,
    XDG_SESSION_TYPE  TEXT,
    PAM_RHOST         TEXT,
    PAM_SERVICE       TEXT,
    XDG_SESSION_CLASS TEXT,
    XDG_SESSION_ID    TEXT,
    SSH_AUTH_INFO_0   TEXT,
    SESSION_START     INTEGER,
    SESSION_END       INTEGER
    );
EOF
fi

case "${PAM_TYPE}" in
  "open_session")
      _tstamp="$( date -u '+%s' )"
      SSH_AUTH_INFO=""
      [ -n "${SSH_AUTH_INFO_0}" ] \
          && SSH_AUTH_INFO="$( awk '{print $1}' <<< "${SSH_AUTH_INFO_0}" )"
      sqlite3 "${STATS_DB}" \
          "INSERT INTO session \
              ( PAM_TTY, PAM_USER, XDG_SESSION_TYPE, PAM_RHOST, PAM_SERVICE, \
                XDG_SESSION_CLASS, XDG_SESSION_ID, SSH_AUTH_INFO_0, \
                SESSION_START, SESSION_END )
           VALUES \
              ( '${PAM_TTY}', '${PAM_USER}', '${XDG_SESSION_TYPE}', '${PAM_RHOST}', '${PAM_SERVICE}', \
                '${XDG_SESSION_CLASS}', '${XDG_SESSION_ID}', '${SSH_AUTH_INFO}', \
                ${_tstamp}, 0 );"

      ;;
  "close_session")
      _tstamp="$( date -u '+%s' )"
      sqlite3 "${STATS_DB}" \
          "UPDATE session \
              SET SESSION_END = ${_tstamp} \
              WHERE XDG_SESSION_ID = '${XDG_SESSION_ID}';"
      ;;
esac  

exit 0
