Merge remote-tracking branch 'origin/master' into staging
[mirror/dsa-puppet.git] / modules / postgres / files / dsa-restart-all-idle-postgres
1 #! /bin/bash
2
3 # Written by Peter Palfrader
4 # Based on code by Tollef Fog Heen <tfheen@err.no> based on code by Peter Palfrader
5 #
6 # Restart all postgresql clusters that show up in dsa-check-libs when they do
7 # not have connections to them.
8
9 set -e
10 set -u
11
12 # chk_net <port>
13 # returns true (0) if there are connections to that port.
14 chk_net() {
15   local port="$1"; shift
16   local con="$(ss -H -nt "sport = :$port" | wc -l)"
17   if [ "$con" -ge 1 ]; then
18     return 0
19   else
20     return 1
21   fi
22 }
23
24 get_pidfile_value() {
25   local version="$1"; shift
26   local name="$1"; shift
27
28   local fn="/run/postgresql/${version}-${name}.pid"
29   if [ -e "$fn" ] ; then
30     cat "$fn"
31   else
32     echo "No pidfile at $fn" >&2
33     exit 1
34   fi
35 }
36
37 handle_cluster() {
38   local version="$1"; shift
39   local name="$1"; shift
40   local port="$1"; shift
41
42   pid="$(get_pidfile_value "$version" "$name")"
43   while chk_net "$port" && [ "$pid" = "$(get_pidfile_value "$version" "$name")" ]; do
44     sleep 60
45   done
46   systemctl restart "postgresql@${version}-${name}.service"
47 }
48
49 tmpfile="$(tempfile)"
50 trap "rm -f '$tmpfile'" EXIT
51 /usr/lib/nagios/plugins/dsa-check-libs > "$tmpfile" || true
52
53 pg_lsclusters -h | while read version name port status; do
54   echo "$status" | grep -q --word-regexp online || continue
55   pid="$(get_pidfile_value "$version" "$name")"
56   grep -q --word-regexp $pid "$tmpfile" || continue
57
58   handle_cluster $version $name $port
59 done