forked from ungleich-public/cdist
		
	
		
			
				
	
	
		
			325 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			325 lines
		
	
	
	
		
			6.2 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 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"
 | 
						|
    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
 |