#!/bin/sh # a script to test the basic setup of a CTDB/Samba install # tridge@samba.org September 2007 # martin@meltin.net August 2010 usage () { cat >&2 < Comma separated list of nodes to operate on -c Ignore comment lines (starting with '#') in file comparisons -w Ignore whitespace in file comparisons --no-ads Do not use commands that assume an Active Directory Server EOF exit 1 } nodes=$(ctdb listnodes -Y | cut -d: -f2) bad_nodes="" diff_opts= no_ads=false parse_options () { temp=$(getopt -n "ctdb_diagnostics" -o "n:cwh" -l no-ads,help -- "$@") [ $? != 0 ] && usage eval set -- "$temp" while true ; do case "$1" in -n) nodes=$(echo "$2" | sed -e 's@,@ @g') ; shift 2 ;; -c) diff_opts="${diff_opts} -I ^#.*" ; shift ;; -w) diff_opts="${diff_opts} -w" ; shift ;; --no-ads) no_ads=true ; shift ;; --) shift ; break ;; -h|--help|*) usage ;; esac done [ $# -ne 0 ] && usage } parse_options "$@" # Use 5s ssh timeout if EXTRA_SSH_OPTS doesn't set a timeout. case "$EXTRA_SSH_OPTS" in *ConnectTimeout=*) : ;; *) export EXTRA_SSH_OPTS="${EXTRA_SSH_OPTS} -o ConnectTimeout=5" esac # Filter nodes. Remove any nodes we can't contact from $node and add # them to $bad_nodes. _nodes="" for _i in $nodes ; do if onnode $_i true >/dev/null 2>&1 ; then _nodes="${_nodes}${_nodes:+ }${_i}" else bad_nodes="${bad_nodes}${bad_nodes:+,}${_i}" fi done nodes="$_nodes" nodes_comma=$(echo $nodes | sed -e 's@[[:space:]]@,@g') PATH="$PATH:/sbin:/usr/sbin:/usr/lpp/mmfs/bin" # list of config files that must exist and that we check are the same # on the nodes if [ -d /etc/sysconfig ] ; then CONFIG_FILES_MUST="/etc/krb5.conf /etc/hosts /etc/ctdb/nodes /etc/sysconfig/ctdb /etc/resolv.conf /etc/nsswitch.conf /etc/sysctl.conf /etc/samba/smb.conf /etc/fstab /etc/multipath.conf /etc/pam.d/system-auth /etc/sysconfig/nfs /etc/exports /etc/vsftpd/vsftpd.conf" else CONFIG_FILES_MUST="/etc/krb5.conf /etc/hosts /etc/ctdb/nodes /etc/default/ctdb /etc/resolv.conf /etc/nsswitch.conf /etc/sysctl.conf /etc/samba/smb.conf /etc/fstab /etc/multipath.conf /etc/pam.d/system-auth /etc/default/nfs /etc/exports /etc/vsftpd/vsftpd.conf" fi # list of config files that may exist and should be checked that they # are the same on the nodes CONFIG_FILES_MAY="/etc/ctdb/public_addresses /etc/ctdb/static-routes" 2>&1 cat <> $ERRORS } show_file() { fname="$1" echo " ================================" echo " File: $fname" echo " `ls -l $fname 2>&1`" cat "$fname" 2>&1 | sed 's/^/ /' echo " ================================" } show_all() { echo "running $1 on nodes $nodes_comma" onnode $nodes_comma "hostname; date; $1 2>&1 | sed 's/^/ /'" 2>&1 } show_and_compare_files () { fmt="$1" ; shift for f ; do first=true for n in $nodes ; do if $first ; then onnode $n [ -r "$f" ] || { msg=$(printf "$fmt" "$f" $n) error "$msg" continue 2; } fstf=$tmpdir/`basename $f`.node$n onnode $n cat $f > $fstf 2>&1 echo " ================================" echo " File (on node $n): $f" echo " `onnode $n ls -l $f 2>&1`" cat "$fstf" | sed 's/^/ /' echo " ================================" first=false else echo "Testing for same config file $f on node $n" tmpf=$tmpdir/`basename $f`.node$n onnode $n cat $f > $tmpf 2>&1 diff $diff_opts $fstf $tmpf >/dev/null 2>&1 || { error "File $f is different on node $n" diff -u $diff_opts $fstf $tmpf } rm -f $tmpf fi done rm -f $fstf done } if ! tmpdir=$(mktemp -d) ; then echo "Unable to create a temporary directory" exit 1 fi ERRORS="${tmpdir}/diag_err" NUM_ERRORS=0 cat < /dev/null` show_all id "$WORKGROUP/Administrator" show_all "wbinfo -p" show_all "wbinfo --online-status" show_all "smbd -b" date echo "Diagnostics finished with $NUM_ERRORS errors" [ -r $ERRORS ] && { cat $ERRORS rm -f $ERRORS } rm -rf "$tmpdir" exit $NUM_ERRORS