From 71d20d0e3c469128ac452eb883d5f9721a842a0d Mon Sep 17 00:00:00 2001 From: Sergey Krashevich Date: Wed, 18 Oct 2023 17:49:35 +0300 Subject: [PATCH] Add go2rtc package (#5889) * Add go2rtc package This commit adds the go2rtc package, a camera streaming application with support for various protocols. The package version is 1.7.1. The Makefile, PLIST, and digests for the package are created. The package is also added to the Synology package manager with the necessary configuration files, service setup script, and user interface files for installation and upgrade wizards. The package is configured to run as a background service with a dedicated user group. * Update Maintainer in go2rtc Makefile The maintainer of the go2rtc Makefile has been updated from AlexxIT to skrashevich. This change reflects the current responsibility for the maintenance of this file. * fix PKG_DIST_{NAME,SITE,FILE} vars in cross/go2rtc/Makefile Co-authored-by: hgy59 * Update go2rtc.png * Add new configuration for go2rtc-srtp in go2rtc.sc and update service-setup.sh to include the new configuration if the package status is INSTALL * backport https://github.com/AlexxIT/go2rtc/pull/652 * fix srtp port typo * Update cross/go2rtc/Makefile Co-authored-by: hgy59 * update go2rtc configuration - install go2rtc.yaml file - remove environment-variables file - remove obsolete variables - DSM_UI_DIR: no app icon is created in DSM UI (and app is the default DSM_UI_DIR anyway) - SPK_COMMANDS: there is no cli tool installed (go2rtc is used in SERVICE_COMMAND only) - use sed to inject wizard variables into config file at package installation - remove upgrade wizard * update config - avoid color codes in log output - make config file more expressive by adding all listening ports (even the default ones) - update WebRTC protocol description - remove obsolete PATCH_LEVEL and include in cross/go2rtc/Makefile * force use of ipv4 for srtp * v1.8.1 --------- Co-authored-by: hgy59 --- cross/go2rtc/Makefile | 30 +++++++++++++++++++ cross/go2rtc/PLIST | 1 + cross/go2rtc/digests | 3 ++ spk/go2rtc/Makefile | 35 ++++++++++++++++++++++ spk/go2rtc/src/go2rtc.png | Bin 0 -> 31219 bytes spk/go2rtc/src/go2rtc.sc | 23 ++++++++++++++ spk/go2rtc/src/go2rtc.yaml | 18 +++++++++++ spk/go2rtc/src/service-setup.sh | 15 ++++++++++ spk/go2rtc/src/wizard/install_uifile | 43 +++++++++++++++++++++++++++ 9 files changed, 168 insertions(+) create mode 100644 cross/go2rtc/Makefile create mode 100644 cross/go2rtc/PLIST create mode 100644 cross/go2rtc/digests create mode 100644 spk/go2rtc/Makefile create mode 100644 spk/go2rtc/src/go2rtc.png create mode 100644 spk/go2rtc/src/go2rtc.sc create mode 100644 spk/go2rtc/src/go2rtc.yaml create mode 100644 spk/go2rtc/src/service-setup.sh create mode 100644 spk/go2rtc/src/wizard/install_uifile diff --git a/cross/go2rtc/Makefile b/cross/go2rtc/Makefile new file mode 100644 index 00000000000..51abc78cad1 --- /dev/null +++ b/cross/go2rtc/Makefile @@ -0,0 +1,30 @@ +PKG_NAME = go2rtc +PKG_VERS = 1.8.1 +PKG_EXT = tar.gz +PKG_DIST_NAME = v$(PKG_VERS).$(PKG_EXT) +PKG_DIST_SITE = https://github.com/AlexxIT/go2rtc/archive +PKG_DIST_FILE = $(PKG_NAME)-$(PKG_VERS).$(PKG_EXT) +EXTRACT_PATH = $(WORK_DIR)/src/github.com/$(PKG_NAME) +PKG_DIR = src/github.com/$(PKG_NAME)/$(PKG_NAME) + +BUILD_DEPENDS = native/go + +HOMEPAGE = https://github.com/AlexxIT/go2rtc/ +COMMENT = Ultimate camera streaming application with support RTSP, RTMP, HTTP-FLV, WebRTC, MSE, HLS, MP4, MJPEG, HomeKit, FFmpeg, etc. +LICENSE = MIT + +POST_EXTRACT_TARGET = go2rtc_post_extract + +GO_SRC_DIR = $(EXTRACT_PATH)/$(PKG_NAME) +GO_BIN_DIR = $(GO_SRC_DIR)/$(PKG_NAME) + +GO_BUILD_ARGS = -trimpath +GO_LDFLAGS = -s -w + +include ../../mk/spksrc.cross-go.mk + +.PHONY: go2rtc_post_extract +go2rtc_post_extract: + @$(MSG) Rename extracted folder to make imports work when used as GOPATH + cd $(EXTRACT_PATH) && [ -d "$(PKG_NAME)-$(PKG_VERS)" ] && mv "$(PKG_NAME)-$(PKG_VERS)" $(PKG_NAME) + cd "$(EXTRACT_PATH)/$(PKG_NAME)" && env $(ENV) go mod edit -go=1.20 && env $(ENV) go get github.com/tillberg/autorestart diff --git a/cross/go2rtc/PLIST b/cross/go2rtc/PLIST new file mode 100644 index 00000000000..f2a10b82307 --- /dev/null +++ b/cross/go2rtc/PLIST @@ -0,0 +1 @@ +bin:bin/go2rtc diff --git a/cross/go2rtc/digests b/cross/go2rtc/digests new file mode 100644 index 00000000000..e1924a856c4 --- /dev/null +++ b/cross/go2rtc/digests @@ -0,0 +1,3 @@ +go2rtc-1.8.1.tar.gz SHA1 3144ef9c6979a620abe92305f19853c57d0d8b72 +go2rtc-1.8.1.tar.gz SHA256 5e0019f2e6e8df7b2fa0163064ffe5f2249795b270aca979c46c6a3bef9b7e5f +go2rtc-1.8.1.tar.gz MD5 0261df5faaedafd08eca30d6f6b502e5 diff --git a/spk/go2rtc/Makefile b/spk/go2rtc/Makefile new file mode 100644 index 00000000000..745f4d2fa1a --- /dev/null +++ b/spk/go2rtc/Makefile @@ -0,0 +1,35 @@ +SPK_NAME = go2rtc +SPK_VERS = 1.8.1 +SPK_REV = 1 +SPK_ICON = src/go2rtc.png + +DEPENDS = cross/go2rtc + +UNSUPPORTED_ARCHS = $(PPC_ARCHS) + +MAINTAINER = skrashevich +DESCRIPTION = Ultimate camera streaming application with support RTSP, RTMP, HTTP-FLV, WebRTC, MSE, HLS, MP4, MJPEG, HomeKit, FFmpeg, etc +DISPLAY_NAME = go2rtc +CHANGELOG = "Initial package release" +LICENSE_FILE = $(WORK_DIR)/src/github.com/go2rtc/go2rtc/LICENSE +HOMEPAGE = https://github.com/AlexxIT/go2rtc +LICENSE = MIT + +WIZARDS_DIR = src/wizard + +FWPORTS = src/go2rtc.sc +# Console Port (API and web UI Port) +ADMIN_PORT = 1984 + +SERVICE_USER = auto +STARTABLE = yes +SERVICE_SETUP = src/service-setup.sh + +POST_STRIP_TARGET = go2rtc_extra_install + +include ../../mk/spksrc.spk.mk + +.PHONY: go2rtc_extra_install +go2rtc_extra_install: + @install -d -m 755 $(STAGING_DIR)/var + @install -m 644 src/go2rtc.yaml $(STAGING_DIR)/var/ diff --git a/spk/go2rtc/src/go2rtc.png b/spk/go2rtc/src/go2rtc.png new file mode 100644 index 0000000000000000000000000000000000000000..e6732278633014d47f8893db2e0c72873a2f3df5 GIT binary patch literal 31219 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 z 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 F{vXIj@C*O| literal 0 HcmV?d00001 diff --git a/spk/go2rtc/src/go2rtc.sc b/spk/go2rtc/src/go2rtc.sc new file mode 100644 index 00000000000..6fa60219026 --- /dev/null +++ b/spk/go2rtc/src/go2rtc.sc @@ -0,0 +1,23 @@ +[go2rtc] +title="go2rtc API (HTTP)" +desc="go2rtc API" +port_forward="yes" +dst.ports="1984/tcp" + +[go2rtc_rtsp] +title="go2rtc RTSP (TCP)" +desc="go2rtc RTSP" +port_forward="yes" +dst.ports="8554/tcp" + +[go2rtc_webrtc] +title="go2rtc WebRTC (TCP,UDP)" +desc="go2rtc WebRTC" +port_forward="yes" +dst.ports="8555" + +[go2rtc_srtp] +title="go2rtc SRTP (UDP)" +desc="go2rtc SRTP" +port_forward="yes" +dst.ports="18443/udp" diff --git a/spk/go2rtc/src/go2rtc.yaml b/spk/go2rtc/src/go2rtc.yaml new file mode 100644 index 00000000000..864abfe32f4 --- /dev/null +++ b/spk/go2rtc/src/go2rtc.yaml @@ -0,0 +1,18 @@ +api: + listen: ":1984" + username: @@root_user@@ + password: @@root_password@@ + +log: + format: "text" + level: "info" + +rtsp: + listen: ":8554" + +srtp: + # force use of ipv4 + listen: "0.0.0.0:18443" + +webrtc: + listen: ":8555" diff --git a/spk/go2rtc/src/service-setup.sh b/spk/go2rtc/src/service-setup.sh new file mode 100644 index 00000000000..01515556c9a --- /dev/null +++ b/spk/go2rtc/src/service-setup.sh @@ -0,0 +1,15 @@ + +CFG_FILE="${SYNOPKG_PKGVAR}/go2rtc.yaml" +SERVICE_COMMAND="${SYNOPKG_PKGDEST}/bin/go2rtc -config ${CFG_FILE}" +SVC_BACKGROUND=y +SVC_WRITE_PID=y + + +service_postinst () +{ + if [ "${SYNOPKG_PKG_STATUS}" == "INSTALL" ]; then + sed -e "s|@@root_user@@|${wizard_root_user}|g" \ + -e "s|@@root_password@@|${wizard_root_password}|g" \ + -i ${CFG_FILE} + fi +} diff --git a/spk/go2rtc/src/wizard/install_uifile b/spk/go2rtc/src/wizard/install_uifile new file mode 100644 index 00000000000..bfb4f414d79 --- /dev/null +++ b/spk/go2rtc/src/wizard/install_uifile @@ -0,0 +1,43 @@ +[ + { + "step_title": "go2rtc configuration", + "items": [ + { + "type": "textfield", + "subitems": [ + { + "key": "wizard_root_user", + "desc": "go2rtc root user", + "defaultValue": "", + "validator": { + "allowBlank": false, + "minLength": 3, + "regex": { + "expr": "/^[^<>:*/?\"|]*$/", + "errorText": "Not allowed character in username" + } + } + } + ] + }, + { + "type": "password", + "subitems": [ + { + "key": "wizard_root_password", + "desc": "go2rtc root password", + "defaultValue": "", + "validator": { + "allowBlank": false, + "minLength": 8, + "regex": { + "expr": "/^[^\"|]*$/", + "errorText": "Not allowed character in password" + } + } + } + ] + } + ] + } +]