#!/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 -re '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 -r -e 's/[0-9. ]{5} [KMGT]iB/     SIZE/' \
            -e 's/[0-9. ]{5} B/   SIZE/'
}

_filter_generated_node_ids()
{
    $SED -re 's/\#block[0-9]{3,}/NODE_NAME/'
}

_filter_qom_path()
{
    $SED -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()
{
    $SED -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()
{
    $SED -e 's/\r//g'
}

# sanitize qemu-io output
_filter_qemu_io()
{
    _filter_win32 | $SED -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()
{
    $SED -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 | \
    $SED -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()
{
    $SED -e $'s/^\\((qemu) \\)\\?.*\e\\[D/\\1/g' \
        -e $'s/\e\\[K//g'
}

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

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

# replace actual image size (depends on the host filesystem)
_filter_actual_image_size()
{
    $SED -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 < <($SED -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' \
        | $SED -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()
{
    $SED -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": \{'
    $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#$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/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#?socket=$SOCK_DIR#?socket=SOCK_DIR#g" \
        -e 's#\(foo\|PORT/\?\|.sock\): Failed to .*$#\1#'
}

_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/'
}

# make sure this script returns success
true
