diff --git a/sensu/files/checks/ipa_check_consistency b/sensu/files/checks/ipa_check_consistency
new file mode 100755
index 0000000..7d345c7
--- /dev/null
+++ b/sensu/files/checks/ipa_check_consistency
@@ -0,0 +1,699 @@
+#!/usr/bin/env bash
+#
+# The script checks consistency across FreeIPA servers.
+# Put BIND password in to ipa_check_consistency.passwd file to stop password
+# prompts.
+#
+# Author: Peter Pakos <peter.pakos@wandisco.com>
+
+set -euo pipefail
+IFS=$'\n'
+
+readonly APP_VER="16.4.8"
+readonly APP_NAME="$(basename "$0")"
+readonly APP_DIR="$(cd "$(dirname "$0")" && pwd)"
+readonly TMP_DIR="$(mktemp -d)"
+declare PASSWD_FILE="${APP_DIR}/$(basename "$0").passwd"
+
+declare -a SERVERS=()
+declare DOMAIN=""
+declare SUFFIX=""
+declare BINDDN="cn=Directory Manager"
+declare BINDPW=""
+declare -i FIRST_COLUMN=20
+declare -i MIDDLE_COLUMNS=5
+declare -i LAST_COLUMN=5
+declare -i NAGIOS=0
+declare WARNING=1
+declare CRITICAL=2
+declare -i CHECKS_NO=11
+
+die() {
+  local msg="${1:-}"
+  local -i code=${2:-1}
+
+  if [[ -n "$msg" ]]; then
+    printf "%s\n" "$msg" >&2
+  fi
+  exit $code
+}
+
+display_version() {
+  printf "%s version %s\n" "$APP_NAME" "$APP_VER"
+}
+
+display_help() {
+  display_version
+  cat <<HELP
+Usage: ${APP_NAME} [OPTIONS]
+AVAILABLE OPTIONS:
+-H  List of IPA servers (e.g.: "server1 server2.domain server3")
+    Both short names and FQDNs are supported (FQDN if not within IPA domain)
+-d  IPA domain (e.g.: "ipa.domain.com")
+-s  LDAP root suffix, if not domain based (default: "dc=ipa,dc=domain,dc=com")
+-D  BIND DN (default: cn=Directory Manager)
+-W  BIND password (prompt for one if not supplied)
+-p  Password file (default: $(basename "$0").passwd)
+-n  Nagios plugin mode
+-w  Warning threshold (0-${CHECKS_NO}), number of failed checks before alerting (default: 1)
+-c  Critical threshold (0-${CHECKS_NO}), number of failed checks before alerting (default: 2)
+-h  Print this help summary page
+-v  Print version number
+HELP
+}
+
+get_opts() {
+  while getopts ":vhd:D:W:s:p:H:nw:c:" opt; do
+    case $opt in
+      v)
+        display_version
+        exit 0
+        ;;
+      h)
+        display_help
+        exit 0
+        ;;
+      d)
+        DOMAIN="${OPTARG,,}"
+        ;;
+      D)
+        BINDDN="${OPTARG}"
+        ;;
+      W)
+        BINDPW="${OPTARG}"
+        ;;
+      s)
+        SUFFIX="${OPTARG}"
+        ;;
+      p)
+        PASSWD_FILE="${OPTARG}"
+        if [[ ! -r "$PASSWD_FILE" ]]; then
+          die "Unable to open password file ${PASSWD_FILE}, exiting."
+        fi
+        ;;
+      H)
+        IFS=" "
+        SERVERS=($OPTARG)
+        IFS=$'\n'
+        update_cols
+        ;;
+      n)
+        NAGIOS=1
+        ;;
+      w)
+        WARNING="${OPTARG}"
+        ;;
+      c)
+        CRITICAL="${OPTARG}"
+        ;;
+      :)
+        die "Option -${OPTARG} requires an argument"
+        ;;
+      *)
+        die "Invalid option -${OPTARG}"
+        ;;
+    esac
+  done
+}
+
+is_integer() {
+  local var="$1"
+
+  if [[ "$var" =~ ^[-+]?[0-9]+$ ]]; then
+    return 0
+  else
+    return 1
+  fi
+}
+
+check_vars() {
+  local -i fail=0 i=0
+
+  if [[ ${#SERVERS[@]} -lt 1 ]]; then
+    printf "Hosts not specified (-H)\n" >&2
+    fail=1
+  fi
+  if [[ -z "$DOMAIN" ]]; then
+    printf "IPA domain not specified (-d)\n" >&2
+    fail=1
+  else
+    if [[ -z "$SUFFIX" ]]; then
+      SUFFIX="dc=${DOMAIN//./,dc=}"
+    fi
+  fi
+  if is_integer "$WARNING"; then
+    if ! [[ $WARNING -ge 0 && $WARNING -le $CHECKS_NO ]]; then
+      printf "Warning threshold (-w) needs to be an integer between 1 and %i\n" $CHECKS_NO >&2
+      fail=1
+    fi
+  else
+    printf "Warning threshold (-w) needs to be an integer\n" >&2
+    fail=1
+  fi
+  if is_integer "$CRITICAL"; then
+    if ! [[ $CRITICAL -ge 0 && $CRITICAL -le $CRITICAL ]]; then
+      printf "Critical threshold (-c) needs to be an integer between 1 and %i\n" $CHECKS_NO >&2
+      fail=1
+    fi
+  else
+    printf "Critical threshold (-w) needs to be an integer\n" >&2
+    fail=1
+  fi
+  if is_integer "$CRITICAL" && is_integer "$WARNING"; then
+    if ! [[ $CRITICAL -ge $WARNING ]]; then
+      printf "Critical threshold (-c) needs to be greater than warning threshold (-w)\n" >&2
+      fail=1
+    fi
+  fi
+
+  if [[ $fail -ne 0 ]]; then
+    die
+  fi
+  for ((i=0; i<${#SERVERS[@]}; i++)); do
+    if ! [[ "${SERVERS[i]}" =~ \. ]]; then
+      SERVERS[i]="${SERVERS[i]}.${DOMAIN}"
+    fi
+  done
+}
+
+get_pass() {
+  if [[ -z "$BINDPW" ]]; then
+    if [[ -r "$PASSWD_FILE" ]]; then
+      BINDPW="$(<"$PASSWD_FILE")"
+      printf "BIND password loaded from file %s\n" "$(basename "$PASSWD_FILE")"
+    else
+      printf "%s password: " "${BINDDN#cn=}"
+      read -rs BINDPW
+      printf "\n"
+    fi
+  fi
+}
+
+validate_pass() {
+  for server in "${SERVERS[@]}"; do
+  if ldapwhoami -ZZ -x -h "$server" -D "$BINDDN" -w "$BINDPW" &>/dev/null; then
+    return 0
+  fi
+  done
+  die "BIND failed to all servers, check connection details and try again."
+}
+
+hr() {
+  local -i len=$(( FIRST_COLUMN + ${#SERVERS[@]} * MIDDLE_COLUMNS + LAST_COLUMN ))
+  local -i i=0
+
+  for((i=1; i<=len; i++)); do
+    printf "="
+  done
+  printf "\n"
+}
+
+display_header() {
+  local server=""
+
+  printf "%-${FIRST_COLUMN}s" "FreeIPA servers:"
+  for server in "${SERVERS[@]}"; do
+    server="${server%%.*}"
+    printf "%-${MIDDLE_COLUMNS}s" "$server"
+  done
+  printf "%-${LAST_COLUMN}s\n" "STATE"
+  hr
+}
+
+is_consistent() {
+  local dir="$1"
+
+  if diff --from-file "$dir"/* &>/dev/null; then
+    printf "OK"
+  else
+    printf "FAIL"
+  fi
+}
+
+query_ldap() {
+  local base="$1"
+  local filter="$2"
+  local attr="$3"
+  local scope="${4:-sub}"
+
+  ldapsearch -ZZ -LLLx -h "${server}" \
+    -D "$BINDDN" -w "$BINDPW" -s "$scope" \
+    -b "$base" "$filter" "$attr" 2>/dev/null
+
+  return $?
+}
+
+active_users() {
+  local server="" count="" state=""
+  local dir="${TMP_DIR}/active_users"
+
+  mkdir -p "$dir"
+  printf "%-${FIRST_COLUMN}s" "Active Users"
+  for server in "${SERVERS[@]}"; do
+    (
+    if ! count=$(query_ldap "cn=users,cn=accounts,${SUFFIX}" \
+      "(objectClass=*)" "numSubordinates" "base" \
+      | awk '/numSubordinates: / {print $2}'); then
+      count="ERROR"
+    fi
+    printf "%s" "$count" > "${dir}/${server}"
+    ) &
+  done
+  wait
+  for server in "${SERVERS[@]}"; do
+    printf "%-${MIDDLE_COLUMNS}s" "$(< "${dir}/${server}")"
+  done
+  state="$(is_consistent "$dir")"
+  printf "%-${LAST_COLUMN}s\n" "$state"
+  if [[ $NAGIOS -eq 1 ]]; then
+    printf "%s\n" "$state" >> "${TMP_DIR}/nagios"
+  fi
+}
+
+staged_users() {
+  local server="" count="" state=""
+  local dir="${TMP_DIR}/staged_users"
+
+  mkdir -p "$dir"
+  printf "%-${FIRST_COLUMN}s" "Stage Users"
+  for server in "${SERVERS[@]}"; do
+    (
+    if ! count=$(query_ldap \
+      "cn=staged users,cn=accounts,cn=provisioning,${SUFFIX}" \
+      "(objectClass=*)" "numSubordinates" "base" \
+      | awk '/numSubordinates: / {print $2}'); then
+      count="ERROR"
+    fi
+    printf "%s" "$count" > "${dir}/${server}"
+    ) &
+  done
+  wait
+  for server in "${SERVERS[@]}"; do
+    printf "%-${MIDDLE_COLUMNS}s" "$(< "${dir}/${server}")"
+  done
+  state="$(is_consistent "$dir")"
+  printf "%-${LAST_COLUMN}s\n" "$state"
+  if [[ $NAGIOS -eq 1 ]]; then
+    printf "%s\n" "$state" >> "${TMP_DIR}/nagios"
+  fi
+}
+
+preserved_users() {
+  local server="" count="" state=""
+  local dir="${TMP_DIR}/preserved_users"
+
+  mkdir -p "$dir"
+  printf "%-${FIRST_COLUMN}s" "Preserved Users"
+  for server in "${SERVERS[@]}"; do
+    (
+    if ! count=$(query_ldap \
+      "cn=deleted users,cn=accounts,cn=provisioning,${SUFFIX}" \
+      "(objectClass=*)" "numSubordinates" "base" \
+      | awk '/numSubordinates: / {print $2}'); then
+      count="ERROR"
+    fi
+    printf "%s" "$count" > "${dir}/${server}"
+    ) &
+  done
+  wait
+  for server in "${SERVERS[@]}"; do
+    printf "%-${MIDDLE_COLUMNS}s" "$(< "${dir}/${server}")"
+  done
+  state="$(is_consistent "$dir")"
+  printf "%-${LAST_COLUMN}s\n" "$state"
+  if [[ $NAGIOS -eq 1 ]]; then
+    printf "%s\n" "$state" >> "${TMP_DIR}/nagios"
+  fi
+}
+
+groups() {
+  local server="" count="" state=""
+  local dir="${TMP_DIR}/groups"
+
+  mkdir -p "$dir"
+  printf "%-${FIRST_COLUMN}s" "User Groups"
+  for server in "${SERVERS[@]}"; do
+    (
+    if ! count=$(query_ldap "cn=groups,cn=accounts,${SUFFIX}" \
+      "(objectClass=ipausergroup)" "dn" "one"); then
+      count="ERROR"
+    else
+      count=$(grep -c "^dn:" <<<"$count" || true)
+    fi
+    printf "%s" "$count" > "${dir}/${server}"
+    ) &
+  done
+  wait
+  for server in "${SERVERS[@]}"; do
+    printf "%-${MIDDLE_COLUMNS}s" "$(< "${dir}/${server}")"
+  done
+  state="$(is_consistent "$dir")"
+  printf "%-${LAST_COLUMN}s\n" "$state"
+  if [[ $NAGIOS -eq 1 ]]; then
+    printf "%s\n" "$state" >> "${TMP_DIR}/nagios"
+  fi
+}
+
+hosts() {
+  local server="" count="" state=""
+  local dir="${TMP_DIR}/hosts"
+
+  mkdir -p "$dir"
+  printf "%-${FIRST_COLUMN}s" "Hosts"
+  for server in "${SERVERS[@]}"; do
+    (
+    if ! count=$(query_ldap "cn=computers,cn=accounts,${SUFFIX}" \
+      "(objectClass=*)" "numSubordinates" "base" \
+      | awk '/numSubordinates: / {print $2}'); then
+      count="ERROR"
+    fi
+    printf "%s" "$count" > "${dir}/${server}"
+    ) &
+  done
+  wait
+  for server in "${SERVERS[@]}"; do
+    printf "%-${MIDDLE_COLUMNS}s" "$(< "${dir}/${server}")"
+  done
+  state="$(is_consistent "$dir")"
+  printf "%-${LAST_COLUMN}s\n" "$state"
+  if [[ $NAGIOS -eq 1 ]]; then
+    printf "%s\n" "$state" >> "${TMP_DIR}/nagios"
+  fi
+}
+
+hostgroups() {
+  local server="" count="" state=""
+  local dir="${TMP_DIR}/hostgroups"
+
+  mkdir -p "$dir"
+  printf "%-${FIRST_COLUMN}s" "Host Groups"
+  for server in "${SERVERS[@]}"; do
+    (
+    if ! count=$(query_ldap "cn=hostgroups,cn=accounts,${SUFFIX}" \
+      "(objectClass=*)" "numSubordinates" "base" \
+      | awk '/numSubordinates: / {print $2}'); then
+      count="ERROR"
+    fi
+    printf "%s" "$count" > "${dir}/${server}"
+    ) &
+  done
+  wait
+  for server in "${SERVERS[@]}"; do
+    printf "%-${MIDDLE_COLUMNS}s" "$(< "${dir}/${server}")"
+  done
+  state="$(is_consistent "$dir")"
+  printf "%-${LAST_COLUMN}s\n" "$state"
+  if [[ $NAGIOS -eq 1 ]]; then
+    printf "%s\n" "$state" >> "${TMP_DIR}/nagios"
+  fi
+}
+
+hbac_rules() {
+  local server="" count="" state=""
+  local dir="${TMP_DIR}/hbac_rules"
+
+  mkdir -p "$dir"
+  printf "%-${FIRST_COLUMN}s" "HBAC Rules"
+  for server in "${SERVERS[@]}"; do
+    (
+    if ! count=$(query_ldap "cn=hbac,${SUFFIX}" \
+      "(ipaUniqueID=*)" "dn" "one"); then
+      count="ERROR"
+    else
+      count=$(grep -c "^dn:" <<<"$count" || true)
+    fi
+    printf "%s" "$count" > "${dir}/${server}"
+    ) &
+  done
+  wait
+  for server in "${SERVERS[@]}"; do
+    printf "%-${MIDDLE_COLUMNS}s" "$(< "${dir}/${server}")"
+  done
+  state="$(is_consistent "$dir")"
+  printf "%-${LAST_COLUMN}s\n" "$state"
+  if [[ $NAGIOS -eq 1 ]]; then
+    printf "%s\n" "$state" >> "${TMP_DIR}/nagios"
+  fi
+}
+
+sudo_rules() {
+  local server="" count="" first_column="" state=""
+  local dir="${TMP_DIR}/sudo_rules"
+
+  mkdir -p "$dir"
+  printf "%-${FIRST_COLUMN}s" "SUDO Rules"
+  for server in "${SERVERS[@]}"; do
+    (
+    if ! count=$(query_ldap "cn=sudorules,cn=sudo,${SUFFIX}" \
+      "(ipaUniqueID=*)" "dn" "one"); then
+      count="ERROR"
+    else
+      count=$(grep -c "^dn:" <<<"$count" || true)
+    fi
+    printf "%s" "$count" > "${dir}/${server}"
+    ) &
+  done
+  wait
+  for server in "${SERVERS[@]}"; do
+    printf "%-${MIDDLE_COLUMNS}s" "$(< "${dir}/${server}")"
+  done
+  state="$(is_consistent "$dir")"
+  printf "%-${LAST_COLUMN}s\n" "$state"
+  if [[ $NAGIOS -eq 1 ]]; then
+    printf "%s\n" "$state" >> "${TMP_DIR}/nagios"
+  fi
+}
+
+dns_zones() {
+  local server="" count="" state=""
+  local dir="${TMP_DIR}/dns_zones"
+
+  mkdir -p "$dir"
+  printf "%-${FIRST_COLUMN}s" "DNS Zones"
+  for server in "${SERVERS[@]}"; do
+    (
+    if ! count=$(query_ldap "cn=dns,${SUFFIX}" \
+      "(objectClass=idnszone)" "dn" "one"); then
+      count="ERROR"
+    else
+      count=$(grep -c "^dn:" <<<"$count" || true)
+    fi
+    printf "%s" "$count" > "${dir}/${server}"
+    ) &
+  done
+  wait
+  for server in "${SERVERS[@]}"; do
+    printf "%-${MIDDLE_COLUMNS}s" "$(< "${dir}/${server}")"
+  done
+  state="$(is_consistent "$dir")"
+  printf "%-${LAST_COLUMN}s\n" "$state"
+  if [[ $NAGIOS -eq 1 ]]; then
+    printf "%s\n" "$state" >> "${TMP_DIR}/nagios"
+  fi
+}
+
+ldap_conflicts() {
+  local server="" conflicts="" state="" consistent=""
+  local dir="${TMP_DIR}/ldap_conflicts"
+
+  mkdir -p "$dir"
+  printf "%-${FIRST_COLUMN}s" "LDAP Conflicts"
+  for server in "${SERVERS[@]}"; do
+    (
+    if ! conflicts=$(query_ldap "${SUFFIX}" "(nsds5ReplConflict=*)" \
+      "nsds5ReplConflict"); then
+      conflicts="ERROR"
+    else
+      if [[ -n "$conflicts" ]]; then
+        conflicts="YES"
+      else
+        conflicts="NO"
+      fi
+    fi
+    printf "%s" "$conflicts" > "${dir}/${server}"
+    ) &
+  done
+  wait
+  for server in "${SERVERS[@]}"; do
+    printf "%-${MIDDLE_COLUMNS}s" "$(< "${dir}/${server}")"
+  done
+  consistent="$(is_consistent "$dir")"
+  conflicts="$(<"${dir}/${SERVERS[0]}")"
+  if [[ "$consistent" == "OK" && "$conflicts" == "NO" ]]; then
+    state="OK"
+  else
+    state="FAIL"
+  fi
+  printf "%-${LAST_COLUMN}s\n" "$state"
+  if [[ $NAGIOS -eq 1 ]]; then
+    printf "%s\n" "$state" >> "${TMP_DIR}/nagios"
+  fi
+}
+
+anon_bind() {
+  local server="" state=""
+  local dir="${TMP_DIR}/anon_bind"
+
+  mkdir -p "$dir"
+  printf "%-${FIRST_COLUMN}s" "Anonymous BIND"
+  for server in "${SERVERS[@]}"; do
+    (
+    if ! state=$(query_ldap "cn=config" "(cn=config)" \
+      "nsslapd-allow-anonymous-access" \
+      | perl -p0e 's/\n //g' \
+      | awk '/nsslapd-allow-anonymous-access: / {print $2}'); then
+      state="ERROR"
+    fi
+    printf "%s" "$state" > "${dir}/${server}"
+    ) &
+  done
+  wait
+  for server in "${SERVERS[@]}"; do
+    printf "%-${MIDDLE_COLUMNS}s" "$(< "${dir}/${server}")"
+  done
+  state="$(is_consistent "$dir")"
+  printf "%-${LAST_COLUMN}s\n" "$state"
+  if [[ $NAGIOS -eq 1 ]]; then
+    printf "%s\n" "$state" >> "${TMP_DIR}/nagios"
+  fi
+}
+
+replication() {
+  local server="" agreements="" agreement="" state=""
+  local -i i=0 max=0
+  local dir="${TMP_DIR}/replication"
+  local suffix="$(sed -e 's@=@\\3D@g' -e 's@,@\\,@g' <<<"$SUFFIX")"
+
+  mkdir -p "$dir"
+  for server in "${SERVERS[@]}"; do
+    (
+    if ! agreements=$(query_ldap \
+      "cn=replica,cn=${suffix},cn=mapping tree,cn=config" \
+      "nsDS5ReplicaHost" "nsds5replicaLastUpdateStatus" "one" \
+      | perl -p0e 's/\n //g' \
+      | awk '{if ($0 ~ /nsDS5ReplicaHost/) printf("%s",$2); if ($0 ~ /nsds5replicaLastUpdateStatus/) printf(" %s\n",$2)}' \
+      | sed -e "s/\.${DOMAIN}//g"); then
+      state="FAIL"
+    fi
+    for agreement in $agreements; do
+      printf "%s\n" "$agreement" >>"${dir}/${server}"
+    done
+    ) &
+  done
+  wait
+  for server in "${SERVERS[@]}"; do
+    if [[ -r "${dir}/${server}" ]]; then
+      n=$(wc -l < "${dir}/${server}")
+    else
+      n=0
+    fi
+    [[ $n -gt $max ]] && max=$n
+  done
+  for ((i=1; i<=max; i++)); do
+    [[ $i -eq 1 ]] && first_column="Replication Status" || first_column=""
+    printf "%-${FIRST_COLUMN}s" "$first_column"
+    for server in "${SERVERS[@]}"; do
+      if [[ -s "${dir}/${server}" ]]; then
+        line=$(sed -n '1p' "${dir}/${server}")
+        sed -i -e '1d' "${dir}/${server}"
+      else
+        line=""
+      fi
+      printf "%-${MIDDLE_COLUMNS}s" "$line"
+    done
+    printf "\n"
+  done
+}
+
+update_cols() {
+  local -i max=0
+
+  for server in "${SERVERS[@]}"; do
+    server="${server%%.*}"
+    [[ ${#server} -gt $max ]] && max=${#server}
+  done
+  max=$((max+4))
+  if [[ $max -gt $MIDDLE_COLUMNS ]]; then
+    MIDDLE_COLUMNS=$max
+  fi
+}
+
+query_servers() {
+  active_users > "$TMP_DIR/active_users.out" &
+  staged_users > "$TMP_DIR/staged_users.out" &
+  preserved_users > "$TMP_DIR/preserved_users.out" &
+  groups > "$TMP_DIR/groups.out" &
+  hosts > "$TMP_DIR/hosts.out" &
+  hostgroups > "$TMP_DIR/hostgroups.out" &
+  hbac_rules > "$TMP_DIR/hbac_rules.out" &
+  sudo_rules > "$TMP_DIR/sudo_rules.out" &
+  dns_zones > "$TMP_DIR/dns_zones.out" &
+  ldap_conflicts > "$TMP_DIR/ldap_conflicts.out" &
+  anon_bind > "$TMP_DIR/anon_bind.out" &
+  replication > "$TMP_DIR/replication.out" &
+  wait
+}
+
+display_data() {
+  printf "%s\n" "$(< "${TMP_DIR}/active_users.out")"
+  printf "%s\n" "$(< "${TMP_DIR}/staged_users.out")"
+  printf "%s\n" "$(< "${TMP_DIR}/preserved_users.out")"
+  printf "%s\n" "$(< "${TMP_DIR}/groups.out")"
+  printf "%s\n" "$(< "${TMP_DIR}/hosts.out")"
+  printf "%s\n" "$(< "${TMP_DIR}/hostgroups.out")"
+  printf "%s\n" "$(< "${TMP_DIR}/hbac_rules.out")"
+  printf "%s\n" "$(< "${TMP_DIR}/sudo_rules.out")"
+  printf "%s\n" "$(< "${TMP_DIR}/dns_zones.out")"
+  printf "%s\n" "$(< "${TMP_DIR}/ldap_conflicts.out")"
+  printf "%s\n" "$(< "${TMP_DIR}/anon_bind.out")"
+  printf "%s\n" "$(< "${TMP_DIR}/replication.out")"
+}
+
+cleanup() {
+  rm -rf "$TMP_DIR"
+}
+
+nagios_check() {
+  local -i oks=$(grep -c "OK" "${TMP_DIR}/nagios")
+  local -i fails=$(( CHECKS_NO - oks ))
+  local msg=""
+  local -i code=3
+
+  if [[ $fails -ge 0 && $fails -lt $WARNING ]]; then
+    msg="OK"
+    code=0
+  elif [[ $fails -ge $WARNING && $fails -lt $CRITICAL ]]; then
+    msg="WARNING"
+    code=1
+  elif [[ $fails -ge $CRITICAL ]]; then
+    msg="CRITICAL"
+    code=2
+  else
+    msg="UNKNOWN"
+    code=3
+  fi
+  msg="${msg} - ${oks}/${CHECKS_NO} checks passed"
+  printf "%s\n" "$msg"
+  cleanup
+  exit $code
+}
+
+main() {
+  get_opts "$@"
+  check_vars
+  get_pass
+  validate_pass
+  if [[ $NAGIOS -eq 0 ]]; then
+    display_header
+  fi
+  query_servers
+  if [[ $NAGIOS -eq 1 ]]; then
+    nagios_check
+  else
+    display_data
+    hr
+  fi
+  cleanup
+}
+
+main "$@"
