#!/bin/sh

set -u
set -e
LC_ALL=C
export LC_ALL

os_name="`uname`"
os_dist="$os_name"
os_rel="`uname -r`"
os_arch="`uname -p`"

## ======================================================================

if [ x"$os_name" = x"Linux" ]; then
  . /etc/os-release
  os_dist="$ID"
  os_rel=$(echo $VERSION_ID | sed 's/\..*$//')
  os_arch=$(uname -m)
elif [ x"$os_name" = x"SunOS" ]; then
  os_name="Solaris"
  os_dist="$os_name"
  os_rel="`uname -r |sed 's/^.*\.//'`"
elif [ x"$os_name" = x"AIX" ]; then
  os_rel="`uname -v`"
fi

ldd_x() {
  (
    ldd "$1"
  ) \
  |sed 's/ (.*)$//;s#\(/platform/\)[^/]*\(/lib/\)#\1*\2#' \
  |sort
  if [ x"$os_name" = x"Solaris" ]; then
    echo
    pvs "$1"
  fi
}

bininfo() {
  echo "OpenLDAP Binary Information"
  echo "OS name: $os_name"
  echo "OS distribution: $os_dist"
  echo "OS release: $os_rel"
  echo "OS architecture: $os_arch"

  echo 
  echo "slapd modules:"
  ls /opt/osstech/libexec/openldap/*.la \
    |sed 's#.*/##' \
    |sort \
    |sed 's/\.o$/ (static)/;s/\.la//'

  echo 
  echo "ldd slapd"
  ldd_x /opt/osstech/sbin/slapd

  echo 
  echo "ldd ldapsearch"
  ldd_x /opt/osstech/bin/ldapsearch

  echo 
  echo "ldd liblber-*.so"
  ldd_x /opt/osstech/lib64/openldap2.5/liblber-*.so.[0-9]

  echo 
  echo "ldd libldap-*.so"
  ldd_x /opt/osstech/lib64/openldap2.5/libldap-*.so.[0-9]
}

usage() {
  echo "Usage: $(basename $0) [OPTION]"
  echo "  -i Show OS Identifier"
  echo "  -p Print bininfo"
  echo "  -w Write bininfo to current directory"
  echo "  -c Check bininfo with bininfo file"
  exit 1
}

show_id() {
  echo "$os_dist$os_rel.$os_arch"
  exit 0
}

print_bininfo() {
  bininfo
  exit 0
}

write_bininfo() {
  filename="bininfo.$os_dist$os_rel.$os_arch.txt"
  bininfo > $filename
  exit 0
}

check_bininfo() {
  filename="bininfo.$os_dist$os_rel.$os_arch.txt"
  bininfo | ( diff -u $filename /dev/fd/3 ) 3<&0
  exit $?
}

while getopts ipwch opt
do
  case $opt in
  i )
    show_id ;;
  p )
    print_bininfo ;;
  w )
    write_bininfo ;;
  c )
    check_bininfo ;;
  h )
    usage ;;
  esac
done

usage

