# ====================================================================== # # Database detector functions # used in localdump.se and detector.sh # # it analyzes all ini files with database profiles and sets # variables / environment to perform database backup/ restore # # Remark: # The script that sources this file must source vendor/ini.class.sh # before using these functions. # # ---------------------------------------------------------------------- # ====================================================================== # ---------------------------------------------------------------------- # CONFIG # ---------------------------------------------------------------------- DBD_BASEDIR=plugins/localdump/profiles declare -A DBD_PARAMS # ---------------------------------------------------------------------- # FUNCTIONS # ---------------------------------------------------------------------- # write debug output if DBD_DEBUG is enabled # param string text to show function dbdetect._wd(){ test "$DBD_DEBUG" -ne "0" && color.echo "darkgray" "DEBUG: $*" >&2 } # check if a process name exisats # param string regex to find in ps -ef output # param bool flag to skip; default: none = abort on miss function dbdetect._requireProcess(){ # echo "CHECK process $1" # ps -ef | grep -v grep | grep -E "$1" >/dev/null pgrep -l "$1" >/dev/null rcself=$? if [ $rcself -ne 0 ]; then rc=$rc+$rcself echo "INFO: missing process $1" if [ -z "$2" ]; then exit 4 fi return 1 fi return 0 } # get a list of all config files # param string full path of ini file function dbdetect.getConfigs(){ find ${DBD_BASEDIR} -type f -name "*.ini" | sort } # get type from given ini file # param string full path of ini file function dbdetect.getType(){ basename "$1" | cut -d "_" -f 1 | sed "s,\.ini$,," } # get profile from given ini file # param string full path of ini file function dbdetect.getProfile(){ basename "$1" | cut -d "_" -f 1- | sed "s,\.ini$,," } # check if the requirements for a database match # param string full path of ini file to check function dbdetect.exists(){ local _config="$1" DBD_PARAMS= local _found=0 # set file and inisection we read values from ini.set "$_config" "detect" # --- check tcp local tcpport; tcpport=$( ini.value "tcp" ) if [ -n "$tcpport" ]; then local tcptarget; tcptarget=$( ini.value "tcp-target" ) tcptarget=${tcptarget:-localhost} if { ! >/dev/tcp/$tcptarget/$tcpport; } > /dev/null 2>&1; then # echo "No port tcp $tcpport available" dbdetect._wd "... No port tcp $tcpport available on $tcptarget" return 1 fi dbdetect._wd "... Found tcp $tcpport on $tcptarget." fi # --- check tcp process local tcpprocess; tcpprocess=$( ini.value "tcp-process" ) if [ -n "$tcpprocess" ]; then if ! netstat -tulpen 2>/dev/null | grep -E "^tcp.*:${tcpport} .*/(${tcpprocess})" >/dev/null; then # echo "No port tcp $tcpport available" dbdetect._wd "... $tcpprocess not found for tcp ${tcpport}" return 1 fi dbdetect._wd "... tcp $tcpport is used by $tcpprocess." fi # --- check binaries local binary; binary=$( ini.value "binary" ) if [ -n "${binary}" ]; then for mybinary in $( echo "${binary}" | tr "," " " ); do if ! which "$mybinary" >/dev/null 2>&1; then dbdetect._wd "... Missing binary: ${mybinary}" return 1 fi dbdetect._wd "... Binary: ${mybinary} was found" done fi # --- check process local process; process=$( ini.value "process" ) if [ -n "${process}" ]; then if ! dbdetect._requireProcess "${process}" 1 >/dev/null; then dbdetect._wd "... Missing process: ${process}" return 1 fi # if ! ps -eo command | grep -E "${process}" >/dev/null 2>&1; then # dbdetect._wd "... Process ${process} was not found" # return 1 # fi dbdetect._wd "... Process ${process} was found" fi # --- check db files local filetype; filetype=$( ini.value "type" ) if [ -n "${filetype}" ]; then local myfiles; declare -a myfiles for myfile in $( ini.value "file[]" ) do if ! file -b "${myfile}" | grep -i "$filetype" >/dev/null; then dbdetect._wd "... File ${myfile} is not of type $filetype" return 1 fi dbdetect._wd "... File ${myfile} is type $filetype" myfiles+="${myfile}|" done if [ -z "${myfiles}" ]; then dbdetect._wd "... No files for type [${filetype}] were added" return 1 fi fi # --- OK, everything was found ... we initialize it dbdetect._wd "OK, match: $_config" ini.set "$_config" "set" local value local dbuser=$( ini.value "dbuser" ) local dbpassword=$( ini.value "dbpassword" ) for mykey in su env params do value="$( ini.value "$mykey" )" value="${value//\{\{tcp\}\}/$tcpport}" value="${value//\{\{tcp-target\}\}/$tcptarget}" value="${value//\{\{dbuser\}\}/$dbuser}" value="${value//\{\{dbpassword\}\}/$dbpassword}" value="${value//\{\{file\[\]\}\}/$myfiles}" DBD_PARAMS[$mykey]="$value" dbdetect._wd ">>> $mykey = $value" done dbdetect._wd ">>> files = $myfiles" DBD_PARAMS[files]="$myfiles" return 0 } # set a profile name # param string profile name function dbdetect.setProfile(){ PROFILENAME="${1:-$PROFILENAME}" dbdetect.exists "${DBD_BASEDIR}/${PROFILENAME}.ini" } function dbdetect.getParams(){ echo "${DBD_PARAMS['params']}" } # for backup scripts: get checked files from [detect] -> file[] # function dbdetect.getFiles(){ echo "${DBD_PARAMS['files']}" | tr "|" "\n" } # set variables in [set] -> env = ... # USAGE: # eval $( dbdetect.setenv ) function dbdetect.setenv(){ echo "${DBD_PARAMS['env']}" } # unset variables from [set] -> env = ... # USAGE: # eval $( dbdetect.unsetenv ) function dbdetect.unssetenv(){ echo "${DBD_PARAMS['env']}" | grep -o '[a-z0-9]*=' | tr -d '=' | sed "s,^,unset ," } function dbdetect.runas(){ echo "${DBD_PARAMS['su']}" } # ----------------------------------------------------------------------