#!/bin/bash
# eloquence cockpit integration
#
# (C) Copyright Marxmeier Software AG, 2026
# B.08.40 $Revision: 29.4 $
#
# This file is installed as /opt/eloquence/8.4/etc/eqcpfn
# It is referenced by the eloquence.js cockpit plugin
#

eq_ver=8.4
eq_v=84
eq_cfg=/etc/opt/eloquence/${eq_ver}
eq_bin=/opt/eloquence/${eq_ver}/bin

sqlr_ver=4.2
sqlr_v=42
sqlr_cfg=/etc/opt/sqlr/${sqlr_ver}
sqlr_bin=/opt/sqlr/${sqlr_ver}/bin

# config file for a unit
function cfg_file_by_unit
{
  p=${eq_cfg}
  case "$1" in
    eloqdb|eloqdb${eq_v}) cfg=eloqdb.cfg;;
    eloqdb@*|eloqdb${eq_v}@*) cfg="eloqdb-$(echo $1|sed s/.*@//g).cfg";;
    eloqsd|eloqsd${eq_v}) cfg=eloqsd.cfg;;
    dbrepl|dbrepl${eq_v}) cfg=repl.cfg;;
    dbrepl@*|dbrepl${eq_v}@*) cfg="repl-$(echo $1|sed s/.*@//g).cfg";;
    eloqwebd|eloqwebd${eq_v}) cfg=eloqwebd2.cfg;;
    eloqld|eloqld${eq_v}) cfg=eloqld.cfg;;
    sqlr|sqlr${sqlr_v}) p=${sqlr_cfg}; cfg=odbc.cfg;;
    sqlr@*|sqlr${sqlr_v}@*) p=${sqlr_cfg}; cfg="odbc-$(echo $1|sed s/.*@//g).cfg";;
  esac
  [ -n "$cfg" ] || exit 1
  [ -f "$p/$cfg" ] || exit 1
  echo $p/$cfg
}

# list eloquence units and instances
function list_all_units
{
  for l in eloqdb${eq_v} eloqsd${eq_v} eloqwebd${eq_v} dbrepl${eq_v} eloqld${eq_v}; do
    echo $l
  done

  (cd ${eq_cfg} && ls *-*.cfg 2>/dev/null) | 
   sed -s "s/.cfg//g" |
   sed -e "s/\(.*\)-\(.*\)/\1${eq_v}@\2/g" |
   sed -e "s/^repl${eq_v}@/dbrepl${eq_v}@/g" |
  while read l; do
    echo $l
  done
  
  if [ -d ${sqlr_cfg} ]; then
    echo sqlr${sqlr_v}

    (cd $sqlr_cfg && ls *-*.cfg 2>/dev/null) | 
     sed -s "s/.cfg//g" |
     sed -e "s/\(.*\)-\(.*\)/\1${sqlr_v}@\2/g" |
     sed -e "s/^odbc${sqlr_v}@/sqlr${sqlr_v}@/g" |
    while read l; do
      echo $l
    done
  fi
}

[ $# -gt 0 ] || exit 1
op="$1"; shift

case "$op" in

### init ###

  init)
    echo "uid" $(id --user)
    echo "gid" $(id --group)
    echo "groups" $(id --groups --name)
    [ -f ${eq_cfg}/license ] && echo "eq-license yes" || echo "eq-license no"
    if [ -d ${sqlr_cfg} ]; then
      echo "sqlr ${sqlr_ver}"
      [ -f $sqlr_cfg/license ] && echo "sqlr-license yes" || echo "sqlr-license no"
    fi
    echo "units" $(list_all_units)
    units=$(list_all_units)
    #echo "units $units"
    for u in $units; do
      e=$(systemctl is-enabled $u)
      a=$(systemctl is-active $u)
      echo "unit-status $u $e $a"
    done
    exit 0
    ;;

  unit-status-list)
    units=$(list_all_units)
    for u in $units; do
      e=$(systemctl is-enabled $u)
      a=$(systemctl is-active $u)
      echo "$u $e $a"
    done
    exit 0
    ;;
    
   
