diff --git a/.github/workflows/dockerhub.yml b/.github/workflows/dockerhub.yml index b6fd1f247..15ce29dfe 100644 --- a/.github/workflows/dockerhub.yml +++ b/.github/workflows/dockerhub.yml @@ -2,6 +2,7 @@ name: Push to DockerHub on: [push, pull_request] env: + DOCKER_REPO: sippylabs/rtpproxy PLATFORMS: linux/amd64,linux/i386,linux/arm/v7,linux/arm64 BASE_IMAGE: debian:12-slim @@ -41,7 +42,7 @@ jobs: id: meta uses: docker/metadata-action@v3 with: - images: sippylabs/rtpproxy + images: ${{ env.DOCKER_REPO }} tags: | type=schedule type=ref,event=branch @@ -82,6 +83,12 @@ jobs: labels: ${{ steps.meta.outputs.labels }} platforms: ${{ env.PLATFORMS }} + - name: Update DockerHub repo description + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + run: sh -x docker/update_description.sh docker/README.md + - name: Extract ccaches run: | rm -rf ccache diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 000000000..8c08062f9 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,30 @@ +# Official images of the RTPproxy Project + +[![Clean Build@GitHub](https://github.com/sippy/rtpproxy/actions/workflows/cleanbuild.yml/badge.svg?branch=master)](https://github.com/sippy/rtpproxy/actions/workflows/cleanbuild.yml?query=branch%3Amaster++) +[![All-inclusive Build@GitHub](https://github.com/sippy/rtpproxy/actions/workflows/depsbuild.yml/badge.svg?branch=master)](https://github.com/sippy/rtpproxy/actions/workflows/depsbuild.yml?query=branch%3Amaster++) +[![Functional Testing@GitHub](https://github.com/sippy/rtpproxy/actions/workflows/functesting.yml/badge.svg?branch=master)](https://github.com/sippy/rtpproxy/actions/workflows/functesting.yml?query=branch%3Amaster++) +[![Glitching@GitHub](https://github.com/sippy/rtpproxy/actions/workflows/glitching.yml/badge.svg?branch=master)](https://github.com/sippy/rtpproxy/actions/workflows/glitching.yml?query=branch%3Amaster++) +[![OSSFuzz@GitHub](https://github.com/sippy/rtpproxy/actions/workflows/cifuzz.yml/badge.svg?branch=master)](https://github.com/sippy/rtpproxy/actions/workflows/cifuzz.yml?query=branch%3Amaster++) +[![Coverage Status](https://coveralls.io/repos/github/sippy/rtpproxy/badge.svg?branch=master)](https://coveralls.io/github/sippy/rtpproxy?branch=master) +[![Coverity](https://scan.coverity.com/projects/8841/badge.svg)](https://scan.coverity.com/projects/sippy-rtpproxy) + +## About + +The RTPproxy is a extremely reliable and reasonably high-performance software +proxy for RTP streams that can work together with [OpenSIPS](https://opensips.org), +[Kamailio](https://kamailio.org) or [Sippy B2BUA](https://github.com/sippy/b2bua). + +Originally created for handling NAT scenarios, back in 2004-2005, it can also act +as a generic real time datagram relay as well as gateway Real-Time Protocol (RTP) +sessions between IPv4 and IPv6 networks. + +The RTPproxy supports many advanced features and is controllable over +multitude of Layer 4 protocols, including Unix Domain, UDP, UDPv6, TCP and TCPv6. + +The software allows building scalable distributed SIP networks. The rtpproxy module +included into the OpenSIPS or Kamailio SIP Proxy software allows using multiple +RTPproxy instances running on remote machines for fault-tolerance and +load-balancing purposes. + +The image is updated on every commit to the https://github.com/sippy/rtpproxy/ +repository. diff --git a/docker/update_description.sh b/docker/update_description.sh new file mode 100644 index 000000000..821112643 --- /dev/null +++ b/docker/update_description.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +set -e + +md5sum_q() { + md5sum "${@}" | awk '{print $1}' +} + +# Get the JWT token +TOKEN="$(curl -s -H "Content-Type: application/json" -X POST -d '{"username": "'${DOCKER_USERNAME}'", "password": "'${DOCKER_PASSWORD}'"}' https://hub.docker.com/v2/users/login/ | jq -r .token)" +if [ -z "${TOKEN}" -o "${TOKEN}" = "null" ] +then + echo "ERROR: Invalid or no JWT TOKEN returned!" 1>&2 + exit 1 +fi + +BCSUM1="`jq -r .nonce < /dev/null | md5sum_q`" +BCSUM2="`echo | md5sum_q`" + +OLDCSUM="`curl -s -H "Authorization: JWT ${TOKEN}" "https://hub.docker.com/v2/repositories/${DOCKER_REPO}/" | jq -r .full_description | md5sum_q`" +NEWCSUM="`md5sum_q "${1}"`" +if [ "${OLDCSUM}" = "${NEWCSUM}" ] +then + # description is up to date already + exit 0 +fi +if [ "${OLDCSUM}" = "${BCSUM1}" -o "${OLDCSUM}" = "${BCSUM2}" ] +then + echo "ERROR: Empty description read!" 1>&2 + exit 1 +fi + +MYNAME="`basename "${0}"`" +DESCRIPTION_FILE="`mktemp -t ${MYNAME}.XXXXXXX`" +echo '{"full_description": "' > "${DESCRIPTION_FILE}" +perl -0777 -p -e 's|\n\z||' "${1}" | perl -p -e 's|\n|\\n\n|' >> "${DESCRIPTION_FILE}" +echo '"}' >> "${DESCRIPTION_FILE}" + +# Update the description on DockerHub +curl -X PATCH -H "Content-Type: application/json" -H "Authorization: JWT ${TOKEN}" -d @"${DESCRIPTION_FILE}" https://hub.docker.com/v2/repositories/${REPO_USER}/${REPO_NAME}/ +rm "${DESCRIPTION_FILE}"