Blame src/tests/functions.at

Packit a8ec6b
m4_define([FWD_STOP_FIREWALLD], [
Packit a8ec6b
    pid=$(< firewalld.pid)
Packit a8ec6b
    kill $pid
Packit a8ec6b
    for I in 1 2 3 4 5 6 7 8 9 0; do
Packit a8ec6b
        ps --pid $pid >/dev/null || { pid=0; break; }
Packit a8ec6b
        sleep 1
Packit a8ec6b
    done
Packit a8ec6b
    test $pid -eq 0 || { kill -9 $pid; sleep 3; }
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([FWD_START_FIREWALLD], [
Packit a8ec6b
    FIREWALLD_ARGS="--nofork --nopid --log-file ./firewalld.log --system-config ./"
Packit a8ec6b
    dnl if testsuite ran with debug flag, add debug output
Packit a8ec6b
    ${at_debug_p} && FIREWALLD_ARGS="--debug=3 ${FIREWALLD_ARGS}"
Packit a8ec6b
    if test "x${FIREWALLD_DEFAULT_CONFIG}" != x ; then
Packit a8ec6b
        FIREWALLD_ARGS+=" --default-config ${FIREWALLD_DEFAULT_CONFIG}"
Packit a8ec6b
    fi
Packit a8ec6b
Packit a8ec6b
    NS_CMD([firewalld $FIREWALLD_ARGS &])
Packit a8ec6b
    if test $? -ne 0; then
Packit a8ec6b
        AT_FAIL_IF([:])
Packit a8ec6b
    fi
Packit a8ec6b
    echo "$!" > firewalld.pid
Packit a8ec6b
Packit a8ec6b
    dnl Give it some time for the dbus interface to come up
Packit a8ec6b
    up=0
Packit a8ec6b
    for I in 1 2 3 4 5 6 7 8 9 0; do
Packit a8ec6b
        if NS_CMD([firewall-cmd --state]); then
Packit a8ec6b
            up=1
Packit a8ec6b
            break
Packit a8ec6b
        fi
Packit a8ec6b
        sleep 1
Packit a8ec6b
    done
Packit a8ec6b
    AT_FAIL_IF([test $up -ne 1])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([START_NETWORKMANAGER], [
Packit a8ec6b
    AT_SKIP_IF([! NS_CMD([which NetworkManager >/dev/null 2>&1])])
Packit a8ec6b
    AT_SKIP_IF([! NS_CMD([which nmcli >/dev/null 2>&1])])
Packit a8ec6b
Packit a8ec6b
    AT_DATA([./NetworkManager.conf], [dnl
Packit a8ec6b
[[main]]
Packit a8ec6b
plugins=
Packit a8ec6b
Packit a8ec6b
[[logging]]
Packit a8ec6b
#level=DEBUG
Packit a8ec6b
#domains=ALL
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
    NM_ARGS="--no-daemon --config ./NetworkManager.conf"
Packit a8ec6b
    NS_CMD([NetworkManager $NM_ARGS &])
Packit a8ec6b
    if test $? -ne 0; then
Packit a8ec6b
        AT_FAIL_IF([:])
Packit a8ec6b
    fi
Packit a8ec6b
    echo "$!" > networkmanager.pid
Packit a8ec6b
Packit a8ec6b
    dnl Give it some time for the dbus interface to come up
Packit a8ec6b
    up=0
Packit a8ec6b
    for I in 1 2 3 4 5 6 7 8 9 0; do
Packit a8ec6b
        if NS_CMD([nmcli general status >/dev/null 2>&1]); then
Packit a8ec6b
            up=1
Packit a8ec6b
            break
Packit a8ec6b
        fi
Packit a8ec6b
        sleep 1
Packit a8ec6b
    done
Packit a8ec6b
    AT_FAIL_IF([test $up -ne 1])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([STOP_NETWORKMANAGER], [
Packit a8ec6b
    pid=$(< networkmanager.pid)
Packit a8ec6b
    kill $pid
Packit a8ec6b
    for I in 1 2 3 4 5 6 7 8 9 0; do
Packit a8ec6b
        ps --pid $pid >/dev/null || { pid=0; break; }
Packit a8ec6b
        sleep 1
Packit a8ec6b
    done
Packit a8ec6b
    test $pid -eq 0 || { kill -9 $pid; sleep 3; }
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([FWD_RELOAD], [
Packit a8ec6b
    FWD_CHECK([-q --reload], [$1], [$2], [$3])
Packit a8ec6b
    FWD_CHECK([-q --state], [$4], [$5], [$6])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([FWD_RESTART], [
Packit a8ec6b
    FWD_STOP_FIREWALLD
Packit a8ec6b
    FWD_START_FIREWALLD
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([FWD_START_TEST], [
Packit a8ec6b
    AT_SETUP([$1])
Packit a8ec6b
Packit a8ec6b
    dnl We test some unicode strings and autotest overrides LC_ALL=C, so set it
Packit a8ec6b
    dnl again for every test.
Packit a8ec6b
    if locale -a |grep "^C.utf8" >/dev/null; then
Packit a8ec6b
        LC_ALL="C.UTF-8"
Packit a8ec6b
        export LC_ALL
Packit a8ec6b
    fi
Packit a8ec6b
Packit a8ec6b
    dnl start every test with the default config
Packit a8ec6b
    if test "x${FIREWALLD_DEFAULT_CONFIG}" != x ; then
Packit a8ec6b
        AT_CHECK([if ! cp "${FIREWALLD_DEFAULT_CONFIG}/firewalld.conf" ./firewalld.conf; then exit 77; fi])
Packit a8ec6b
    else
Packit a8ec6b
        AT_CHECK([if ! cp /etc/firewalld/firewalld.conf ./firewalld.conf; then exit 77; fi])
Packit a8ec6b
    fi
Packit a8ec6b
Packit a8ec6b
    m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [
Packit a8ec6b
        AT_KEYWORDS(offline)
Packit a8ec6b
    ], [
Packit a8ec6b
        m4_define_default([FIREWALL_BACKEND], [nftables])
Packit a8ec6b
Packit a8ec6b
        AT_KEYWORDS(FIREWALL_BACKEND)
Packit a8ec6b
Packit a8ec6b
        dnl don't unload modules or bother cleaning up, the namespace will be deleted
Packit a8ec6b
        AT_CHECK([sed -i 's/^CleanupOnExit.*/CleanupOnExit=no/' ./firewalld.conf])
Packit a8ec6b
Packit a8ec6b
        dnl set the appropriate backend
Packit a8ec6b
        AT_CHECK([sed -i 's/^FirewallBackend.*/FirewallBackend=FIREWALL_BACKEND/' ./firewalld.conf])
Packit a8ec6b
Packit a8ec6b
        dnl fib matching is pretty new in nftables. Don't use rpfilter on older
Packit a8ec6b
        dnl kernels.
Packit a8ec6b
        m4_if(nftables, FIREWALL_BACKEND, [
Packit a8ec6b
            IF_HOST_SUPPORTS_NFT_FIB([], [
Packit a8ec6b
                sed -i 's/^IPv6_rpfilter.*/IPv6_rpfilter=no/' ./firewalld.conf
Packit a8ec6b
            ])
Packit a8ec6b
        ])
Packit a8ec6b
Packit a8ec6b
        dnl dummy wrapper for trap syntax
Packit a8ec6b
        function kill_firewalld() {
Packit a8ec6b
            FWD_STOP_FIREWALLD
Packit a8ec6b
        }
Packit a8ec6b
        function kill_networkmanager() {
Packit a8ec6b
            if test -f networkmanager.pid; then
Packit a8ec6b
                STOP_NETWORKMANAGER
Packit a8ec6b
            fi
Packit a8ec6b
        }
Packit a8ec6b
Packit a8ec6b
        dnl run cleanup commands on test exit
Packit a8ec6b
        echo "" > cleanup
Packit a8ec6b
        echo "" > cleanup_late
Packit a8ec6b
        trap ". ./cleanup; kill_firewalld; kill_networkmanager; . ./cleanup_late" EXIT
Packit a8ec6b
Packit a8ec6b
        dnl create a namespace and dbus-daemon
Packit a8ec6b
        m4_define([CURRENT_DBUS_ADDRESS], [unix:abstract=firewalld-testsuite-dbus-system-socket-${at_group_normalized}])
Packit a8ec6b
        m4_define([CURRENT_TEST_NS], [fwd-test-${at_group_normalized}])
Packit a8ec6b
        echo "ip netns delete CURRENT_TEST_NS" >> ./cleanup_late
Packit a8ec6b
        AT_CHECK([ip netns add CURRENT_TEST_NS])
Packit a8ec6b
        AT_DATA([./dbus.conf], [
Packit a8ec6b
            
Packit a8ec6b
            "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
Packit a8ec6b
            <busconfig>
Packit a8ec6b
            <fork />
Packit a8ec6b
            <auth>EXTERNAL</auth>
Packit a8ec6b
            <listen>unix:path=/tmp/dummy</listen>
Packit a8ec6b
            <policy context="default">
Packit a8ec6b
                <allow user="*"/>
Packit a8ec6b
                <allow send_type="signal"/>
Packit a8ec6b
                <allow send_requested_reply="true" send_type="method_return"/>
Packit a8ec6b
                <allow send_requested_reply="true" send_type="error"/>
Packit a8ec6b
                <allow receive_type="method_call"/>
Packit a8ec6b
                <allow receive_type="method_return"/>
Packit a8ec6b
                <allow receive_type="error"/>
Packit a8ec6b
                <allow receive_type="signal"/>
Packit a8ec6b
                <allow send_destination="org.freedesktop.DBus"/>
Packit a8ec6b
            </policy>
Packit a8ec6b
            
Packit a8ec6b
            <policy user="root">
Packit a8ec6b
                <allow own="org.fedoraproject.FirewallD1"/>
Packit a8ec6b
                <allow own="org.fedoraproject.FirewallD1.config"/>
Packit a8ec6b
                <allow send_destination="org.fedoraproject.FirewallD1"/>
Packit a8ec6b
                <allow send_destination="org.fedoraproject.FirewallD1.config"/>
Packit a8ec6b
            </policy>
Packit a8ec6b
            <policy context="default">
Packit a8ec6b
                <allow send_destination="org.fedoraproject.FirewallD1"/>
Packit a8ec6b
                
Packit a8ec6b
                       send_interface="org.freedesktop.DBus.Introspectable"/>
Packit a8ec6b
                
Packit a8ec6b
                       send_interface="org.freedesktop.DBus.Properties"/>
Packit a8ec6b
                <allow send_destination="org.fedoraproject.FirewallD1.config"/>
Packit a8ec6b
            </policy>
Packit a8ec6b
Packit a8ec6b
            
Packit a8ec6b
            <policy user="root">
Packit a8ec6b
                    <allow own="org.freedesktop.NetworkManager"/>
Packit a8ec6b
                    <allow send_destination="org.freedesktop.NetworkManager"/>
Packit a8ec6b
Packit a8ec6b
                    
Packit a8ec6b
                           send_interface="org.freedesktop.NetworkManager.PPP"/>
Packit a8ec6b
Packit a8ec6b
                    <allow send_interface="org.freedesktop.NetworkManager.SecretAgent"/>
Packit a8ec6b
                    
Packit a8ec6b
                         <deny send_interface="..." /> (see dbus-daemon(8) for details).
Packit a8ec6b
                         This seems to override that for the known VPN plugins.
Packit a8ec6b
                      -->
Packit a8ec6b
                    <allow send_destination="org.freedesktop.NetworkManager.openconnect"/>
Packit a8ec6b
                    <allow send_destination="org.freedesktop.NetworkManager.openswan"/>
Packit a8ec6b
                    <allow send_destination="org.freedesktop.NetworkManager.openvpn"/>
Packit a8ec6b
                    <allow send_destination="org.freedesktop.NetworkManager.pptp"/>
Packit a8ec6b
                    <allow send_destination="org.freedesktop.NetworkManager.vpnc"/>
Packit a8ec6b
                    <allow send_destination="org.freedesktop.NetworkManager.ssh"/>
Packit a8ec6b
                    <allow send_destination="org.freedesktop.NetworkManager.iodine"/>
Packit a8ec6b
                    <allow send_destination="org.freedesktop.NetworkManager.l2tp"/>
Packit a8ec6b
                    <allow send_destination="org.freedesktop.NetworkManager.libreswan"/>
Packit a8ec6b
                    <allow send_destination="org.freedesktop.NetworkManager.fortisslvpn"/>
Packit a8ec6b
                    <allow send_destination="org.freedesktop.NetworkManager.strongswan"/>
Packit a8ec6b
                    <allow send_interface="org.freedesktop.NetworkManager.VPN.Plugin"/>
Packit a8ec6b
Packit a8ec6b
                    <allow send_destination="org.fedoraproject.FirewallD1"/>
Packit a8ec6b
Packit a8ec6b
                    
Packit a8ec6b
                         from the dns dnsmasq plugin to own it's dbus name, and for
Packit a8ec6b
                         messages to be sent to it.
Packit a8ec6b
                     -->
Packit a8ec6b
                    <allow own="org.freedesktop.NetworkManager.dnsmasq"/>
Packit a8ec6b
                    <allow send_destination="org.freedesktop.NetworkManager.dnsmasq"/>
Packit a8ec6b
            </policy>
Packit a8ec6b
            </busconfig>
Packit a8ec6b
])
Packit a8ec6b
        DBUS_PID=`NS_CMD([dbus-daemon --address="CURRENT_DBUS_ADDRESS" --print-pid --config-file="./dbus.conf"])`
Packit a8ec6b
        if test $? -ne 0; then
Packit a8ec6b
            AT_FAIL_IF([:])
Packit a8ec6b
        fi
Packit a8ec6b
        echo "kill $DBUS_PID" >> ./cleanup_late
Packit a8ec6b
Packit a8ec6b
        FWD_START_FIREWALLD
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([FWD_END_TEST], [
Packit a8ec6b
    m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [], [
Packit a8ec6b
        IF_HOST_SUPPORTS_IP6TABLES([], [
Packit a8ec6b
            sed -i "/WARNING: ip6tables not usable, disabling IPv6 firewall/d" ./firewalld.log
Packit a8ec6b
        ])
Packit 88d72e
        sed -i "/WARNING: AllowZoneDrifting is enabled./d" ./firewalld.log
Packit a8ec6b
        if test x"$1" != x"ignore"; then
Packit a8ec6b
            if test -n "$1"; then
Packit a8ec6b
                sed -i $1 ./firewalld.log
Packit a8ec6b
            fi
Packit a8ec6b
            AT_FAIL_IF([[grep '^[0-9-]*[ ]\+[0-9:]*[ ]\+\(ERROR\|WARNING\)' ./firewalld.log]])
Packit a8ec6b
        fi
Packit a8ec6b
        m4_undefine([CURRENT_DBUS_ADDRESS])
Packit a8ec6b
        m4_undefine([CURRENT_TEST_NS])
Packit a8ec6b
    ])
Packit a8ec6b
    AT_CLEANUP
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([FWD_OFFLINE_CHECK], [
Packit a8ec6b
    FIREWALL_OFFLINE_CMD_ARGS="--system-config ./"
Packit a8ec6b
    if test "x${FIREWALLD_DEFAULT_CONFIG}" != x ; then
Packit a8ec6b
        FIREWALL_OFFLINE_CMD_ARGS+=" --default-config ${FIREWALLD_DEFAULT_CONFIG}"
Packit a8ec6b
    fi
Packit a8ec6b
Packit a8ec6b
    AT_CHECK([firewall-offline-cmd $FIREWALL_OFFLINE_CMD_ARGS $1], [$2], [$3], [$4], [$5], [$6])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([FWD_CHECK], [
Packit a8ec6b
    m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [
Packit a8ec6b
        dnl Silently skip tests that don't affect permanent config or other
Packit a8ec6b
        dnl flags we're interested in.
Packit a8ec6b
        dnl
Packit a8ec6b
        dnl if TESTING_FIREWALL_OFFLINE_CMD_PASSTHROUGH
Packit a8ec6b
        dnl     firewall-offline-cmd ...
Packit a8ec6b
        dnl else
Packit a8ec6b
        dnl     if ! --permanent
Packit a8ec6b
        dnl         if -default-zone
Packit a8ec6b
        dnl             firewall-offline-cmd ...
Packit a8ec6b
        dnl     else
Packit a8ec6b
        dnl         if ! --timeout
Packit a8ec6b
        dnl             firewall-offline-cmd ...
Packit a8ec6b
        dnl
Packit a8ec6b
        m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD_PASSTHROUGH], [
Packit a8ec6b
            m4_define([FWD_CHECK_RUN_FIREWALL_OFFLINE_CMD])
Packit a8ec6b
        ], [
Packit a8ec6b
            m4_if(-1, m4_index([$1], [--permanent]), [
Packit a8ec6b
                m4_if(-1, m4_index([$1], [-default-zone]), [], [
Packit a8ec6b
                    m4_define([FWD_CHECK_RUN_FIREWALL_OFFLINE_CMD])
Packit a8ec6b
                ])
Packit a8ec6b
                m4_if(-1, m4_index([$1], [--check-config]), [], [
Packit a8ec6b
                    m4_define([FWD_CHECK_RUN_FIREWALL_OFFLINE_CMD])
Packit a8ec6b
                ])
Packit a8ec6b
            ], [
Packit a8ec6b
                m4_if(-1, m4_index([$1], [--timeout]), [
Packit a8ec6b
                    m4_define([FWD_CHECK_RUN_FIREWALL_OFFLINE_CMD])
Packit a8ec6b
                ], [])
Packit a8ec6b
            ])
Packit a8ec6b
        ])
Packit a8ec6b
Packit a8ec6b
        m4_ifdef([FWD_CHECK_RUN_FIREWALL_OFFLINE_CMD], [
Packit a8ec6b
            m4_undefine([FWD_CHECK_RUN_FIREWALL_OFFLINE_CMD])
Packit a8ec6b
Packit a8ec6b
            FWD_OFFLINE_CHECK([dnl
Packit a8ec6b
                dnl This m4 mess is all about stripping --permanent
Packit a8ec6b
                dnl flag if it exists, otherwise we pass arg 1 verbatim.
Packit a8ec6b
                m4_if(-1, m4_index([$1], [--permanent]), [$1], [ dnl
Packit a8ec6b
                    m4_substr([$1],0,m4_index([$1], [--permanent])) dnl before --permanent
Packit a8ec6b
                    m4_substr([$1],m4_eval(m4_index([$1], [--permanent])+11),m4_eval(m4_len([$1])-11)) dnl after --permanent
Packit a8ec6b
                ])], [$2], [$3], [$4], [$5], [$6])
Packit a8ec6b
        ])
Packit a8ec6b
    ], [
Packit a8ec6b
        NS_CHECK([firewall-cmd $1], [$2], [$3], [$4], [$5], [$6])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([FWD_GREP_LOG], [
Packit a8ec6b
    AT_CHECK([grep "$1" ./firewalld.log], 0, [ignore], [ignore])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([TRIM], [[sed -e 's/^[ \t]*//' -e 's/[ \t]*$//']])
Packit a8ec6b
m4_define([TRIMV], [[sed -e '/^[ \t]*$/d']])
Packit a8ec6b
m4_define([TRIM_INTERNAL], [[sed -e 's/[ \t]\+/ /g']])
Packit a8ec6b
m4_define([CHOMP], [printf "%s" "$(cat /dev/stdin)"])
Packit a8ec6b
m4_define([TRIM_WHITESPACE], [TRIM | TRIMV | TRIM_INTERNAL | { CHOMP; echo; }])
Packit a8ec6b
Packit a8ec6b
dnl m4sugar's m4_strip has a bug that causes it to print a space after
Packit a8ec6b
dnl newlines. So implement our own suck-less version.
Packit a8ec6b
m4_define([m4_strip],
Packit a8ec6b
[m4_bpatsubsts([$1], [[	 ]+], [ ],
Packit a8ec6b
                     [^ ?\(.*\) ?$], [\1])])
Packit a8ec6b
Packit a8ec6b
m4_define([NS_CMD], [dnl
Packit a8ec6b
    env DBUS_SYSTEM_BUS_ADDRESS="CURRENT_DBUS_ADDRESS" ip netns exec CURRENT_TEST_NS $1 dnl
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([NS_CHECK], [
Packit a8ec6b
    AT_CHECK([NS_CMD([$1])], [$2], [$3], [$4], [$5], [$6])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
dnl implement PIPESTATUS[0] in a portable way
Packit a8ec6b
dnl
Packit a8ec6b
m4_define([PIPESTATUS0], [dnl
Packit a8ec6b
    sh <<-"HERE"
Packit a8ec6b
    { { { { $1; echo $? >&3; } | $2 >&4; } 3>&1; } | { read RC; exit $RC; } } 4>&1
Packit a8ec6b
HERE
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([EBTABLES_LIST_RULES_NORMALIZE], [dnl
Packit a8ec6b
    TRIM_WHITESPACE | dnl
Packit a8ec6b
    grep -v "^Bridge" | dnl
Packit a8ec6b
    [sed -e 's/\([-][-][-a-zA-Z0-9]\+\)[ ]\+[!]/! \1/g'] dnl
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([EBTABLES_LIST_RULES], [
Packit a8ec6b
    dnl ebtables commit 5f508b76a0ce change list output for inversion.
Packit a8ec6b
    m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [], [
Packit a8ec6b
        NS_CHECK([PIPESTATUS0([ebtables --concurrent -t $1 -L $2], [EBTABLES_LIST_RULES_NORMALIZE])],
Packit a8ec6b
                 [$3], [m4_strip([$4])], [m4_strip([$5])], [$6], [$7])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([IPTABLES_LIST_RULES_NORMALIZE], [dnl
Packit a8ec6b
    TRIM_WHITESPACE | dnl
Packit a8ec6b
    tail -n +3 dnl
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([IPTABLES_LIST_RULES_ALWAYS], [
Packit a8ec6b
    m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [], [
Packit a8ec6b
        NS_CHECK([PIPESTATUS0([$IPTABLES -w -n -t $1 -L $2], [IPTABLES_LIST_RULES_NORMALIZE])],
Packit a8ec6b
                 [$3], [m4_strip([$4])], [m4_strip([$5])], [$6], [$7])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([IPTABLES_LIST_RULES], [
Packit a8ec6b
    m4_if(iptables, FIREWALL_BACKEND, [
Packit a8ec6b
        IPTABLES_LIST_RULES_ALWAYS([$1], [$2], [$3], [$4], [$5], [$6], [$7])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([IP6TABLES_LIST_RULES_NORMALIZE], [dnl
Packit a8ec6b
    TRIM_WHITESPACE | dnl
Packit a8ec6b
    tail -n +3 dnl
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([IP6TABLES_LIST_RULES_ALWAYS], [
Packit a8ec6b
    m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [], [
Packit a8ec6b
        IF_HOST_SUPPORTS_IP6TABLES([
Packit a8ec6b
            NS_CHECK([PIPESTATUS0([$IP6TABLES -w -n -t $1 -L $2], [IP6TABLES_LIST_RULES_NORMALIZE])],
Packit a8ec6b
                     [$3], [m4_strip([$4])], [m4_strip([$5])], [$6], [$7])
Packit a8ec6b
        ])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([IP6TABLES_LIST_RULES], [
Packit a8ec6b
    m4_if(iptables, FIREWALL_BACKEND, [
Packit a8ec6b
        IP6TABLES_LIST_RULES_ALWAYS([$1], [$2], [$3], [$4], [$5], [$6], [$7])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([NFT_LIST_RULES_NORMALIZE], [dnl
Packit a8ec6b
    TRIM_WHITESPACE | dnl
Packit a8ec6b
    dnl nftables commit 6dd848339444 change list output to show "meta mark"
Packit a8ec6b
    dnl instead of just "mark".
Packit a8ec6b
    sed -e 's/meta mark/mark/g'dnl
Packit a8ec6b
        -e '/type.*hook.*priority.*policy.*/d'dnl
Packit a8ec6b
        dnl tranform ct state { established,related } to ct state established,related
Packit a8ec6b
        -e '/ct \(state\|status\)/{s/\(ct \(state\|status\)\) {/\1/g; s/ }//; s/\(@<:@a-z@:>@*\), /\1,/g;}' dnl
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([NFT_LIST_RULES_ALWAYS], [
Packit a8ec6b
    m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [], [
Packit a8ec6b
        NS_CHECK([PIPESTATUS0([nft $NFT_NUMERIC_ARGS list chain $1 firewalld $2], [NFT_LIST_RULES_NORMALIZE])],
Packit a8ec6b
                 [$3], [m4_strip([$4])], [m4_strip([$5])], [$6], [$7])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([NFT_LIST_RULES], [
Packit a8ec6b
    m4_if(nftables, FIREWALL_BACKEND, [
Packit a8ec6b
        NFT_LIST_RULES_ALWAYS([$1], [$2], [$3], [$4], [$5], [$6], [$7])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([IPSET_LIST_SET_NORMALIZE], [dnl
Packit a8ec6b
    TRIM_WHITESPACE |dnl
Packit a8ec6b
    grep -v "^\(Revision\|Header\|Size\|References\|Number\)" |dnl
Packit a8ec6b
    awk 'NR <= 3; NR > 3 {print | "sort"}' dnl
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([IPSET_LIST_SET], [
Packit a8ec6b
    m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [], [
Packit a8ec6b
        NS_CHECK([PIPESTATUS0([ipset list $1], [IPSET_LIST_SET_NORMALIZE])],
Packit a8ec6b
                 [$2], [m4_strip([$3])], [m4_strip([$4])], [$5], [$6])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([NFT_LIST_SET_NORMALIZE], [dnl
Packit a8ec6b
    TRIM_WHITESPACE dnl
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([NFT_LIST_SET_ALWAYS], [
Packit a8ec6b
    m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [], [
Packit a8ec6b
        NS_CHECK([PIPESTATUS0([nft $NFT_NUMERIC_ARGS list set inet firewalld $1], [NFT_LIST_SET_NORMALIZE])],
Packit a8ec6b
                 [$2], [m4_strip([$3])], [m4_strip([$4])], [$5], [$6])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([NFT_LIST_SET], [
Packit a8ec6b
    m4_if(nftables, FIREWALL_BACKEND, [
Packit a8ec6b
        NFT_LIST_SET_ALWAYS([$1], [$2], [$3], [$4], [$5], [$6])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([DBUS_INTROSPECT], [
Packit a8ec6b
    AT_SKIP_IF([! NS_CMD([which gdbus >/dev/null 2>&1])])
Packit a8ec6b
    AT_SKIP_IF([! NS_CMD([which xmllint >/dev/null 2>&1])])
Packit a8ec6b
    NS_CHECK([PIPESTATUS0([gdbus introspect --xml --system --dest=org.fedoraproject.FirewallD1 dnl
Packit a8ec6b
                           m4_ifblank([$1], [--object-path /org/fedoraproject/FirewallD1],
Packit a8ec6b
                                            [--object-path /org/fedoraproject/FirewallD1/$1])], dnl
Packit a8ec6b
                          [m4_ifnblank([$2], [xmllint --xpath '$2' - |]) xmllint --c14n - | TRIM_WHITESPACE])],
Packit a8ec6b
             [$3], [m4_strip([$4])], [m4_strip([$5])], [$6], [$7])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([DBUS_CHECK_NORMALIZE], [dnl
Packit a8ec6b
    [sed -e 's/^({//' -e 's/},)$//' -e 's/>,/>\n/g'] | dnl truncate dictionary output
Packit a8ec6b
    TRIM_WHITESPACE | dnl
Packit a8ec6b
    sort dnl sort dictionaries by keys
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([DBUS_CHECK], [
Packit a8ec6b
    AT_SKIP_IF([! NS_CMD([which gdbus >/dev/null 2>&1])])
Packit a8ec6b
    NS_CHECK([PIPESTATUS0([gdbus call --system --dest=org.fedoraproject.FirewallD1 dnl
Packit a8ec6b
                           m4_ifblank([$1], [--object-path /org/fedoraproject/FirewallD1],
Packit a8ec6b
                                            [--object-path /org/fedoraproject/FirewallD1/$1]) dnl
Packit a8ec6b
                           --method org.fedoraproject.FirewallD1.$2 $3],
Packit a8ec6b
                          [DBUS_CHECK_NORMALIZE])],
Packit a8ec6b
             [$4], [m4_strip([$5])], [m4_strip([$6])], [$7], [$8])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([DBUS_GETALL_NORMALIZE], dnl
Packit a8ec6b
    m4_escape([awk 'BEGIN{line_mark=-99; line=0} {line++; if (line == line_mark + 1) {buffer = $0}; if (line == line_mark + 2) {print buffer " : " $0} } /^dict entry/{line_mark=line}' | sort])dnl
Packit a8ec6b
)
Packit a8ec6b
Packit a8ec6b
m4_define([DBUS_GETALL], [
Packit a8ec6b
    NS_CHECK([dbus-send --system --print-reply --dest=org.fedoraproject.FirewallD1 dnl
Packit a8ec6b
              /org/fedoraproject/FirewallD1/$1 dnl
Packit a8ec6b
              org.freedesktop.DBus.Properties.GetAll string:"org.fedoraproject.FirewallD1.$2" dnl
Packit a8ec6b
              | TRIM_WHITESPACE | DBUS_GETALL_NORMALIZE],
Packit a8ec6b
             [$3], [m4_strip([$4])], [m4_strip([$5])], [$6], [$7])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([DBUS_GET], [
Packit a8ec6b
    NS_CHECK([dbus-send --system --print-reply --dest=org.fedoraproject.FirewallD1 dnl
Packit a8ec6b
              /org/fedoraproject/FirewallD1/$1 dnl
Packit a8ec6b
              org.freedesktop.DBus.Properties.Get string:"org.fedoraproject.FirewallD1.$2" $3 dnl
Packit a8ec6b
              | tail -n +2 | TRIM_WHITESPACE],
Packit a8ec6b
             [$4], [m4_strip([$5])], [m4_strip([$6])], [$7], [$8])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([DBUS_SET], [
Packit a8ec6b
    NS_CHECK([dbus-send --system --print-reply --dest=org.fedoraproject.FirewallD1 dnl
Packit a8ec6b
              /org/fedoraproject/FirewallD1/$1 dnl
Packit a8ec6b
              org.freedesktop.DBus.Properties.Set string:"org.fedoraproject.FirewallD1.$2" $3],
Packit a8ec6b
             [$4], [$5], [$6], [$7], [$8])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([CHECK_IPSET], [
Packit a8ec6b
    m4_if(nftables, FIREWALL_BACKEND, [
Packit a8ec6b
        dnl If our nft binary has buggy flush set, then skip the test
Packit a8ec6b
        NS_CHECK([nft add table inet firewalld_check_ipset])
Packit a8ec6b
        NS_CHECK([nft add set inet firewalld_check_ipset foobar { type ipv4_addr \; }])
Packit a8ec6b
        AT_SKIP_IF([! NS_CMD([nft flush set inet firewalld_check_ipset foobar >/dev/null 2>&1])])
Packit a8ec6b
        dnl If nft set has has no timeout support, then skip the test
Packit a8ec6b
        AT_SKIP_IF([! NS_CMD([nft add set inet firewalld_check_ipset foobar_timeout { type ipv4_addr \; timeout 600s \; } >/dev/null 2>&1])])
Packit a8ec6b
        dnl If nft set has has no size support, then skip the test
Packit a8ec6b
        AT_SKIP_IF([! NS_CMD([nft add set inet firewalld_check_ipset foobar_size { type ipv4_addr \; size 100000 \; } >/dev/null 2>&1])])
Packit a8ec6b
        AT_SKIP_IF([! NS_CMD([nft add set inet firewalld_check_ipset foobar_timeout_size { type ipv4_addr \; timeout 600s \; size 100000 \; } >/dev/null 2>&1])])
Packit a8ec6b
Packit a8ec6b
        dnl If nft set doesn't allow interval + concat, then skip the test
Packit a8ec6b
        AT_SKIP_IF([! NS_CMD([nft add set inet firewalld_check_ipset foobar_interval_concat { type ipv4_addr . inet_service \; flags interval \; } >/dev/null 2>&1])])
Packit a8ec6b
        dnl use JSON to verify a JSON parser bug is also fixed
Packit a8ec6b
        AT_SKIP_IF([! NS_CMD([[nft -j '{"nftables": [{"add": {"element": {"family": "inet", "table": "firewalld_check_ipset", "name": "foobar_interval_concat", "elem": [{"concat": [{"prefix": {"addr": "10.10.10.0", "len": 24}}, {"range": ["1234", "2000"]}]}]}}}]}' >/dev/null 2>&1]])])
Packit a8ec6b
Packit a8ec6b
        NS_CHECK([nft delete table inet firewalld_check_ipset])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([CHECK_IPSET_HASH_MAC], [
Packit a8ec6b
    dnl skip if ipset hash:mac support is there
Packit a8ec6b
    m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [], [
Packit a8ec6b
        AT_SKIP_IF([! ipset --help | grep "hash:mac"])
Packit a8ec6b
        AT_SKIP_IF([! NS_CMD([ipset create foobar hash:mac >/dev/null 2>&1])])
Packit a8ec6b
        NS_CHECK([ipset destroy foobar])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([CHECK_NAT_COEXISTENCE], [
Packit a8ec6b
    dnl verify the host can support simultaneous iptables and nftables NAT
Packit a8ec6b
    m4_if(nftables, FIREWALL_BACKEND, [
Packit a8ec6b
        KERNEL_MAJOR=`uname -r | cut -d. -f1`
Packit a8ec6b
        KERNEL_MINOR=`uname -r | cut -d. -f2`
Packit a8ec6b
        if test ${KERNEL_MAJOR} -eq 4 && test ${KERNEL_MINOR} -ge 18 || test ${KERNEL_MAJOR} -gt 4; then
Packit a8ec6b
            :
Packit a8ec6b
        else
Packit a8ec6b
            AT_SKIP_IF([true])
Packit a8ec6b
        fi
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([CHECK_LOG_AUDIT], [
Packit a8ec6b
    m4_if(nftables, FIREWALL_BACKEND, [
Packit a8ec6b
        NS_CHECK([nft add table inet firewalld_check_log_audit])
Packit a8ec6b
        NS_CHECK([nft add chain inet firewalld_check_log_audit foobar { type filter hook input priority 0 \; } ])
Packit a8ec6b
        AT_SKIP_IF([! NS_CMD([nft add rule inet firewalld_check_log_audit foobar log level audit >/dev/null 2>&1])])
Packit a8ec6b
        NS_CHECK([nft delete table inet firewalld_check_log_audit])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([CHECK_NFT_CT_HELPER], [
Packit a8ec6b
    m4_if(nftables, FIREWALL_BACKEND, [
Packit a8ec6b
        NS_CHECK([nft add table inet firewalld_check_ct_helper])
Packit a8ec6b
        AT_SKIP_IF([! NS_CMD([nft add ct helper inet firewalld helper-ftp-tcp { type \"ftp\" protocol tcp \; } >/dev/null 2>&1])])
Packit a8ec6b
        NS_CHECK([nft delete table inet firewalld_check_ct_helper])
Packit a8ec6b
    ])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([CHECK_MODULE_PROTO_GRE], [
Packit a8ec6b
    AT_SKIP_IF([! NS_CMD([modinfo nf_conntrack_proto_gre])])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([IF_HOST_SUPPORTS_NFT_FIB], [
Packit a8ec6b
    KERNEL_MAJOR=`uname -r | cut -d. -f1`
Packit a8ec6b
    KERNEL_MINOR=`uname -r | cut -d. -f2`
Packit a8ec6b
    if test ${KERNEL_MAJOR} -eq 4 && test ${KERNEL_MINOR} -ge 10 || test ${KERNEL_MAJOR} -gt 4; then
Packit a8ec6b
        :
Packit a8ec6b
        $1
Packit a8ec6b
    else
Packit a8ec6b
        :
Packit a8ec6b
        $2
Packit a8ec6b
    fi
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([IF_HOST_SUPPORTS_IP6TABLES], [
Packit a8ec6b
    if $IP6TABLES -L >/dev/null 2>&1; then
Packit a8ec6b
        :
Packit a8ec6b
        $1
Packit a8ec6b
    else
Packit a8ec6b
        :
Packit a8ec6b
        $2
Packit a8ec6b
    fi
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([IF_HOST_SUPPORTS_IPV6], [
Packit a8ec6b
    if sysctl -a |grep -F "net.ipv6" >/dev/null 2>&1; then
Packit a8ec6b
        :
Packit a8ec6b
        $1
Packit a8ec6b
    else
Packit a8ec6b
        :
Packit a8ec6b
        $2
Packit a8ec6b
    fi
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([IF_HOST_SUPPORTS_IPV6_RULES], [
Packit a8ec6b
    m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [$1], [
Packit a8ec6b
    m4_if(nftables, FIREWALL_BACKEND, [$1], [
Packit a8ec6b
    IF_HOST_SUPPORTS_IP6TABLES([$1], [$2])
Packit a8ec6b
    ])])
Packit a8ec6b
])
Packit a8ec6b
Packit a8ec6b
m4_define([NMCLI_CHECK], [
Packit a8ec6b
    AT_SKIP_IF([! NS_CMD([nmcli connection show >/dev/null 2>&1])])
Packit a8ec6b
    NS_CHECK([PIPESTATUS0([nmcli $1], [TRIM_WHITESPACE])],
Packit a8ec6b
             [$2], [m4_strip([$3])], [m4_strip([$4])], [$5], [$6])
Packit a8ec6b
])
Packit cb8256
Packit cb8256
m4_define([IF_HOST_SUPPORTS_NFT_RULE_INDEX], [
Packit cb8256
    m4_if(nftables, FIREWALL_BACKEND, [
Packit cb8256
        AT_DATA([./nft_rule_index.nft], [
Packit cb8256
            add table inet firewalld_check_rule_index
Packit cb8256
            add chain inet firewalld_check_rule_index foobar { type filter hook input priority 0 ; }
Packit cb8256
            add rule inet firewalld_check_rule_index foobar tcp dport 1234 accept
Packit cb8256
            add rule inet firewalld_check_rule_index foobar accept
Packit cb8256
            insert rule inet firewalld_check_rule_index foobar index 1 udp dport 4321 accept
Packit cb8256
])
Packit cb8256
        NS_CHECK([nft -f ./nft_rule_index.nft])
Packit cb8256
Packit cb8256
        if test "$( NS_CMD([nft list chain inet firewalld_check_rule_index foobar | head -n 5 |tail -n 1 | TRIM_WHITESPACE]) )" = "udp dport 4321 accept"; then
Packit cb8256
            :
Packit cb8256
            $1
Packit cb8256
        else
Packit cb8256
            :
Packit cb8256
            $2
Packit cb8256
        fi
Packit cb8256
Packit cb8256
        NS_CHECK([rm ./nft_rule_index.nft])
Packit cb8256
        NS_CHECK([nft delete table inet firewalld_check_rule_index])
Packit cb8256
    ], [$1])
Packit cb8256
])