### license ###

  # license file

  eq-license)
    if [ ! -f ${eq_cfg}/license ]; then
      echo "No Eloquence license file present"
    else
      cat ${eq_cfg}/license
    fi
    ;;

  sqlr-license)
    if [ ! -f ${sqlr_cfg}/license ]; then
      echo "No SQLR ${sqlr_ver} license file present"
    else
      cat ${sqlr_cfg}/license
    fi
    ;;

  # check license status

  eq-chklic)
    if [ ! -f ${eq_cfg}/license ]; then
      echo "No Eloquence license file present"
    else
      ${eq_bin}/../etc/chklic 2>&1 | tail -n+5
    fi
    ;;

  sqlr-chklic)
    if [ ! -f ${sqlr_cfg}/license ]; then
      echo "No SQLR ${sqlr_ver} license file present"
    else
      ${sqlr_bin}/../etc/chklic 2>&1 | tail -n+5
    fi
    ;;

  # install license

  eq-tmplic)
    if [ ! -f ${eq_cfg}/license ]; then
      ${eq_bin}/eqlictool getlic temp 2>&1
    else
      echo "The Eloquence license file is already present"
    fi
    ;;

  sqlr-tmplic)
    if [ ! -f ${sqlr_cfg}/license ]; then
      ${sqlr_bin}/sqlictool getlic temp 2>&1
    else
      echo "The SQLR ${sqlr_ver} license file is already present"
    fi
    ;;

  eq-syslic)
    ${eq_bin}/eqlictool getlic system 2>&1
    ;;

  sqlr-syslic)
    ${sqlr_bin}/sqlictool getlic system 2>&1
    ;;


### target ###

#  eq-target-status)
#    list=$(systemctl --plain list-dependencies eloquence${eq_v}.target|tail -n+2)
#    [ -n "$list" ] && systemctl --all list-units $list | head -n -7
#    ;;

  eq-target-start | eq-target-stop | eq-target-restart)
    op=$(echo "$op" | sed -e "s/eq-target-//g")
    systemctl "$op" eloquence${eq_v}.target
    rc=$?
    [ $? == 0 ] && systemctl status eloquence${eq_v}.target
    if [ -f ${sqlr_cfg}/license ]; then
      echo
      systemctl "$op" sqlr${sqlr_v}.target
      [ $? == 0 ] && systemctl status sqlr${sqlr_v}.target
    fi
    exit $rc
    ;;

#  sqlr-target-start | sqlr-target-stop | sqlr-target-restart)
#    op=$(echo "$op" | sed -e "s/sqlr-target-//g")
#    systemctl "$op" sqlr${sqlr_v}.target
#    rc=$?
#    [ $? == 0 ] && systemctl status sqlr${sqlr_v}.target
#    exit $rc
#    ;;


