#!/usr/bin/env bash
#
# Copyright Red Hat
# 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+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": \{'
    regex_json_child_start='^ *"children": \['
    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+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 [[ $discard == 0 ]]; then
            if [[ $format_specific == 0 && $line == "Format specific information:" ]]; then
                discard=1
            elif [[ $line =~ "Child node '/" ]]; then
                discard=1
            elif [[ $line =~ $regex_json_spec_start ]]; then
                discard=2
                regex_json_end="^${line%%[^ ]*}\\},? *$"
            elif [[ $line =~ $regex_json_child_start ]]; then
                discard=2
                regex_json_end="^${line%%[^ ]*}\\],? *$"
            fi
        fi
        if [[ $discard == 0 ]]; then
            echo "$line"
        elif [[ $discard == 1 && ! $line ]]; then
            echo
            discard=0
        elif [[ $discard == 2 && $line =~ $regex_json_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/'
}

# filter warnings caused for block migration deprecation
_filter_migration_block_deprecated()
{
    gsed -e '/warning: parameter .blk. is deprecated; use blockdev-mirror with NBD instead/d' \
         -e '/warning: block migration is deprecated; use blockdev-mirror with NBD instead/d'
}

# make sure this script returns success
true
