diff --git a/check_psqlserver b/check_psqlserver index 043832606e2e52c9d9e1db2e7d64b06a4bf6fc6c..b1cc02771e739e3605d615077b4479a2b1e05095 100755 --- a/check_psqlserver +++ b/check_psqlserver @@ -14,6 +14,7 @@ # https://www.postgresql.org/docs/current/monitoring-stats.html # ---------------------------------------------------------------------- # 2023-06-07 v0.2 <axel.hahn@unibe.ch> +# 2023-06-08 v0.3 <axel.hahn@unibe.ch> show unknown if database connection fails # ====================================================================== @@ -35,10 +36,20 @@ out=" " # FUNCTIONS # ---------------------------------------------------------------------- +# exit with status unknown if a database query failed +function _queryFailed(){ + ph.setStatus "unknown" + echo "UNKNOWN: the database query failed" + echo "Quick troubleshooter:" + echo "* install a database user $myuser with command $(basename $0) -i" + echo "* check pg_hba.conf login fails if it set to ident (eg. change it to md5)" + ph.exit +} + # uninstall database user function _uninstall(){ - echo UNINSTALL ... - su - postgres -c "psql -c \"DROP USER ${myuser};\"" + echo "UNINSTALL ..." + su - postgres -c "psql -c \"DROP USER ${myuser};\"" 2>&1 unset PGHOST unset PGUSER unset PGPASSWORD @@ -47,7 +58,7 @@ function _uninstall(){ # (re)install database user for monitoring function _install(){ - echo INSTALLING ... + echo "INSTALLING ..." local pwlength=64 echo "- check psql connection..." su postgres -c "psql -V postgres" @@ -56,20 +67,18 @@ function _install(){ exit 1 fi - echo "- creating mysql user $myuser@localhost with random password ($pwlength chars)..." + echo "- creating database user $myuser with random password ($pwlength chars)..." mypw=$( head /dev/urandom | tr -dc A-Za-z0-9 | head -c $pwlength ) SQL1="CREATE USER ${myuser} WITH PASSWORD '${mypw}' CONNECTION LIMIT 5"; SQL2="GRANT pg_monitor TO ${myuser};" # SQL2="GRANT MONITOR_QUERIES TO ${myuser};" - su - postgres -c "psql -c \"${SQL1}\"" - if [ $? -ne 0 ]; then + if ! su - postgres -c "psql -c \"${SQL1}\" 2>&1"; then echo "ERROR: psql command to create user failed." exit 1 fi echo "- grant ..." - su - postgres -c "psql -c \"${SQL2}\"" - if [ $? -ne 0 ]; then + if ! su - postgres -c "psql -c \"${SQL2}\" 2>&1" ; then echo "ERROR: psql command to grant permissions failed." # exit 1 fi @@ -86,8 +95,7 @@ export PGHOST=localhost # set default database because a user db won't be created export PGDATABASE=postgres EOF - ls -l $cfgfile - if [ $? -ne 0 ]; then + if ! ls -l $cfgfile; then echo "ERROR: creation of config file failed." exit 1 fi @@ -116,8 +124,8 @@ OPTIONS: PARAMETERS: -m method; valid methods are: activity running processes and queries - dbrows Count of database row actions conflicts Detected conflicts from pg_stat_database_conflicts + dbrows Count of database row actions diskblock Count of diskblocks physically read or coming from cache problems Problems and troublemakers replication Replication status (table output only) @@ -135,7 +143,7 @@ EOH # param string database query function renderCounters(){ local _query; _query="$1" - local _out; _out=$( psql -c "${_query}") + local _out; _out=$( psql -c "${_query} 2>&1") || _queryFailed local _iCounter; typeset -i _iCounter=0 local _header; _header=$( echo "${_out}" | head -1 | tr -d ' ') local _data; _data=$( echo "${_out}" | head -3 | tail -1 | tr -d ' ') @@ -200,8 +208,7 @@ fi # --- check installation -grep $myuser $cfgfile >/dev/null 2>/dev/null -if [ $? -ne 0 ]; then +if ! grep $myuser $cfgfile >/dev/null 2>&1; then ph.abort "PSQL access not possible yet. You need to install the monitoring user first: as root execute `basename $0` -i" fi @@ -213,7 +220,7 @@ sMode=$(ph.getValueWithParam '' m "$@") case "${sMode}" in "activity") - _out=$( psql -c "select pid,usename,state,query,backend_type,backend_start from pg_stat_activity" ) + _out=$( psql -c "select pid,usename,state,query,backend_type,backend_start from pg_stat_activity" ) || _queryFailed typeset -i iQTotal; iQTotal=$( tail -1 <<< "$_out" | cut -f 1 -d ' ' | tr -d '(' ) typeset -i iQActive; iQActive=$( awk '{ print $5 }' <<< "$_out" | grep -c "active" ) @@ -260,7 +267,7 @@ case "${sMode}" in from pg_stat_database " ;; "replication") - _out=$( psql -c "select * from pg_stat_replication" ) + _out=$( psql -c "select * from pg_stat_replication" ) || _queryFailed if tail -1 <<< "$_out" | grep "(0 rows)" >/dev/null ; then descr="No data in pg_stat_replication - this is no slave." out=""