aboutsummaryrefslogtreecommitdiffstats
path: root/roles/archive_server/templates/usr/local/bin/archiver.sh.j2
blob: 582b7761e38c29440fde47fcc45b70b5e630436f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/bin/bash

set -Eeu -o pipefail

shopt -s dotglob

CLIENT_HOSTGROUP={{ archive_clients_hbac_hostgroup | quote}}
ARCHIVE_SRC={{ archive_source_path | quote }}
ARCHIVE_DEST={{ archive_dest_path | quote }}
ARCHIVE_PLUGIN_DIR={{ archive_plugin_dir | quote }}
ARCHIVE_CONFIG={{ archive_config_path }}
ARCHIVE_HOME={{ archive_home | quote }}
ARCHIVE_RETENTION_DAYS={{ archive_retention_days | quote }}
DOMAIN={{ ansible_domain }}
{% raw %}
export GSS_USE_PROXY=yes

RSYNC_ARGS=(
  --recursive
  --ignore-existing
  --links
  --perms
  --no-group
  --chmod=D2770,F440
  --times
  --omit-dir-times
  --prune-empty-dirs
  --remove-source-files
  --human-readable
  --itemize-changes
)

FAILED_HOSTS=()

trap 'rm -rf "$TMPDIR"' EXIT

############
# First, archive the /var/spool/archive directory for all hosts in the
# archive clients host group via ssh.
############
readarray -t HOSTS < <(ipa hostgroup-show "$CLIENT_HOSTGROUP" --raw \
  | awk '$1 == "member:" { match($2, /^fqdn=([^,]+),/, m); print m[1] }')

for HOST in "${HOSTS[@]}"; do
  echo "archiving ${HOST}..."
  TMPDIR=$(mktemp -d "${ARCHIVE_HOME}/.archiver-XXXXXX")
  rsync "${RSYNC_ARGS[@]}" "${HOST}:${ARCHIVE_SRC}/" "$TMPDIR" && RC=$? || RC=$?

  if (( RC == 0 )); then
    mkdir -p "${ARCHIVE_DEST}/${HOST}"
    find "$TMPDIR" -mindepth 2 -maxdepth 2 -print0 | xargs -0 -I{} cp -rpn {} "${ARCHIVE_DEST}/${HOST}"
  else
    FAILED_HOSTS+=("$HOST")
  fi

  rm -rf "$TMPDIR"
done


############
# Next, we archive hosts that don't support pull via ssh. For each line in
# $ARCHIVE_CONFIG, we run the plugin command inside of a temporary directory and
# then rsync any created files to the archive directory.
############
grep -v '^\s*$\|^\s*\#' "$ARCHIVE_CONFIG" | while read -r HOST CMD ARGS; do
  echo "archiving ${HOST} via script..."

  TMPDIR=$(mktemp -d "${ARCHIVE_HOME}/.archiver-XXXXXX")
  pushd "$TMPDIR" > /dev/null
  "${ARCHIVE_PLUGIN_DIR}/${CMD}" "$HOST" ${ARGS:-} && RC=$? || RC=$?
  popd > /dev/null

  if [[ $HOST = *.* ]]; then
    FQDN=$HOST
  else
    FQDN="${HOST}.${DOMAIN}"
  fi

  if (( RC == 0 )); then
    mkdir -p "${ARCHIVE_DEST}/${FQDN}"
    rsync "${RSYNC_ARGS[@]}" "${TMPDIR}/" "${ARCHIVE_DEST}/${FQDN}"
  else
    FAILED_HOSTS+=("$HOST")
  fi

  rm -rf "$TMPDIR"
done


############
# Prune old archive files.
############
find "$ARCHIVE_DEST" -type f -mtime "+${ARCHIVE_RETENTION_DAYS}" -delete

if (( ${#FAILED_HOSTS[@]} )); then
  echo "the following hosts had errors: ${FAILED_HOSTS[*]}" 1>&2
  exit 1
fi
{% endraw %}