From f17ea0094a4f5b45c2f54e00046a035c603bb822 Mon Sep 17 00:00:00 2001 From: publicarray Date: Thu, 18 Apr 2024 01:26:44 +1000 Subject: [PATCH 1/9] AdGuardHome --- cross/adguardhome/Makefile | 18 ++++++++++++++ cross/adguardhome/PLIST | 1 + cross/adguardhome/digests | 3 +++ spk/adguardhome/Makefile | 34 +++++++++++++++++++++++++++ spk/adguardhome/src/AdGuardHome.yaml | 2 ++ spk/adguardhome/src/adguardhome.png | Bin 0 -> 1552 bytes spk/adguardhome/src/conf/privilege | 13 ++++++++++ spk/adguardhome/src/service-setup.sh | 10 ++++++++ 8 files changed, 81 insertions(+) create mode 100644 cross/adguardhome/Makefile create mode 100644 cross/adguardhome/PLIST create mode 100644 cross/adguardhome/digests create mode 100644 spk/adguardhome/Makefile create mode 100644 spk/adguardhome/src/AdGuardHome.yaml create mode 100644 spk/adguardhome/src/adguardhome.png create mode 100644 spk/adguardhome/src/conf/privilege create mode 100644 spk/adguardhome/src/service-setup.sh diff --git a/cross/adguardhome/Makefile b/cross/adguardhome/Makefile new file mode 100644 index 00000000000..3fadc2c232e --- /dev/null +++ b/cross/adguardhome/Makefile @@ -0,0 +1,18 @@ +PKG_NAME = adguardhome +PKG_VERS = 0.107.48 +PKG_EXT = tar.gz +PKG_DIST_NAME = v$(PKG_VERS).$(PKG_EXT) +PKG_DIST_SITE = https://github.com/AdguardTeam/$(PKG_NAME)/archive/refs/tags +PKG_DIST_FILE = $(PKG_NAME)-$(PKG_VERS).$(PKG_EXT) +PKG_DIR = $(PKG_NAME)-$(PKG_VERS) + +BUILD_DEPENDS = native/go + +HOMEPAGE = https://github.com/AdguardTeam/$(PKG_NAME) +COMMENT = Network-wide ads & trackers blocking DNS server +LICENSE = GPL-3.0 license + +GO_SRC_DIR = $(WORK_DIR)/AdGuardHome-$(PKG_VERS) +GO_BIN_DIR = $(GO_SRC_DIR)/$(PKG_NAME) + +include ../../mk/spksrc.cross-go.mk \ No newline at end of file diff --git a/cross/adguardhome/PLIST b/cross/adguardhome/PLIST new file mode 100644 index 00000000000..a6059ef0576 --- /dev/null +++ b/cross/adguardhome/PLIST @@ -0,0 +1 @@ +bin:bin/adguardhome diff --git a/cross/adguardhome/digests b/cross/adguardhome/digests new file mode 100644 index 00000000000..d34899d110b --- /dev/null +++ b/cross/adguardhome/digests @@ -0,0 +1,3 @@ +adguardhome-0.107.48.tar.gz SHA1 9d3adecba9e799160ed25292d48cf1ef4386e25a +adguardhome-0.107.48.tar.gz SHA256 189afe8ccc4efd229c3554d812f590cc8727e966c05a6129d444c88a905b83a1 +adguardhome-0.107.48.tar.gz MD5 515ff04dd9bb3884605269fd635c9be6 diff --git a/spk/adguardhome/Makefile b/spk/adguardhome/Makefile new file mode 100644 index 00000000000..15c874390cf --- /dev/null +++ b/spk/adguardhome/Makefile @@ -0,0 +1,34 @@ +SPK_NAME = adguardhome +SPK_VERS = 0.107.48 +SPK_REV = 0 +SPK_ICON = src/adguardhome.png + +DEPENDS = cross/adguardhome +UNSUPPORTED_ARCHS = $(PPC_ARCHS) + +MAINTAINER = publicarray +DISPLAY_NAME = AdGuardHome +DESCRIPTION = "Network-wide ads & trackers blocking DNS server" +HOMEPAGE = https://adguard.com/en/adguard-home/overview.html +LICENSE = Apache-2.0 +CHANGELOG = "First Release" + +CONF_DIR = src/conf +STARTABLE = yes +SERVICE_USER = auto +SERVICE_SETUP = src/service-setup.sh + +SERVICE_PORT = 6053 +SERVICE_PORT_TITLE = $(DISPLAY_NAME) + +# Admin link for in DSM UI +ADMIN_PORT = $(SERVICE_PORT) + +POST_STRIP_TARGET = adguardhome_extra_install + +include ../../mk/spksrc.spk.mk + +.PHONY: adguardhome_extra_install +adguardhome_extra_install: + install -m 755 -d $(STAGING_DIR)/var + install -m 644 src/AdGuardHome.yaml $(STAGING_DIR)/var/AdGuardHome.yaml \ No newline at end of file diff --git a/spk/adguardhome/src/AdGuardHome.yaml b/spk/adguardhome/src/AdGuardHome.yaml new file mode 100644 index 00000000000..93130223ab1 --- /dev/null +++ b/spk/adguardhome/src/AdGuardHome.yaml @@ -0,0 +1,2 @@ +dns: + port: 5053 \ No newline at end of file diff --git a/spk/adguardhome/src/adguardhome.png b/spk/adguardhome/src/adguardhome.png new file mode 100644 index 0000000000000000000000000000000000000000..67af8dd5050f3745ea8382efc5439ad6c06962e0 GIT binary patch literal 1552 zcmV+r2JiWaP)uo=X(VH6#S$+{W! zX#@@dZ|g(Pht2b!>TS6SWIj*};`tF4ABdV;yMY?u1h59M#0StG5|0I|CG zHToP`YC|BN5b=Si`I2ly@@S-$M1iz{a2r^yeyTY2N&LiKg?_Jrha)V+D&1ZK_eWTW z6;!9YyaswkSd2#6xY=Y)%ETsYMv8afcPDNF(uY-D1lG=4&B~d7qOQB1^0uqEWze02 zKWeMty%TG<>Jel0%s*@5d!2o}Q??(c+i4_B)9f|SFsus0uzdPb{x)lsc6_ihk9J3g z(a<{l3{(%3zOXErvWRtQYqjHZ4d*FstuPaQ13v@ThCyFg7EYeehB?{VadU4A`PC=P zR#Azcfl7!xYXXU}*%=iRZ#ImKlzD7T--r#HHr{h84lrPB-23xAKdwTe59Ad++lt7X ziL?1j+A?O1pMl+G=Vp5yc@>{(MgL~f=m}xtQpf&+|72_-#^&j_;->Go*nHWnc*Pm-fxm%MMx#&F z6jF9~@U%&Y9mTe+_1Ht)gr+A=<^P%6iL-lB( zRUM`-ZZIC} z+#m)-J+R+O?Z+xUr7B=$QdGC!;ACxql`8!?;l2C%6Do6f5oDj)7MyMuZ(Te=H?6jOSeeC5&J)+t(o`%BY%KmiXQ?10RR7hM8MRRZ`%|A0000 Date: Thu, 18 Apr 2024 01:39:54 +1000 Subject: [PATCH 2/9] update privilege file --- spk/adguardhome/src/conf/privilege | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spk/adguardhome/src/conf/privilege b/spk/adguardhome/src/conf/privilege index dc1d50b4e94..87fbd9dbe93 100644 --- a/spk/adguardhome/src/conf/privilege +++ b/spk/adguardhome/src/conf/privilege @@ -7,7 +7,7 @@ "relpath": "bin/adguardhome", "user": "package", "group": "package", - "capabilities": "cap_net_raw", + "capabilities": "cap_net_bind_service,cap_net_raw", "permission": "0700" }] } From 0dc68d1c94714e9e5d831dea7d0c05d69bd0fcce Mon Sep 17 00:00:00 2001 From: publicarray Date: Sat, 20 Apr 2024 13:22:06 +1000 Subject: [PATCH 3/9] Add Web UI to AdGuard Home and run DNS on port 5053 so it can run without root --- cross/adguardhome/Makefile | 16 ++++++++++++---- spk/adguardhome/Makefile | 5 +++-- spk/adguardhome/src/AdGuardHome.yaml | 2 -- spk/adguardhome/src/AdGuardHome.yml | 5 +++++ spk/adguardhome/src/conf/privilege | 13 ------------- spk/adguardhome/src/service-setup.sh | 12 ++++-------- spk/adguardhome/src/wizard/install_uifile | 8 ++++++++ 7 files changed, 32 insertions(+), 29 deletions(-) delete mode 100644 spk/adguardhome/src/AdGuardHome.yaml create mode 100644 spk/adguardhome/src/AdGuardHome.yml delete mode 100644 spk/adguardhome/src/conf/privilege create mode 100644 spk/adguardhome/src/wizard/install_uifile diff --git a/cross/adguardhome/Makefile b/cross/adguardhome/Makefile index 3fadc2c232e..e5472d307c2 100644 --- a/cross/adguardhome/Makefile +++ b/cross/adguardhome/Makefile @@ -4,15 +4,23 @@ PKG_EXT = tar.gz PKG_DIST_NAME = v$(PKG_VERS).$(PKG_EXT) PKG_DIST_SITE = https://github.com/AdguardTeam/$(PKG_NAME)/archive/refs/tags PKG_DIST_FILE = $(PKG_NAME)-$(PKG_VERS).$(PKG_EXT) -PKG_DIR = $(PKG_NAME)-$(PKG_VERS) - -BUILD_DEPENDS = native/go +PKG_DIR = AdGuardHome-$(PKG_VERS) +BUILD_DEPENDS = native/go native/nodejs HOMEPAGE = https://github.com/AdguardTeam/$(PKG_NAME) COMMENT = Network-wide ads & trackers blocking DNS server LICENSE = GPL-3.0 license GO_SRC_DIR = $(WORK_DIR)/AdGuardHome-$(PKG_VERS) GO_BIN_DIR = $(GO_SRC_DIR)/$(PKG_NAME) +PATH := $(WORK_DIR)/../../../native/nodejs/work-native/node/bin:$(PATH) +PRE_COMPILE_TARGET = adguardhome_pre_compile +# avoid webpack error ERR_OSSL_EVP_UNSUPPORTED with nodejs 18 +ENV += NODE_OPTIONS=--openssl-legacy-provider + +include ../../mk/spksrc.cross-go.mk -include ../../mk/spksrc.cross-go.mk \ No newline at end of file +.PHONY: adguardhome_pre_compile +adguardhome_pre_compile: + @$(RUN) $(MAKE) js-deps + @$(RUN) $(MAKE) js-build \ No newline at end of file diff --git a/spk/adguardhome/Makefile b/spk/adguardhome/Makefile index 15c874390cf..e48040882f3 100644 --- a/spk/adguardhome/Makefile +++ b/spk/adguardhome/Makefile @@ -13,7 +13,6 @@ HOMEPAGE = https://adguard.com/en/adguard-home/overview.html LICENSE = Apache-2.0 CHANGELOG = "First Release" -CONF_DIR = src/conf STARTABLE = yes SERVICE_USER = auto SERVICE_SETUP = src/service-setup.sh @@ -24,6 +23,8 @@ SERVICE_PORT_TITLE = $(DISPLAY_NAME) # Admin link for in DSM UI ADMIN_PORT = $(SERVICE_PORT) +WIZARDS_DIR = src/wizard + POST_STRIP_TARGET = adguardhome_extra_install include ../../mk/spksrc.spk.mk @@ -31,4 +32,4 @@ include ../../mk/spksrc.spk.mk .PHONY: adguardhome_extra_install adguardhome_extra_install: install -m 755 -d $(STAGING_DIR)/var - install -m 644 src/AdGuardHome.yaml $(STAGING_DIR)/var/AdGuardHome.yaml \ No newline at end of file + install -m 644 src/AdGuardHome.yml $(STAGING_DIR)/var/AdGuardHome.yml \ No newline at end of file diff --git a/spk/adguardhome/src/AdGuardHome.yaml b/spk/adguardhome/src/AdGuardHome.yaml deleted file mode 100644 index 93130223ab1..00000000000 --- a/spk/adguardhome/src/AdGuardHome.yaml +++ /dev/null @@ -1,2 +0,0 @@ -dns: - port: 5053 \ No newline at end of file diff --git a/spk/adguardhome/src/AdGuardHome.yml b/spk/adguardhome/src/AdGuardHome.yml new file mode 100644 index 00000000000..d00f0e17226 --- /dev/null +++ b/spk/adguardhome/src/AdGuardHome.yml @@ -0,0 +1,5 @@ +dns: + port: 5053 +os: + group: "synocommunity" + user: "sc-adguardhome" \ No newline at end of file diff --git a/spk/adguardhome/src/conf/privilege b/spk/adguardhome/src/conf/privilege deleted file mode 100644 index 87fbd9dbe93..00000000000 --- a/spk/adguardhome/src/conf/privilege +++ /dev/null @@ -1,13 +0,0 @@ -{ - "defaults": { - "run-as": "package" - }, - "username": "sc-adguardhome", - "tool": [{ - "relpath": "bin/adguardhome", - "user": "package", - "group": "package", - "capabilities": "cap_net_bind_service,cap_net_raw", - "permission": "0700" - }] -} diff --git a/spk/adguardhome/src/service-setup.sh b/spk/adguardhome/src/service-setup.sh index a525d3dd80f..c24524d71d1 100644 --- a/spk/adguardhome/src/service-setup.sh +++ b/spk/adguardhome/src/service-setup.sh @@ -1,10 +1,6 @@ ADGUARDHOME="${SYNOPKG_PKGDEST}/bin/adguardhome" -CFG_FILE="${SYNOPKG_PKGVAR}/var/AdGuardHome.yml" -PID_FILE="${SYNOPKG_PKGVAR}/var/adguardhome.pid" +CFG_FILE="${SYNOPKG_PKGVAR}/AdGuardHome.yml" +PID_FILE="${SYNOPKG_PKGVAR}/adguardhome.pid" WEB_UI="0.0.0.0:${SYNOPKG_PKGPORT}" -SERVICE_COMMAND="${ADGUARDHOME} --web-addr ${WEB_UI} -c ${CFG_FILE} --pidfile ${PID_FILE} -l ${LOG_FILE}" -SVC_BACKGROUND=y - -# service_postinst() { -# setcap 'CAP_NET_BIND_SERVICE=+eip CAP_NET_RAW=+eip' $(ADGUARDHOME) -# } \ No newline at end of file +SERVICE_COMMAND="${ADGUARDHOME} --web-addr ${WEB_UI} -c ${CFG_FILE} --pidfile ${PID_FILE} -l ${LOG_FILE} --work-dir ${SYNOPKG_PKGVAR}" +SVC_BACKGROUND=y \ No newline at end of file diff --git a/spk/adguardhome/src/wizard/install_uifile b/spk/adguardhome/src/wizard/install_uifile new file mode 100644 index 00000000000..4fef2e20ce1 --- /dev/null +++ b/spk/adguardhome/src/wizard/install_uifile @@ -0,0 +1,8 @@ +[{ + "step_title": "Install Instructions", + "items": [{ + "desc": "Please unselect 'Run after installation', To run adguard you need to rirst run the following command via SSH and everytime there is an update" + }, { + "desc": "setcap 'CAP_NET_BIND_SERVICE=+eip CAP_NET_RAW=+eip' /var/packages/adguardhome/target/bin/adguardhome" + }] +}] From 36855691745bd9817ebb51380b34051310e0c666 Mon Sep 17 00:00:00 2001 From: publicarray Date: Sat, 20 Apr 2024 14:41:58 +1000 Subject: [PATCH 4/9] improve icon --- spk/adguardhome/src/adguardhome.png | Bin 1552 -> 46797 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/spk/adguardhome/src/adguardhome.png b/spk/adguardhome/src/adguardhome.png index 67af8dd5050f3745ea8382efc5439ad6c06962e0..f6eeeb7a37381a4d0dfa85b083cf3b125f7ed76a 100644 GIT binary patch literal 46797 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 Date: Sat, 20 Apr 2024 17:32:05 +1000 Subject: [PATCH 5/9] Patched out the privilege check as it wasn't working even with the correct capabilities. --- cross/adguardhome/Makefile | 2 ++ .../patches/fix-unprivilaged-ports-check.patch | 11 +++++++++++ spk/adguardhome/Makefile | 10 ++-------- spk/adguardhome/src/AdGuardHome.yml | 5 ----- spk/adguardhome/src/service-setup.sh | 8 ++++++-- spk/adguardhome/src/wizard/install_uifile | 4 ++-- 6 files changed, 23 insertions(+), 17 deletions(-) create mode 100644 cross/adguardhome/patches/fix-unprivilaged-ports-check.patch delete mode 100644 spk/adguardhome/src/AdGuardHome.yml diff --git a/cross/adguardhome/Makefile b/cross/adguardhome/Makefile index e5472d307c2..120bf286a2c 100644 --- a/cross/adguardhome/Makefile +++ b/cross/adguardhome/Makefile @@ -11,8 +11,10 @@ HOMEPAGE = https://github.com/AdguardTeam/$(PKG_NAME) COMMENT = Network-wide ads & trackers blocking DNS server LICENSE = GPL-3.0 license +PATCHES_LEVEL = 1 GO_SRC_DIR = $(WORK_DIR)/AdGuardHome-$(PKG_VERS) GO_BIN_DIR = $(GO_SRC_DIR)/$(PKG_NAME) +GO_BUILD_ARGS += -ldflags "-X 'github.com/AdguardTeam/AdGuardHome/internal/version.version=v$(PKG_VERS)' -X 'github.com/AdguardTeam/AdGuardHome/internal/version.channel=release'" PATH := $(WORK_DIR)/../../../native/nodejs/work-native/node/bin:$(PATH) PRE_COMPILE_TARGET = adguardhome_pre_compile # avoid webpack error ERR_OSSL_EVP_UNSUPPORTED with nodejs 18 diff --git a/cross/adguardhome/patches/fix-unprivilaged-ports-check.patch b/cross/adguardhome/patches/fix-unprivilaged-ports-check.patch new file mode 100644 index 00000000000..0498acce26d --- /dev/null +++ b/cross/adguardhome/patches/fix-unprivilaged-ports-check.patch @@ -0,0 +1,11 @@ +--- a/internal/aghnet/net_linux.go ++++ b/internal/aghnet/net_linux.go +@@ -22,6 +22,7 @@ + const dhcpcdConf = "etc/dhcpcd.conf" + + func canBindPrivilegedPorts() (can bool, err error) { ++ return true, nil + res, err := unix.PrctlRetInt( + unix.PR_CAP_AMBIENT, + unix.PR_CAP_AMBIENT_IS_SET, + diff --git a/spk/adguardhome/Makefile b/spk/adguardhome/Makefile index e48040882f3..9bece58a955 100644 --- a/spk/adguardhome/Makefile +++ b/spk/adguardhome/Makefile @@ -5,6 +5,7 @@ SPK_ICON = src/adguardhome.png DEPENDS = cross/adguardhome UNSUPPORTED_ARCHS = $(PPC_ARCHS) +SPK_CONFLICT = DNSServer DhcpServer MAINTAINER = publicarray DISPLAY_NAME = AdGuardHome @@ -25,11 +26,4 @@ ADMIN_PORT = $(SERVICE_PORT) WIZARDS_DIR = src/wizard -POST_STRIP_TARGET = adguardhome_extra_install - -include ../../mk/spksrc.spk.mk - -.PHONY: adguardhome_extra_install -adguardhome_extra_install: - install -m 755 -d $(STAGING_DIR)/var - install -m 644 src/AdGuardHome.yml $(STAGING_DIR)/var/AdGuardHome.yml \ No newline at end of file +include ../../mk/spksrc.spk.mk \ No newline at end of file diff --git a/spk/adguardhome/src/AdGuardHome.yml b/spk/adguardhome/src/AdGuardHome.yml deleted file mode 100644 index d00f0e17226..00000000000 --- a/spk/adguardhome/src/AdGuardHome.yml +++ /dev/null @@ -1,5 +0,0 @@ -dns: - port: 5053 -os: - group: "synocommunity" - user: "sc-adguardhome" \ No newline at end of file diff --git a/spk/adguardhome/src/service-setup.sh b/spk/adguardhome/src/service-setup.sh index c24524d71d1..daa95e147f4 100644 --- a/spk/adguardhome/src/service-setup.sh +++ b/spk/adguardhome/src/service-setup.sh @@ -2,5 +2,9 @@ ADGUARDHOME="${SYNOPKG_PKGDEST}/bin/adguardhome" CFG_FILE="${SYNOPKG_PKGVAR}/AdGuardHome.yml" PID_FILE="${SYNOPKG_PKGVAR}/adguardhome.pid" WEB_UI="0.0.0.0:${SYNOPKG_PKGPORT}" -SERVICE_COMMAND="${ADGUARDHOME} --web-addr ${WEB_UI} -c ${CFG_FILE} --pidfile ${PID_FILE} -l ${LOG_FILE} --work-dir ${SYNOPKG_PKGVAR}" -SVC_BACKGROUND=y \ No newline at end of file +SERVICE_COMMAND="${ADGUARDHOME} --web-addr ${WEB_UI} --config ${CFG_FILE} --pidfile ${PID_FILE} --logfile ${LOG_FILE} --work-dir ${SYNOPKG_PKGVAR}" +SVC_BACKGROUND=y + +service_postinst () { + mkdir -p "${SYNOPKG_PKGVAR}/data/" +} \ No newline at end of file diff --git a/spk/adguardhome/src/wizard/install_uifile b/spk/adguardhome/src/wizard/install_uifile index 4fef2e20ce1..0532f45e2ac 100644 --- a/spk/adguardhome/src/wizard/install_uifile +++ b/spk/adguardhome/src/wizard/install_uifile @@ -1,8 +1,8 @@ [{ "step_title": "Install Instructions", "items": [{ - "desc": "Please unselect 'Run after installation', To run adguard you need to rirst run the following command via SSH and everytime there is an update" + "desc": "Please unselect 'Run after installation', To run adguard you need to first run the following command via SSH and everytime there is an update" }, { - "desc": "setcap 'CAP_NET_BIND_SERVICE=+eip CAP_NET_RAW=+eip' /var/packages/adguardhome/target/bin/adguardhome" + "desc": "setcap 'CAP_NET_BIND_SERVICE=+eip CAP_NET_RAW=+eip' /var/packages/adguardhome/target/bin/adguardhome" }] }] From 3a093ad7359c1a2cd7b410303f71e77944bbc9a3 Mon Sep 17 00:00:00 2001 From: publicarray Date: Sat, 20 Apr 2024 17:44:58 +1000 Subject: [PATCH 6/9] make it easier to select the command --- spk/adguardhome/src/wizard/install_uifile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spk/adguardhome/src/wizard/install_uifile b/spk/adguardhome/src/wizard/install_uifile index 0532f45e2ac..22652d60c0e 100644 --- a/spk/adguardhome/src/wizard/install_uifile +++ b/spk/adguardhome/src/wizard/install_uifile @@ -3,6 +3,6 @@ "items": [{ "desc": "Please unselect 'Run after installation', To run adguard you need to first run the following command via SSH and everytime there is an update" }, { - "desc": "setcap 'CAP_NET_BIND_SERVICE=+eip CAP_NET_RAW=+eip' /var/packages/adguardhome/target/bin/adguardhome" + "desc": "setcap 'CAP_NET_BIND_SERVICE=+eip CAP_NET_RAW=+eip' /var/packages/adguardhome/target/bin/adguardhome" }] }] From 62d3b2e15848a1341fd21f8c9ee6f4a352c95234 Mon Sep 17 00:00:00 2001 From: publicarray Date: Sat, 20 Apr 2024 17:52:00 +1000 Subject: [PATCH 7/9] fix spelling --- ...laged-ports-check.patch => fix-unprivileged-ports-check.patch} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cross/adguardhome/patches/{fix-unprivilaged-ports-check.patch => fix-unprivileged-ports-check.patch} (100%) diff --git a/cross/adguardhome/patches/fix-unprivilaged-ports-check.patch b/cross/adguardhome/patches/fix-unprivileged-ports-check.patch similarity index 100% rename from cross/adguardhome/patches/fix-unprivilaged-ports-check.patch rename to cross/adguardhome/patches/fix-unprivileged-ports-check.patch From 33769e12c934293f4d95fe7f1f757266dd3e167f Mon Sep 17 00:00:00 2001 From: publicarray Date: Sat, 20 Apr 2024 17:54:36 +1000 Subject: [PATCH 8/9] small fixes --- spk/adguardhome/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spk/adguardhome/Makefile b/spk/adguardhome/Makefile index 9bece58a955..1d08790a15d 100644 --- a/spk/adguardhome/Makefile +++ b/spk/adguardhome/Makefile @@ -11,8 +11,8 @@ MAINTAINER = publicarray DISPLAY_NAME = AdGuardHome DESCRIPTION = "Network-wide ads & trackers blocking DNS server" HOMEPAGE = https://adguard.com/en/adguard-home/overview.html -LICENSE = Apache-2.0 -CHANGELOG = "First Release" +LICENSE = GPL-3.0 +CHANGELOG = "Initial release" STARTABLE = yes SERVICE_USER = auto From 72d48495ba8fb8462b83aaa232a75440f925feb3 Mon Sep 17 00:00:00 2001 From: publicarray Date: Sat, 20 Apr 2024 17:55:46 +1000 Subject: [PATCH 9/9] extra word --- cross/adguardhome/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cross/adguardhome/Makefile b/cross/adguardhome/Makefile index 120bf286a2c..3aefc6c0c61 100644 --- a/cross/adguardhome/Makefile +++ b/cross/adguardhome/Makefile @@ -9,7 +9,7 @@ PKG_DIR = AdGuardHome-$(PKG_VERS) BUILD_DEPENDS = native/go native/nodejs HOMEPAGE = https://github.com/AdguardTeam/$(PKG_NAME) COMMENT = Network-wide ads & trackers blocking DNS server -LICENSE = GPL-3.0 license +LICENSE = GPL-3.0 PATCHES_LEVEL = 1 GO_SRC_DIR = $(WORK_DIR)/AdGuardHome-$(PKG_VERS)