cdist/bin/cdist-dump

326 lines
6.3 KiB
Bash
Executable file

#!/bin/sh
VERSION="0.0.1"
RELEASE=""
set -u
# set -x
hosts=
cache_dir=~/.cdist/cache
do_all=1
do_global_explorer=
do_type_explorer=
do_script_stdout=
do_script_stderr=
do_gencode=
do_code=
do_messages=
do_parameter=
delimiter=':'
ln=
filename_prefix=1
verbose=0
myname=${0##*/}
print_version()
{
printf "%s %s %s\n" "${myname}" "${VERSION}" "${RELEASE}"
}
usage()
{
cat << eof
${myname}: [options] [host...]
eof
print_version
cat << eof
Dump data from cache directories.
host
Dump data for specified hosts. If not specified then all data
from cache directory is dumped.
Options
-a dump all
-C CACHE-DIR use specified CACHE-DIR (default: ~/.cdist/cache)
-c dump code-*
-d DELIMITER delimiter used for filename and line number prefix (default: ':')
-E dump global explorers
-e dump type explorers
-F disable filename prefix (enabled by default)
-f enable filename prefix (default)
-g dump gencode-*
-h show this help screen and exit
-L disable line number prefix (default)
-l enable line number prefix (disabled by default)
-m dump messages
-o dump executions' stdout
-p dump parameters
-r dump executions' stderr
-V show version and exit
-v increase verbosity
eof
}
exit_err()
{
printf "%s\n" "$1"
exit 1
}
# parse options
while [ "$#" -ge 1 ]
do
case "$1" in
-a)
do_all=1
;;
-C)
if [ "$#" -ge 2 ]
then
case "$2" in
-*)
exit_err "Missing cache directory"
;;
*)
cache_dir="$2"
shift
;;
esac
else
exit_err "Missing cache directory"
fi
;;
-c)
do_code=1
do_all=
;;
-d)
if [ "$#" -ge 2 ]
then
case "$2" in
-*)
exit_err "Missing delimiter"
;;
*)
delimiter="$2"
shift
;;
esac
else
exit_err "Missing delimiter"
fi
;;
-E)
do_global_explorer=1
do_all=
;;
-e)
do_type_explorer=1
do_all=
;;
-F)
filename_prefix=
;;
-f)
filename_prefix=1
;;
-g)
do_gencode=1
do_all=
;;
-h)
usage
exit 0
;;
-L)
ln=
;;
-l)
ln=1
;;
-m)
do_messages=1
do_all=
;;
-o)
do_script_stdout=1
do_all=
;;
-p)
do_parameter=1
do_all=
;;
-r)
do_script_stderr=1
do_all=
;;
-V)
print_version
exit 0
;;
-v)
verbose=$((verbose + 1))
;;
*)
hosts="${hosts} $1"
break
;;
esac
shift
done
if [ "${ln}" = "1" ]
then
ln="NR \"${delimiter}\""
fi
if [ "${filename_prefix}" = "1" ]
then
filename_prefix="{}${delimiter}"
fi
if [ "${do_all}" = "1" ]
then
do_global_explorer=1
do_type_explorer=1
do_script_stdout=1
do_script_stderr=1
do_gencode=1
do_code=1
do_messages=1
do_parameter=1
fi
set -- -size +0
set -- "$@" \(
or=
print_verbose()
{
if [ "${verbose}" -ge "$1" ]
then
printf "%s\n" "$2"
fi
}
hor_line()
{
if [ $# -gt 0 ]
then
c="$1"
else
c='='
fi
printf "%78s\n" "" | tr ' ' "${c}"
}
if [ "${do_global_explorer}" ]
then
print_verbose 2 "Dumping global explorers"
# shellcheck disable=SC2086
set -- "$@" ${or} \( \
-path "*/explorer/*" -a \
! -path "*/conf/*" -a \
! -path "*/object/*/explorer/*" \
\)
or="-o"
fi
if [ "${do_type_explorer}" ]
then
print_verbose 2 "Dumping type explorers"
set -- "$@" ${or} -path "*/object/*/explorer/*"
or="-o"
fi
if [ "${do_script_stdout}" ]
then
print_verbose 2 "Dumping execution's stdout"
set -- "$@" ${or} -path "*/stdout/*"
or="-o"
fi
if [ "${do_script_stderr}" ]
then
print_verbose 2 "Dumping execution's stderr"
set -- "$@" ${or} -path "*/stderr/*"
or="-o"
fi
if [ "${do_gencode}" ]
then
print_verbose 2 "Dumping gencode-*"
set -- "$@" ${or} \( -name "gencode-*" -a ! -path "*/stdout/*" -a ! -path "*/stderr/*" \)
or="-o"
fi
if [ "${do_code}" ]
then
print_verbose 2 "Dumping code-*"
set -- "$@" ${or} \( -name "code-*" -a ! -path "*/stdout/*" -a ! -path "*/stderr/*" \)
or="-o"
fi
if [ "${do_messages}" ]
then
print_verbose 2 "Dumping messages"
set -- "$@" ${or} -name "messages"
or="-o"
fi
if [ "${do_parameter}" ]
then
print_verbose 2 "Dumping parameters"
set -- "$@" ${or} -path "*/parameter/*"
or="-o"
fi
set -- "$@" \)
set -- '.' "$@" -exec awk -v prefix="${filename_prefix}" "{print prefix ${ln} \$0}" {} \;
# printf "+ %s\n" "$*"
print_verbose 2 "Using cache dir: ${cache_dir}"
OLD_PWD=$(pwd)
cd "${cache_dir}" || exit
# If no host is specified then search all.
[ -z "${hosts}" ] && hosts="-"
for host in ${hosts}
do
[ "${host}" = "-" ] && host=
# find host cache directory
host_dir=$(find . -name target_host -exec grep -l "${host}" {} +)
print_verbose 3 "found host directory files:"
print_verbose 3 "${host_dir}"
OLD_IFS="${IFS}"
IFS="
"
for d in ${host_dir}
do
dir=$(dirname "${d}")
print_verbose 0 "target host: $(cat "${dir}/target_host"), host directory: ${dir}"
hor_line '='
PREV_PWD=$(pwd)
cd "${dir}" || exit
# set -x
find "$@"
# set +x
cd "${PREV_PWD}" || exit
done
IFS="${OLD_IFS}"
done
cd "${OLD_PWD}" || exit