#!/usr/bin/env bash
#
# Copyright (C) 2009 Red Hat, Inc.
# Copyright (c) 2000-2001 Silicon Graphics, Inc.  All Rights Reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#
# standard filters
#

_filter_date()
{
    sed -Ee 's/[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/yyyy-mm-dd hh:mm:ss/'
}

_filter_vmstate_size()
{
    sed -E -e 's/[0-9. ]{5} [KMGT]iB/     SIZE/' \
           -e 's/[0-9. ]{5} B/   SIZE/'
}

_filter_generated_node_ids()
{
    sed -Ee 's/\#block[0-9]{3,}/NODE_NAME/'
}

_filter_qom_path()
{
    gsed -e '/Attached to:/s/\device[[0-9]\+\]/device[N]/g'
}

# replace occurrences of the actual TEST_DIR value with TEST_DIR
_filter_testdir()
{
    sed -e "s#$TEST_DIR/#TEST_DIR/#g" \
        -e "s#$SOCK_DIR/#SOCK_DIR/#g" \
        -e "s#SOCK_DIR/fuse-#TEST_DIR/#g"
}

# replace occurrences of the actual IMGFMT value with IMGFMT
_filter_imgfmt()
{
    sed -e "s#$IMGFMT#IMGFMT#g"
}

# Replace error message when the format is not supported and delete
# the output lines after the first one
_filter_qemu_img_check()
{
    gsed -e '/allocated.*fragmented.*compressed clusters/d' \
        -e 's/qemu-img: This image format does not support checks/No errors were found on the image./' \
        -e '/Image end offset: [0-9]\+/d'
}

# Removes \r from messages
_filter_win32()
{
    gsed -e 's/\r//g'
}

# sanitize qemu-io output
_filter_qemu_io()
{
    _filter_win32 | \
    gsed -e "s/[0-9]* ops\; [0-9/:. sec]* ([0-9/.inf]* [EPTGMKiBbytes]*\/sec and [0-9/.inf]* ops\/sec)/X ops\; XX:XX:XX.X (XXX YYY\/sec and XXX ops\/sec)/" \
        -e "s/: line [0-9][0-9]*:  *[0-9][0-9]*\( Aborted\| Killed\)/:\1/" \
        -e "s/qemu-io> //g"
}

# replace occurrences of QEMU_PROG with "qemu"
_filter_qemu()
{
    gsed -e "s#\\(^\\|(qemu) \\)$(basename $QEMU_PROG):#\1QEMU_PROG:#" \
        -e 's#^QEMU [0-9]\+\.[0-9]\+\.[0-9]\+ monitor#QEMU X.Y.Z monitor#' \
        -e $'s#\r##' # QEMU monitor uses \r\n line endings
}

# replace problematic QMP output like timestamps
_filter_qmp()
{
    _filter_win32 | \
    gsed -e 's#\("\(micro\)\?seconds": \)[0-9]\+#\1 TIMESTAMP#g' \
        -e 's#^{"QMP":.*}$#QMP_VERSION#' \
        -e '/^    "QMP": {\s*$/, /^    }\s*$/ c\' \
        -e '    QMP_VERSION'
}

# readline makes HMP command strings so long that git complains
_filter_hmp()
{
    gsed -e $'s/^\\((qemu) \\)\\?.*\e\\[D/\\1/g' \
        -e $'s/\e\\[K//g'
}

# replace block job offset
_filter_block_job_offset()
{
    gsed -e 's/, "offset": [0-9]\+,/, "offset": OFFSET,/'
}

# replace block job len
_filter_block_job_len()
{
    gsed -e 's/, "len": [0-9]\+,/, "len": LEN,/g'
}

# replace actual image size (depends on the host filesystem)
_filter_actual_image_size()
{
    gsed -s 's/\("actual-size":\s*\)[0-9]\+/\1SIZE/g'
}

# Filename filters for qemu-img create
_filter_img_create_filenames()
{
    sed \
        -e "s#$REMOTE_TEST_DIR#TEST_DIR#g" \
        -e "s#$IMGPROTO:$TEST_DIR#TEST_DIR#g" \
        -e "s#$TEST_DIR#TEST_DIR#g" \
        -e "s#$SOCK_DIR#SOCK_DIR#g" \
        -e 's#SOCK_DIR/fuse-#TEST_DIR/#g' \
        -e "s#$IMGFMT#IMGFMT#g" \
        -e 's#nbd:127.0.0.1:[0-9]\\+#TEST_DIR/t.IMGFMT#g' \
        -e 's#nbd+unix:///\??socket=SOCK_DIR/nbd#TEST_DIR/t.IMGFMT#g'
}

