diff --git a/package/Dockerfile.nettest b/package/Dockerfile.nettest index eedb72048..09cac2dee 100644 --- a/package/Dockerfile.nettest +++ b/package/Dockerfile.nettest @@ -1,32 +1,20 @@ -FROM alpine +ARG FEDORA_VERSION=41 -WORKDIR /app +FROM --platform=${BUILDPLATFORM} fedora:${FEDORA_VERSION} AS base +ARG FEDORA_VERSION +ARG TARGETPLATFORM -RUN apk add --update --no-cache gcc libc-dev make git automake autoconf +COPY scripts/shared/dnf_install / -RUN git clone --depth 1 https://github.com/HewlettPackard/netperf \ - && git -C netperf reset --hard 3bc455b23f901dae377ca0a558e1e32aa56b31c4 -RUN cd netperf \ - && ./autogen.sh \ - && ./configure CFLAGS=-fcommon \ - && make -C src && make -C src install +RUN /dnf_install -a ${TARGETPLATFORM} -v ${FEDORA_VERSION} -r /output/nettest \ + glibc bash glibc-minimal-langpack coreutils-single libcurl-minimal \ + bind-utils curl-minimal iperf3 iputils netperf nmap-ncat tcpdump +FROM scratch +ARG TARGETPLATFORM -FROM alpine +COPY --from=base /output/nettest / -WORKDIR /app - -ARG VERSION - -RUN apk add --no-cache \ - bash \ - bind-tools \ - curl \ - iputils \ - iperf3 \ - tcpdump - -COPY --from=0 /usr/local/bin/net* /usr/local/bin/ COPY scripts/nettest/* /app/ RUN echo ${VERSION} >> /app/version diff --git a/scripts/nettest/metricsproxy b/scripts/nettest/metricsproxy index 5f20f72d1..215c01b05 100755 --- a/scripts/nettest/metricsproxy +++ b/scripts/nettest/metricsproxy @@ -1,4 +1,4 @@ #!/bin/sh # Arguments: source-port target-IP target-port -exec /usr/bin/nc -v -lk -p "$1" -e nc "$2" "$3" +exec /usr/bin/ncat -v -lk -p "$1" -c "/usr/bin/ncat $2 $3" diff --git a/scripts/nettest/nc b/scripts/nettest/nc new file mode 100755 index 000000000..149a4e41d --- /dev/null +++ b/scripts/nettest/nc @@ -0,0 +1,50 @@ +#!/bin/bash + +# This wrapper converts Busybox syntax to nmap ncat: +# * -e becomes -c +# * -w and -i need a s suffix on their argument +# * with -l, -p XX and -s YY become YY XX + +args=() +listening= +sourceport= +sourceaddress= +while [ -n "$1" ] && [ "$1" != "-e" ]; do + case "$1" in + -w|-i) + args+=("$1" "$2"s) + shift 2;; + -l|-lk) + listening=1 + args+=("$1") + shift;; + -p) + sourceport="$2" + shift 2;; + -s) + sourceaddress="$2" + shift 2;; + *) + args+=("$1") + shift;; + esac +done + +if [ -n "$listening" ]; then + args+=(-l ${sourceaddress:+"$sourceaddress"} ${sourceport:+"$sourceport"}) +else + if [ -n "$sourceaddress" ]; then + args+=(-s "$sourceaddress") + fi + if [ -n "$sourceport" ]; then + args+=(-p "$sourceport") + fi +fi + +cmd="" +if [ "$1" = "-e" ]; then + shift + cmd="$*" +fi + +exec /usr/bin/ncat "${args[@]}" ${cmd:+"-c $cmd"} diff --git a/scripts/nettest/simpleserver b/scripts/nettest/simpleserver index c7aaf43e8..92e094f44 100755 --- a/scripts/nettest/simpleserver +++ b/scripts/nettest/simpleserver @@ -3,5 +3,5 @@ set -e while true do - echo -e "HTTP/1.1 200 OK\r\n\r\nHello World" | nc -l -p 8080 + echo -e "HTTP/1.1 200 OK\r\n\r\nHello World" | /usr/bin/ncat -l 8080 done diff --git a/scripts/shared/dnf_install b/scripts/shared/dnf_install new file mode 100755 index 000000000..9a786b2cf --- /dev/null +++ b/scripts/shared/dnf_install @@ -0,0 +1,68 @@ +#!/bin/bash + +# Installs packages using dnf to a named root: +# -a arch - use arch instead of the native arch +# -k - keep the package cache +# -r root - install to the named root instead of /output/base +# -v ver - use the given Fedora version (required) +# +# %arch in the package references will be replaced with the chosen arch + +set -e + +INSTALL_ROOT=/output/base + +# Limit the number of files so that dnf doesn't spend ages processing fds +if [[ $(ulimit -n) -gt 1048576 ]]; then + ulimit -n 1048576 +fi + +while getopts a:kr:v: o +do + case "$o" in + a) + ARCH="$OPTARG" + ;; + k) + KEEP_CACHE=true + ;; + r) + INSTALL_ROOT="$OPTARG" + ;; + v) + FEDORA_VERSION="$OPTARG" + ;; + *) + echo "$0 doesn't support $o" >&2 + exit 1 + ;; + esac +done +shift $((OPTIND - 1)) + +arch_args=() + +if [[ -n "${ARCH}" ]]; then + # Convert container arch to Fedora arch + ARCH="${ARCH##*/}" + case "${ARCH}" in + amd64) ARCH=x86_64;; + arm64) ARCH=aarch64;; + esac + arch_args=(--forcearch "${ARCH}") +else + # This will be used later, but we won't force + ARCH="$(rpm -q --qf "%{arch}" rpm)" +fi + +[[ -z "${FEDORA_VERSION}" ]] && echo I need to know which version of Fedora to install, specify it with -v >&2 && exit 1 + +if [[ "${INSTALL_ROOT}" != /output/base ]] && [[ ! -d "${INSTALL_ROOT}" ]] && [[ -d /output/base ]]; then + cp -a /output/base "${INSTALL_ROOT}" +fi + +dnf -y --setopt=install_weak_deps=0 --nodocs --use-host-config "${arch_args[@]}" \ + --installroot "${INSTALL_ROOT}" --releasever "${FEDORA_VERSION}" \ + install "${@//\%arch/${ARCH}}" + +[[ "${KEEP_CACHE}" == true ]] || dnf -y "${arch_args[@]}" --installroot "${INSTALL_ROOT}" --releasever "${FEDORA_VERSION}" clean all