#!/usr/bin/env bash
set -Eeuo pipefail

final_rc=0
finish() {
  final_rc=$?
  printf 'REMOTE_MUTATION=ZERO\n'
  printf 'END|REDIS01_HA_PREFAILOVER_READONLY|RC=%s\n' "$final_rc"
}
trap finish EXIT

test "$(id -u)" -eq 0
test "$(hostname -s)" = "sqjcredis01"
ip -o -4 addr show scope global | grep -q '10\.2\.203\.112/'
printf 'BEGIN|REDIS01_HA_PREFAILOVER_READONLY|%s\n' "$(date --iso-8601=seconds)"

for unit in redis5 redis7 sentinel5 sentinel7; do
  test "$(systemctl is-enabled "$unit.service")" = "enabled"
  test "$(systemctl is-active "$unit.service")" = "active"
  printf 'UNIT|%s|enabled|active\n' "$unit.service"
done

while read -r version redis_port sentinel_port master_name redis_cli; do
  secret_file="/etc/zhct/secrets/redis${version}.password"
  test -f "$secret_file" && test ! -L "$secret_file"
  password=$(<"$secret_file")
  replication=$(REDISCLI_AUTH="$password" "$redis_cli" \
    -h 10.2.203.112 -p "$redis_port" INFO replication | tr -d '\r')
  grep -q '^role:master$' <<<"$replication"
  grep -Eq '^connected_slaves:[1-9][0-9]*$' <<<"$replication"
  printf 'REDIS|%s|role=master|replica_present=YES\n' "$master_name"
  unset password replication

  sentinel_master=$("$redis_cli" -h 10.2.203.112 -p "$sentinel_port" \
    --raw SENTINEL master "$master_name")
  grep -A1 -x 'ip' <<<"$sentinel_master" | tail -n1 | grep -Fxq '10.2.203.112'
  grep -A1 -x 'port' <<<"$sentinel_master" | tail -n1 | grep -Fxq "$redis_port"
  grep -A1 -x 'num-slaves' <<<"$sentinel_master" | tail -n1 | grep -Eq '^[1-9][0-9]*$'
  grep -A1 -x 'num-other-sentinels' <<<"$sentinel_master" | tail -n1 | grep -Eq '^[2-9][0-9]*$'
  grep -A1 -x 'quorum' <<<"$sentinel_master" | tail -n1 | grep -Fxq '2'

  peers=$("$redis_cli" -h 10.2.203.112 -p "$sentinel_port" \
    --raw SENTINEL sentinels "$master_name" | grep -c '^name$')
  test "$peers" -ge 2
  quorum_result=$("$redis_cli" -h 10.2.203.112 -p "$sentinel_port" \
    SENTINEL ckquorum "$master_name")
  grep -q '^OK ' <<<"$quorum_result"
  printf 'SENTINEL|%s|master=10.2.203.112:%s|peers=%s|%s\n' \
    "$master_name" "$redis_port" "$peers" "$quorum_result"
done <<'SPECS'
5 6379 26379 sanquan-redis5 /opt/redis/5.0.14/bin/redis-cli
7 6387 26387 sanquan-redis7 /opt/redis/7.2.14/bin/redis-cli
SPECS

printf 'REDIS01_HA_PREFAILOVER_READONLY=PASS\n'