# replace driver-specific options in the "Formatting..." line
_do_filter_img_create()
{
    # Split the line into the pre-options part ($filename_part, which
    # precedes ", fmt=") and the options part ($options, which starts
    # with "fmt=")
    # (And just echo everything before the first "^Formatting")
    readarray formatting_line < <(gsed -e 's/, fmt=/\n/')

    filename_part=${formatting_line[0]}
    unset formatting_line[0]

    options="fmt=${formatting_line[@]}"

    # Set grep_data_file to '\|data_file' to keep it; make it empty
    # to drop it.
    # We want to drop it if it is part of the global $IMGOPTS, and we
    # want to keep it otherwise (if the test specifically wants to
    # test data files).
    grep_data_file=(-e data_file)
    if _get_data_file "$TEST_IMG" > /dev/null; then
        grep_data_file=()
    fi

    filename_part=$(echo "$filename_part" | _filter_img_create_filenames)

    # Break the option line before each option (preserving pre-existing
    # line breaks by replacing them by \0 and restoring them at the end),
    # then filter out the options we want to keep and sort them according
    # to some order that all block drivers used at the time of writing
    # this function.
    options=$(
        echo "$options" \
        | tr '\n' '\0' \
        | gsed -e 's/ \([a-z0-9_.-]*\)=/\n\1=/g' \
        | grep -a -e '^fmt' -e '^size' -e '^backing' -e '^preallocation' \
                  -e '^encryption' "${grep_data_file[@]}" \
        | _filter_img_create_filenames \
        | sed \
            -e 's/^\(fmt\)/0-\1/' \
            -e 's/^\(size\)/1-\1/' \
            -e 's/^\(backing\)/2-\1/' \
            -e 's/^\(data_file\)/3-\1/' \
            -e 's/^\(encryption\)/4-\1/' \
            -e 's/^\(preallocation\)/8-\1/' \
        | LC_ALL=C sort \
        | sed -e 's/^[0-9]-//' \
        | tr '\n\0' ' \n' \
        | sed -e 's/^ *$//' -e 's/ *$//'
    )

    if [ -n "$options" ]; then
        echo "$filename_part, $options"
    elif [ -n "$filename_part" ]; then
        echo "$filename_part"
    fi
}

# Filter qemu-img create output:
# Pipe all ^Formatting lines through _do_filter_img_create, and all
# other lines through _filter_img_create_filenames
_filter_img_create()
{
    while read -r line; do
        if echo "$line" | grep -q '^Formatting'; then
            echo "$line" | _do_filter_img_create
        else
            echo "$line" | _filter_img_create_filenames
        fi
    done
}

_filter_img_create_size()
{
    gsed -e "s# size=[0-9]\\+# size=SIZE#g"
}

_filter_img_info()
{
    if [[ "$1" == "--format-specific" ]]; then
        local format_specific=1
        shift
    else
        local format_specific=0
    fi

    discard=0
    regex_json_spec_start='^ *"format-specific": \{'
    gsed -e "s#$REMOTE_TEST_DIR#TEST_DIR#g" \
        -e "s#$IMGPROTO:$TEST_DIR#TEST_DIR#g" \
        -e "s#$TEST_DIR#TEST_DIR#g" \
        -e "s#$SOCK_DIR#SOCK_DIR#g" \
        -e "s#$IMGFMT#IMGFMT#g" \
        -e 's#nbd://127.0.0.1:[0-9]\\+$#TEST_DIR/t.IMGFMT#g' \
        -e 's#nbd+unix:///\??socket=SOCK_DIR/nbd#TEST_DIR/t.IMGFMT#g' \
        -e 's#SOCK_DIR/fuse-#TEST_DIR/#g' \
        -e "/encrypted: yes/d" \
        -e "/cluster_size: [0-9]\\+/d" \
        -e "/table_size: [0-9]\\+/d" \
        -e "/compat: '[^']*'/d" \
        -e "/compat6: \\(on\\|off\\)/d" \
        -e "s/cid: [0-9]\+/cid: XXXXXXXXXX/" \
        -e "/static: \\(on\\|off\\)/d" \
        -e "/zeroed_grain: \\(on\\|off\\)/d" \
        -e "/subformat: '[^']*'/d" \
        -e "/adapter_type: '[^']*'/d" \
        -e "/hwversion: '[^']*'/d" \
        -e "/lazy_refcounts: \\(on\\|off\\)/d" \
        -e "/extended_l2=\\(on\\|off\\)/d" \
        -e "/block_size: [0-9]\\+/d" \
        -e "/block_state_zero: \\(on\\|off\\)/d" \
        -e "/log_size: [0-9]\\+/d" \
        -e "s/iters: [0-9]\\+/iters: 1024/" \
        -e 's/\(compression type: \)\(zlib\|zstd\)/\1COMPRESSION_TYPE/' \
        -e "s/uuid: [-a-f0-9]\\+/uuid: 00000000-0000-0000-0000-000000000000/" | \
    while IFS='' read -r line; do
        if [[ $format_specific == 1 ]]; then
            discard=0
        elif [[ $line == "Format specific information:" ]]; then
            discard=1
        elif [[ $line =~ $regex_json_spec_start ]]; then
            discard=2
            regex_json_spec_end="^${line%%[^ ]*}\\},? *$"
        fi
        if [[ $discard == 0 ]]; then
            echo "$line"
        elif [[ $discard == 1 && ! $line ]]; then
            echo
            discard=0
        elif [[ $discard == 2 && $line =~ $regex_json_spec_end ]]; then
            discard=0
        fi
    done
}

