| #!/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 's#\(Attached to: *\) /.*#\1 PATH#' |
| } |
| |
| # replace occurrences of the actual TEST_DIR value with TEST_DIR |
| _filter_testdir() |
| { |
| $SED -e "s#$TEST_DIR/#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' |
| } |
| |
| # replace driver-specific options in the "Formatting..." line |
| _filter_img_create() |
| { |
| $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#$IMGFMT#IMGFMT#g" \ |
| -e 's#nbd:127.0.0.1:10810#TEST_DIR/t.IMGFMT#g' \ |
| -e "s# encryption=off##g" \ |
| -e "s# cluster_size=[0-9]\\+##g" \ |
| -e "s# table_size=[0-9]\\+##g" \ |
| -e "s# compat=[^ ]*##g" \ |
| -e "s# compat6=\\(on\\|off\\)##g" \ |
| -e "s# static=\\(on\\|off\\)##g" \ |
| -e "s# zeroed_grain=\\(on\\|off\\)##g" \ |
| -e "s# subformat=[^ ]*##g" \ |
| -e "s# adapter_type=[^ ]*##g" \ |
| -e "s# hwversion=[^ ]*##g" \ |
| -e "s# lazy_refcounts=\\(on\\|off\\)##g" \ |
| -e "s# block_size=[0-9]\\+##g" \ |
| -e "s# block_state_zero=\\(on\\|off\\)##g" \ |
| -e "s# log_size=[0-9]\\+##g" \ |
| -e "s# refcount_bits=[0-9]\\+##g" \ |
| -e "s# key-secret=[a-zA-Z0-9]\\+##g" \ |
| -e "s# iter-time=[0-9]\\+##g" \ |
| -e "s# force_size=\\(on\\|off\\)##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#$IMGFMT#IMGFMT#g" \ |
| -e 's#nbd://127.0.0.1:10810$#TEST_DIR/t.IMGFMT#g' \ |
| -e 's#json.*vdisk-id.*vxhs"}}#TEST_DIR/t.IMGFMT#' \ |
| -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 "/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() |
| { |
| $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 *//' | _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=$TEST_DIR#?socket=TEST_DIR#g" \ |
| -e 's#\(foo\|PORT/\?\|.sock\): Failed to .*$#\1#' |
| } |
| |
| _filter_qmp_empty_return() |
| { |
| grep -v '{"return": {}}' |
| } |
| |
| # make sure this script returns success |
| true |