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