# filter out offsets and file names from qemu-img map; good for both
# human and json output
_filter_qemu_img_map()
{
    # Assuming the data_file value in $IMGOPTS contains a '$TEST_IMG',
    # create a filter that replaces the data file name by $TEST_IMG.
    # Example:
    #   In $IMGOPTS: 'data_file=$TEST_IMG.data_file'
    #   Then data_file_pattern == '\(.*\).data_file'
    #   And  data_file_filter  == -e 's#\(.*\).data_file#\1#
    data_file_filter=()
    if data_file_pattern=$(_get_data_file '\\(.*\\)'); then
        data_file_filter=(-e "s#$data_file_pattern#\\1#")
    fi

    sed -e 's/\([0-9a-fx]* *[0-9a-fx]* *\)[0-9a-fx]* */\1/g' \
        -e 's/"offset": [0-9]\+/"offset": OFFSET/g' \
        -e 's/Mapped to *//' \
        "${data_file_filter[@]}" \
        | _filter_testdir | _filter_imgfmt
}

_filter_nbd()
{
    # nbd.c error messages contain function names and line numbers that are
    # prone to change.  Message ordering depends on timing between send and
    # receive callbacks sometimes, making them unreliable.
    #
    # Filter out the TCP port number since this changes between runs.
    sed -e '/nbd\/.*\.c:/d' \
        -e 's#127\.0\.0\.1:[0-9]*#127.0.0.1:PORT#g' \
        -e 's#localhost:[0-9]*#localhost:PORT#g' \
        -e 's#host=127\.0\.0\.1,port=[0-9]*#host=127.0.0.1,port=PORT#g' \
        -e 's#host=localhost,port=[0-9]*#host=localhost,port=PORT#g' \
        -e "s#path=$SOCK_DIR#path=SOCK_DIR#g" \
        -e "s#?socket=$SOCK_DIR#?socket=SOCK_DIR#g" \
        -e 's#\(foo\|PORT/\?\|.sock\): Failed to .*$#\1#'
}

_filter_qemu_nbd_exports()
{
    grep '\(exports available\|export\|size\|min block\|qemu-nbd\):'
}

_filter_qmp_empty_return()
{
    grep -v '{"return": {}}'
}

_filter_json_filename()
{
    $PYTHON -c 'import sys
result, *fnames = sys.stdin.read().split("json:{")
depth = 0
for fname in fnames:
    depth += 1 # For the opening brace in the split separator
    for chr_i, chr in enumerate(fname):
        if chr == "{":
            depth += 1
        elif chr == "}":
            depth -= 1
            if depth == 0:
                break

    # json:{} filenames may be nested; filter out everything from
    # inside the outermost one
    if depth == 0:
        chr_i += 1 # First character past the filename
        result += "json:{ /* filtered */ }" + fname[chr_i:]

sys.stdout.write(result)'
}

_filter_authz_check_tls()
{
    sed -e 's/TLS x509 authz check for .* is denied/TLS x509 authz check for DISTINGUISHED-NAME is denied/'
}

_filter_qcow2_compression_type_bit()
{
    gsed -e 's/\(incompatible_features\s\+\)\[3\(, \)\?/\1[/' \
        -e 's/\(incompatible_features.*\), 3\]/\1]/' \
        -e 's/\(incompatible_features.*\), 3\(,.*\)/\1\2/'
}

# make sure this script returns success
true