### services ###

  # manage systemd units
  unit-status)
    [ $# -gt 0 ] || exit 1
    unit="$1"; shift
    systemctl -l status "$unit"
    exit 0
    ;;

  unit-start | unit-stop | unit-restart | unit-enable | unit-disable)
    [ $# -gt 0 ] || exit 1
    unit="$1"; shift
    op=$(echo "$op" | sed -e "s/unit-//g")
    systemctl "$op" "$unit"
    rc=$?
    systemctl -l status "$unit"
    exit $rc
    ;;

  # configuration for unit
  # unit-config unit [filter]
  unit-config)
    [ $# -gt 0 ] || exit 1
    unit="$1"; shift
    cfg_file=$(cfg_file_by_unit "$unit")
    [ $? == 0 ] || exit 1

    if [ $# -gt 0 ]; then
      filter="$1"; shift
      grep -F -v "#" $cfg_file | grep -F -i "$filter"
    else
      grep -F -v "#" $cfg_file | grep .
    fi
    
    case "$unit" in
      sqlr|sqlr${sqlr_v})
        dsn_file=$(grep -F -v "#" $cfg_file | grep -F -i dsnfile)
	[ -z "$dsn_file" ] && dsn_file=$sqlr_cfg/odbc.dsn
	#echo "dsn_file=$dsn_file"
	if [ -f $dsn_file ]; then
	  echo
	  echo "-- data sources --"
	  grep -F -v "#" $dsn_file | grep .
	fi
	;;
      eloqsd|eloqsd${eq_v})
        app_file=$(grep -F -v "#" $cfg_file | grep -F -i appfile)
	[ -z "$app_file" ] && app_file=$eq_cfg/eloqsd.app
	#echo "app_file=$app_file"
	if [ -f $app_file ]; then
	  echo
	  echo "-- applications --"
	  grep -F -v "#" $app_file | grep .
	fi
	;;
      eloqwebd|eloqwebd${eq_v})
        uri_file=$(grep -F -v "#" $cfg_file | grep -F -i urifile)
	[ -z "$uri_file" ] && uri_file=$eq_cfg/eloqwebd2.uri
	#echo "uri_file=$uri_file"
	if [ -f $uri_file ]; then
	  echo
	  echo "-- uri --"
	  grep -F -v "#" $uri_file | grep .
	fi
        app_file=$(grep -F -v "#" $cfg_file | grep -F -i appfile)
	[ -z "$app_file" ] && app_file=$eq_cfg/eloqwebd2.app
	#echo "app_file=$app_file"
	if [ -f $app_file ]; then
	  echo
	  echo "-- applications --"
	  grep -F -v "#" $app_file | grep .
	fi
        ;;
    esac
    exit 0
    ;;


### server ###

  # show server message log (file or syslog)
  server-log)
    [ $# -gt 0 ] || exit 1
    unit="$1"; shift
    #echo "** unit=$unit"
    cfg_file=$(cfg_file_by_unit "$unit")
    [ $? == 0 ] || exit 1
    #echo "** cfg_file=$cfg_file"

    log_file=$(grep -Fi logfile $cfg_file | grep -F -v "#" | sed -e "s/^.*= *//g")
    #echo "** log_file=$log_file";

    filter="";    
    if [ $# -gt 0 ]; then
      filter="$1"; shift
      #echo "** filter=$filter"
    fi

    if [ -z "$log_file" -o "$log_file" == "syslog" ]; then
      echo "Log file syslog (journal), newest entries first";
      if [ -n "$filter" ]; then
	journalctl -u "$unit" --output=short-full --no-hostname --full --grep "$filter" --quiet | tac
      else
        journalctl -u "$unit" --output=short-full --no-hostname --full --quiet| tail --lines=100 | tac
      fi
    else
      echo "Log file $log_file, newest entries first";
      if [ -n "$filter" ]; then
        grep -Fi "$filter" "$log_file" | tac
      else
        tail --lines=100 "$log_file" | tac
      fi
    fi
    exit 0
    ;;

  # link to server status page
  server-http-status)
    [ $# -gt 0 ] || exit 1
    unit="$1"; shift
    #echo "** unit=$unit"
    
    case "$unit" in
      dbrepl|dbrepl${eq_v}|dbrepl@*|dbrepl${eq_v}@*|eloqwebd|eloqwebd${eq_v})
        echo "$unit: The HTTP status is not supported";
        exit 0;;
    esac
    
    cfg_file=$(cfg_file_by_unit "$unit")
    [ $? == 0 ] || exit 1
    #echo "** cfg_file=$cfg_file"

    host=$(hostname -A | sed -e "s/ //g")
    srv=$(grep -Fi ServiceHTTPS $cfg_file | grep -F -v "#" | sed -e "s/^.*= *//g")
    if [ -n "$srv" ]; then
      srv="https://$host:$srv/"
    else 
      srv=$(grep -Fi ServiceHTTP $cfg_file | grep -F -v "#" | sed -e "s/^.*= *//g")
      if [ -n "$srv" ]; then
        srv="http://$host:$srv/"
      fi
    fi

    if [ -n "$srv" ]; then
      echo "$unit <a href=\"$srv\" target=\"$unit\">$srv</a>";
    else
      echo "$unit: The HTTP status is not configured";
    fi
    exit 0
    ;;

  *) 
    echo "$0: unexpected request: $op"
    exit 1
    ;;
esac
