272dcb1ba355392422b78b718c5a4bd6e189b9c1
[nivanova/samba-autobuild/.git] / ctdb / config / events.d / 00.ctdb
1 #!/bin/sh
2
3 # Event script for ctdb-specific setup and other things that don't fit
4 # elsewhere.
5
6 [ -n "$CTDB_BASE" ] || \
7     CTDB_BASE=$(d=$(dirname "$0") ; cd -P "$d" ; dirname "$PWD")
8
9 . "${CTDB_BASE}/functions"
10
11 load_script_options
12
13 ############################################################
14
15 # type is commonly supported and more portable than which(1)
16 # shellcheck disable=SC2039
17 select_tdb_checker ()
18 {
19     # Find the best TDB consistency check available.
20     use_tdb_tool_check=false
21     type tdbtool >/dev/null 2>&1 && found_tdbtool=true
22     type tdbdump >/dev/null 2>&1 && found_tdbdump=true
23
24     if $found_tdbtool && echo "help" | tdbtool | grep -q check ; then
25             use_tdb_tool_check=true
26     elif $found_tdbtool && $found_tdbdump ; then
27             cat <<EOF
28 WARNING: The installed 'tdbtool' does not offer the 'check' subcommand.
29  Using 'tdbdump' for database checks.
30  Consider updating 'tdbtool' for better checks!
31 EOF
32     elif $found_tdbdump ; then
33         cat <<EOF
34 WARNING: 'tdbtool' is not available.
35  Using 'tdbdump' to check the databases.
36  Consider installing a recent 'tdbtool' for better checks!
37 EOF
38     else
39         cat <<EOF
40 WARNING: Cannot check databases since neither
41  'tdbdump' nor 'tdbtool check' is available.
42  Consider installing tdbtool or at least tdbdump!
43 EOF
44         return 1
45     fi
46 }
47
48 check_tdb ()
49 {
50     _db="$1"
51
52     if $use_tdb_tool_check ; then
53         # tdbtool always exits with 0  :-(
54         if timeout 10 tdbtool "$_db" check 2>/dev/null |
55             grep -q "Database integrity is OK" ; then
56             return 0
57         else
58             return 1
59         fi
60     else
61         timeout 10 tdbdump "$_db" >/dev/null 2>/dev/null
62         return $?
63     fi
64 }
65
66 check_persistent_databases ()
67 {
68     _dir="${CTDB_DBDIR_PERSISTENT:-${CTDB_VARDIR}/persistent}"
69     [ -d "$_dir" ] || return 0
70
71     [ "${CTDB_MAX_PERSISTENT_CHECK_ERRORS:-0}" = "0" ] || return 0
72
73     for _db in "$_dir/"*.tdb.*[0-9] ; do
74         [ -r "$_db" ] || continue
75         check_tdb "$_db" || \
76             die "Persistent database $_db is corrupted! CTDB will not start."
77     done
78 }
79
80 check_non_persistent_databases ()
81 {
82     _dir="${CTDB_DBDIR:-${CTDB_VARDIR}}"
83     [ -d "$_dir" ] || return 0
84
85     for _db in "${_dir}/"*.tdb.*[0-9] ; do
86         [ -r "$_db" ] || continue
87         check_tdb "$_db" || {
88             _backup="${_db}.$(date +'%Y%m%d.%H%M%S.%N').corrupt"
89             cat <<EOF
90 WARNING: database ${_db} is corrupted.
91  Moving to backup ${_backup} for later analysis.
92 EOF
93             mv "$_db" "$_backup"
94
95             # Now remove excess backups
96             _max="${CTDB_MAX_CORRUPT_DB_BACKUPS:-10}"
97             _bdb="${_db##*/}" # basename
98             find "$_dir" -name "${_bdb}.*.corrupt" |
99                     sort -r |
100                     tail -n +$((_max + 1)) |
101                     xargs rm -f
102         }
103     done
104 }
105
106 set_ctdb_variables ()
107 {
108         _f="${CTDB_BASE}/ctdb.tunables"
109         if [ ! -r "$_f" ] ; then
110                 return
111         fi
112
113         while IFS="=" read _var _val ; do
114                 case "$_var" in
115                 \#*|"") continue ;;
116                 esac
117
118                 if $CTDB setvar "$_var" "$_val" ; then
119                         echo "Set $_var to $_val"
120                 else
121                         echo "Invalid tunable: ${_var}=${_val}"
122                         return 1
123                 fi
124         done <"$_f"
125 }
126
127 ############################################################
128
129 ctdb_check_args "$@"
130
131 case "$1" in
132 init)
133         # make sure we have a blank state directory for the scripts to work with
134         rm -rf "$CTDB_SCRIPT_VARDIR"
135         mkdir -p "$CTDB_SCRIPT_VARDIR" || \
136             die "mkdir -p ${CTDB_SCRIPT_VARDIR} - failed - $?" $?
137
138         if select_tdb_checker ; then
139             check_persistent_databases || exit $?
140             check_non_persistent_databases
141         fi
142         ;;
143
144 setup)
145         # Set any tunables from the config file
146         set_ctdb_variables || \
147             die "Aborting setup due to invalid configuration - fix typos, remove unknown tunables"
148         ;;
149
150 startup)
151         $CTDB attach ctdb.tdb persistent
152         ;;
153 esac
154
155 # all OK
156 exit 0