From 5c642236c600180459e14e07f600a9e58f6369f5 Mon Sep 17 00:00:00 2001 From: Smaarn Date: Thu, 25 Mar 2021 20:29:50 +0100 Subject: [PATCH 01/31] memcached: bump 1.4.13 -> 1.6.9 + reworked to use standard "framework" --- cross/memcached/Makefile | 2 +- cross/memcached/digests | 6 +- .../memcached/patches/001-remove-werror.patch | 10 +- .../patches/aarch64/001-crc32-support.patch | 36 ++++++ cross/phpmemcachedadmin/Makefile | 11 +- cross/phpmemcachedadmin/digests | 6 +- spk/memcached/Makefile | 17 +-- spk/memcached/src/app/config | 1 + spk/memcached/src/conf/privilege | 31 ----- spk/memcached/src/dsm-control.sh | 93 --------------- spk/memcached/src/installer.sh | 106 ------------------ spk/memcached/src/service-setup.sh | 43 +++++++ 12 files changed, 107 insertions(+), 255 deletions(-) create mode 100644 cross/memcached/patches/aarch64/001-crc32-support.patch delete mode 100644 spk/memcached/src/conf/privilege delete mode 100755 spk/memcached/src/dsm-control.sh delete mode 100755 spk/memcached/src/installer.sh create mode 100644 spk/memcached/src/service-setup.sh diff --git a/cross/memcached/Makefile b/cross/memcached/Makefile index f03a7b0db39..6a7ac7a31a4 100644 --- a/cross/memcached/Makefile +++ b/cross/memcached/Makefile @@ -1,5 +1,5 @@ PKG_NAME = memcached -PKG_VERS = 1.4.15 +PKG_VERS = 1.6.9 PKG_EXT = tar.gz PKG_DIST_NAME = $(PKG_NAME)-$(PKG_VERS).$(PKG_EXT) PKG_DIST_SITE = http://www.memcached.org/files diff --git a/cross/memcached/digests b/cross/memcached/digests index 0c09b9dc326..001501b91a2 100644 --- a/cross/memcached/digests +++ b/cross/memcached/digests @@ -1,3 +1,3 @@ -memcached-1.4.15.tar.gz SHA1 12ec84011f408846250a462ab9e8e967a2e8cbbc -memcached-1.4.15.tar.gz SHA256 169721ab7a7531add6ae9f6b14b6b5641725fe0b1f0bdf5c3a4327725901e2b4 -memcached-1.4.15.tar.gz MD5 36ea966f5a29655be1746bf4949f7f69 +memcached-1.6.9.tar.gz SHA1 42ae062094fdf083cfe7b21ff377c781011c2be1 +memcached-1.6.9.tar.gz SHA256 d5a62ce377314dbffdb37c4467e7763e3abae376a16171e613cbe69956f092d1 +memcached-1.6.9.tar.gz MD5 ee802a316d7d622aaaec22382ca65004 diff --git a/cross/memcached/patches/001-remove-werror.patch b/cross/memcached/patches/001-remove-werror.patch index db1be904361..df9880282cb 100644 --- a/cross/memcached/patches/001-remove-werror.patch +++ b/cross/memcached/patches/001-remove-werror.patch @@ -1,17 +1,17 @@ --- configure.ac.orig 2012-09-03 09:35:54.000000000 +0200 +++ configure.ac 2012-12-08 00:31:35.000000000 +0100 -@@ -534,12 +534,12 @@ +@@ -788,12 +788,12 @@ if test "$ICC" = "yes" then dnl ICC trying to be gcc. - CFLAGS="$CFLAGS -diag-disable 187 -Wall -Werror" + CFLAGS="$CFLAGS -diag-disable 187 -Wall" - AC_DEFINE([_GNU_SOURCE],[1],[find sigignore on Linux]) + AC_DEFINE([_GNU_SOURCE],[1],[make sure IOV_MAX is defined]) elif test "$GCC" = "yes" then GCC_VERSION=`$CC -dumpversion` - CFLAGS="$CFLAGS -Wall -Werror -pedantic -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls" + CFLAGS="$CFLAGS -Wall -pedantic -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls" - case $GCC_VERSION in - 4.4.*) - CFLAGS="$CFLAGS -fno-strict-aliasing" + if test "x$enable_asan" = "xyes"; then + CFLAGS="$CFLAGS -fsanitize=address" + fi diff --git a/cross/memcached/patches/aarch64/001-crc32-support.patch b/cross/memcached/patches/aarch64/001-crc32-support.patch new file mode 100644 index 00000000000..b9f0e18b1a3 --- /dev/null +++ b/cross/memcached/patches/aarch64/001-crc32-support.patch @@ -0,0 +1,36 @@ +From 0548859b47a90fcbe5da97ed2a71e2660384cc48 Mon Sep 17 00:00:00 2001 +From: Sergey Dryabzhinsky +Date: Tue, 24 Nov 2020 22:16:56 +0300 +Subject: [PATCH] For issue #743 - Fix missing hw crc32 capability check on + arm64 for old gcc/libc + +--- + crc32c.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/crc32c.c b/crc32c.c +index 916e0e67e..d2e359826 100644 +--- crc32c.c ++++ crc32c.c +@@ -275,7 +275,7 @@ void crc32c_init(void) { + + #elif defined(__aarch64__) && defined(__linux__) + #include +- ++#if defined(HWCAP_CRC32) + static inline uint32_t crc32cx(uint32_t crc, const uint64_t data) + { + asm(".arch_extension crc\n" +@@ -336,6 +336,12 @@ void crc32c_init(void) { + if (auxv & HWCAP_CRC32) + crc32c = crc32c_hw; + } ++#else /* no hw crc32 on arm64 system supported? old compiler/libc/kernel? */ ++void crc32c_init(void) { ++ crc32c = crc32c_sw; ++} ++#endif ++ + #else /* !__x86_64__i && !__aarch64__ */ + void crc32c_init(void) { + crc32c = crc32c_sw; \ No newline at end of file diff --git a/cross/phpmemcachedadmin/Makefile b/cross/phpmemcachedadmin/Makefile index a28c3347f48..954b4e9948f 100644 --- a/cross/phpmemcachedadmin/Makefile +++ b/cross/phpmemcachedadmin/Makefile @@ -1,8 +1,9 @@ PKG_NAME = phpMemcachedAdmin -PKG_VERS = 1.2.2-r262 +PKG_VERS = 1.3.0 PKG_EXT = tar.gz -PKG_DIST_NAME = $(PKG_NAME)-$(PKG_VERS).$(PKG_EXT) -PKG_DIST_SITE = https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/phpmemcacheadmin +PKG_DIST_NAME = $(PKG_VERS).$(PKG_EXT) +PKG_DIST_FILE = $(PKG_NAME)-$(PKG_VERS).$(PKG_EXT) +PKG_DIST_SITE = https://github.com/elijaa/phpmemcachedadmin/archive/refs/tags PKG_DIR = $(PKG_NAME)-$(PKG_VERS) DEPENDS = @@ -20,5 +21,5 @@ include ../../mk/spksrc.cross-cc.mk .PHONY: phpmemcachedadmin_install phpmemcachedadmin_install: - mkdir -p $(STAGING_INSTALL_PREFIX)/share/phpMemcachedAdmin - tar -cf - -C $(WORK_DIR)/$(PKG_DIR) . | tar -xf - -C $(STAGING_INSTALL_PREFIX)/share/phpMemcachedAdmin + mkdir -p $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME) + tar -cf - -C $(WORK_DIR)/$(PKG_DIR)/phpmemcachedadmin-$(PKG_VERS) . | tar -xf - -C $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME) diff --git a/cross/phpmemcachedadmin/digests b/cross/phpmemcachedadmin/digests index 71cefe85750..bd735f1fd31 100644 --- a/cross/phpmemcachedadmin/digests +++ b/cross/phpmemcachedadmin/digests @@ -1,3 +1,3 @@ -phpMemcachedAdmin-1.2.2-r262.tar.gz SHA1 616d33deeb54c7bb0b894b23589afc81aa3f67f5 -phpMemcachedAdmin-1.2.2-r262.tar.gz SHA256 10022211593c78b4eaaec16054843979f0b98ed72e86ee93e4fe79bf35c383e3 -phpMemcachedAdmin-1.2.2-r262.tar.gz MD5 93ce23bc02f8f262d55d749d40058388 +phpMemcachedAdmin-1.3.0.tar.gz SHA1 101fcae71834c466e51950e02bcaa6998ecbc4bc +phpMemcachedAdmin-1.3.0.tar.gz SHA256 9afae91888c991ad11a3d0433dc86720b4b08cf1320391cffb471f24bdabda2c +phpMemcachedAdmin-1.3.0.tar.gz MD5 195eb5e718be44c4e2c7b82c3dff6693 diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index c26e9355147..39e76e39429 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -1,6 +1,6 @@ SPK_NAME = memcached -SPK_VERS = 1.4.15 -SPK_REV = 2 +SPK_VERS = 1.6.9 +SPK_REV = 3 SPK_ICON = src/memcached.png DSM_UI_DIR = app @@ -10,20 +10,21 @@ MAINTAINER = Diaoul DESCRIPTION = Free \& open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load. It comes with phpMemcachedAdmin, a graphic stand-alone administration for memcached to monitor and debug purpose. ADMIN_URL = /phpMemcachedAdmin/ DISPLAY_NAME = Memcached -CHANGELOG = "1. Use 64-bit toolchains for bromolow, cedarview and x86" +CHANGELOG = "1. Bump 1.4.13 -> 1.6.9" HOMEPAGE = https://memcached.org/ LICENSE = -INSTALLER_SCRIPT = src/installer.sh -SSS_SCRIPT = src/dsm-control.sh -CONF_DIR = src/conf/ +SPK_USER = auto + +SERVICE_SETUP = src/service-setup.sh +# This is a bogus value to ensure that everything is tailored for a SERVICE_COMMAND +# The real value is defined by the setup file +SERVICE_COMMAND = memcached INSTALL_DEP_SERVICES = apache-web START_DEP_SERVICES = apache-web -INSTALL_PREFIX = /usr/local/$(SPK_NAME) - POST_STRIP_TARGET = memcached_extra_install BUSYBOX_CONFIG = usrmng diff --git a/spk/memcached/src/app/config b/spk/memcached/src/app/config index 01724a61926..716ec041e6b 100644 --- a/spk/memcached/src/app/config +++ b/spk/memcached/src/app/config @@ -4,6 +4,7 @@ "title": "phpMemcachedAdmin", "desc": "phpMemcachedAdmin", "icon": "images/memcached-{0}.png", + "protocol": "http", "type": "url", "url": "/phpMemcachedAdmin", "port": "80" diff --git a/spk/memcached/src/conf/privilege b/spk/memcached/src/conf/privilege deleted file mode 100644 index f6c56ec88ff..00000000000 --- a/spk/memcached/src/conf/privilege +++ /dev/null @@ -1,31 +0,0 @@ -{ - "defaults":{ - "run-as": "package" - }, - "username": "sc-memcached", - "ctrl-script": [{ - "action": "preinst", - "run-as": "root" - }, { - "action": "postinst", - "run-as": "root" - }, { - "action": "preuninst", - "run-as": "root" - }, { - "action": "postuninst", - "run-as": "root" - }, { - "action": "preupgrade", - "run-as": "root" - }, { - "action": "postupgrade", - "run-as": "root" - }, { - "action": "start", - "run-as": "root" - }, { - "action": "stop", - "run-as": "root" - }] -} \ No newline at end of file diff --git a/spk/memcached/src/dsm-control.sh b/spk/memcached/src/dsm-control.sh deleted file mode 100755 index 89e5b9b3de1..00000000000 --- a/spk/memcached/src/dsm-control.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/sh - -# Package -PACKAGE="memcached" -DNAME="Memcached" - -# Others -INSTALL_DIR="/usr/local/${PACKAGE}" -PATH="${INSTALL_DIR}/bin:${PATH}" -BUILDNUMBER="$(/bin/get_key_value /etc.defaults/VERSION buildnumber)" -MEMCACHED="${INSTALL_DIR}/bin/memcached" -PID_FILE="${INSTALL_DIR}/var/memcached.pid" - -# Use 15% of total physical memory with maximum of 64MB -MEMORY=`awk '/MemTotal/{memory=$2/1024*0.15; if (memory > 64) memory=64; printf "%0.f", memory}' /proc/meminfo` - -SC_USER="sc-memcached" -LEGACY_USER="memcached" -USER="$([ "${BUILDNUMBER}" -ge "7321" ] && echo -n ${SC_USER} || echo -n ${LEGACY_USER})" - - -start_daemon () -{ - su ${USER} -s /bin/sh -c "${MEMCACHED} -d -m ${MEMORY} -P ${PID_FILE}" -} - -stop_daemon () -{ - kill `cat ${PID_FILE}` - wait_for_status 1 20 || kill -9 `cat ${PID_FILE}` - rm -f ${PID_FILE} -} - -daemon_status () -{ - if [ -f ${PID_FILE} ] && kill -0 `cat ${PID_FILE}` > /dev/null 2>&1; then - return - fi - rm -f ${PID_FILE} - return 1 -} - -wait_for_status () -{ - counter=$2 - while [ ${counter} -gt 0 ]; do - daemon_status - [ $? -eq $1 ] && return - let counter=counter-1 - sleep 1 - done - return 1 -} - - -case $1 in - start) - if daemon_status; then - echo ${DNAME} is already running - exit 0 - else - echo Starting ${DNAME} ... - start_daemon - exit $? - fi - ;; - stop) - if daemon_status; then - echo Stopping ${DNAME} ... - stop_daemon - exit $? - else - echo ${DNAME} is not running - exit 0 - fi - ;; - status) - if daemon_status; then - echo ${DNAME} is running - exit 0 - else - echo ${DNAME} is not running - exit 1 - fi - ;; - log) - echo ${LOG_FILE} - exit 0 - ;; - *) - exit 1 - ;; -esac diff --git a/spk/memcached/src/installer.sh b/spk/memcached/src/installer.sh deleted file mode 100755 index 6daa27f0f99..00000000000 --- a/spk/memcached/src/installer.sh +++ /dev/null @@ -1,106 +0,0 @@ -#!/bin/sh - -# Package -PACKAGE="memcached" -DNAME="Memcached" - -# Others -INSTALL_DIR="/usr/local/${PACKAGE}" -WEB_DIR="/var/services/web" -SSS="/var/packages/${PACKAGE}/scripts/start-stop-status" -PATH="${INSTALL_DIR}/bin:/usr/local/bin:/bin:/usr/bin:/usr/syno/bin" -MEMCACHED="${INSTALL_DIR}/bin/memcached" -TMP_DIR="${SYNOPKG_PKGDEST}/../../@tmp" -BUILDNUMBER="$(/bin/get_key_value /etc.defaults/VERSION buildnumber)" - -DSM6_UPGRADE="${INSTALL_DIR}/var/.dsm6_upgrade" -SC_USER="sc-memcached" -LEGACY_USER="memcached" -LEGACY_GROUP="nobody" -USER="$([ "${BUILDNUMBER}" -ge "7321" ] && echo -n ${SC_USER} || echo -n ${LEGACY_USER})" - - -preinst () -{ - exit 0 -} - -postinst () -{ - # Link - ln -s ${SYNOPKG_PKGDEST} ${INSTALL_DIR} - - # Install the web interface - cp -R ${INSTALL_DIR}/share/phpMemcachedAdmin ${WEB_DIR} - - # Install busybox stuff - ${INSTALL_DIR}/bin/busybox --install ${INSTALL_DIR}/bin - - # Create legacy user - if [ "${BUILDNUMBER}" -lt "7321" ]; then - adduser -h ${INSTALL_DIR}/var -g "${DNAME} User" -G ${LEGACY_GROUP} -s /bin/sh -S -D ${LEGACY_USER} - fi - - # Correct the files ownership - chown -R ${USER}:root ${SYNOPKG_PKGDEST} - - exit 0 -} - -preuninst () -{ - # Stop the package - ${SSS} stop > /dev/null - - if [ "${SYNOPKG_PKG_STATUS}" != "UPGRADE" ]; then - # Remove the user (if not upgrading) - delgroup ${LEGACY_USER} ${LEGACY_GROUP} - deluser ${USER} - - # Remove firewall configuration - ${SERVICETOOL} --remove-configure-file --package ${PACKAGE}.sc >> /dev/null - fi - - exit 0 -} - -postuninst () -{ - # Remove the web interface - rm -fr ${WEB_DIR}/phpMemcachedAdmin - - # Remove link - rm -f ${INSTALL_DIR} - - exit 0 -} - -preupgrade () -{ - # Stop the package - ${SSS} stop > /dev/null - - # DSM6 Upgrade handling - if [ "${BUILDNUMBER}" -ge "7321" ] && [ ! -f ${DSM6_UPGRADE} ]; then - echo "Deleting legacy user" > ${DSM6_UPGRADE} - delgroup ${LEGACY_USER} ${LEGACY_GROUP} - deluser ${LEGACY_USER} - fi - - # Save some stuff - rm -fr ${TMP_DIR}/${PACKAGE} - mkdir -p ${TMP_DIR}/${PACKAGE} - mv ${INSTALL_DIR}/var ${TMP_DIR}/${PACKAGE}/ - - exit 0 -} - -postupgrade () -{ - # Restore some stuff - rm -fr ${INSTALL_DIR}/var - mv ${TMP_DIR}/${PACKAGE}/var ${INSTALL_DIR}/ - rm -fr ${TMP_DIR}/${PACKAGE} - - exit 0 -} diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh new file mode 100644 index 00000000000..c2454fba8df --- /dev/null +++ b/spk/memcached/src/service-setup.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +# Package +PACKAGE="memcached" + +# Others +INSTALL_DIR="/var/packages/${PACKAGE}/target/" +WEB_DIR="/var/services/web" +PATH="${INSTALL_DIR}/bin:/usr/local/bin:/bin:/usr/bin:/usr/syno/bin" +MEMCACHED="${INSTALL_DIR}/bin/memcached" +SERVICE_COMMAND="${MEMCACHED} -d -m `awk '/MemTotal/{memory=$2/1024*0.15; if (memory > 64) memory=64; printf "%0.f", memory}' /proc/meminfo` -P ${PID_FILE}" + +service_postinst () +{ + + # Install the web interface + cp -Rp ${INSTALL_DIR}/share/phpMemcachedAdmin ${WEB_DIR} + + chown http ${WEB_DIR}/phpMemcachedAdmin/Temp/ + + chown http ${WEB_DIR}/phpMemcachedAdmin/Config/ + + # Install busybox stuff + ${INSTALL_DIR}/bin/busybox --install ${INSTALL_DIR}/bin + + return 0 +} + +service_postuninst () +{ + # Remove the web interface + rm -fr ${WEB_DIR}/phpMemcachedAdmin + + return 0 +} + +service_preupgrade () +{ + # Remove the web interface + rm -fr ${WEB_DIR}/phpMemcachedAdmin + + return 0 +} From 226222dae4fc707bd58f6d35c492270798742fef Mon Sep 17 00:00:00 2001 From: Smaarn Date: Sun, 1 May 2022 10:21:23 +0200 Subject: [PATCH 02/31] Add DSM 7 support logics --- spk/memcached/Makefile | 8 +++--- spk/memcached/src/conf/resource | 45 ++++++++++++++++++++++++++++++ spk/memcached/src/service-setup.sh | 37 ++++++++++++------------ 3 files changed, 68 insertions(+), 22 deletions(-) create mode 100644 spk/memcached/src/conf/resource diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index 39e76e39429..ef8b53c40c6 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -4,13 +4,13 @@ SPK_REV = 3 SPK_ICON = src/memcached.png DSM_UI_DIR = app -DEPENDS = cross/busybox cross/phpmemcachedadmin cross/$(SPK_NAME) +DEPENDS = cross/phpmemcachedadmin cross/$(SPK_NAME) MAINTAINER = Diaoul DESCRIPTION = Free \& open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load. It comes with phpMemcachedAdmin, a graphic stand-alone administration for memcached to monitor and debug purpose. ADMIN_URL = /phpMemcachedAdmin/ DISPLAY_NAME = Memcached -CHANGELOG = "1. Bump 1.4.13 -> 1.6.9" +CHANGELOG = "1. Bump 1.4.13 -> 1.6.9
2. Add DSM 7 compliance" HOMEPAGE = https://memcached.org/ LICENSE = @@ -27,8 +27,8 @@ START_DEP_SERVICES = apache-web POST_STRIP_TARGET = memcached_extra_install -BUSYBOX_CONFIG = usrmng -ENV += BUSYBOX_CONFIG="$(BUSYBOX_CONFIG)" +# Pure PHP package, make sure ARCH is not defined +override ARCH= include ../../mk/spksrc.spk.mk diff --git a/spk/memcached/src/conf/resource b/spk/memcached/src/conf/resource new file mode 100644 index 00000000000..896aaa5e8ac --- /dev/null +++ b/spk/memcached/src/conf/resource @@ -0,0 +1,45 @@ +{ + "webservice": { + "services": [{ + "service": "phpMemcachedAdmin", + "display_name": "phpMemcachedAdmin", + "type": "apache_php", + "root": "phpMemcachedAdmin", + "backend": 2, + "php": { + "profile_name": "php-memcached-admin", + "profile_desc": "PHP profile used by phpMemcachedAdmin", + "backend": 6, + "extensions": [ + "gd", + "intl", + "zip" + ], + "user": "sc-memcached", + "group": "http" + } + }], + "portals": [ + { + "service": "phpMemcachedAdmin", + "type": "alias", + "name": "PHP Memcached Admin", + "alias": "phpMemcachedAdmin", + "app": "com.synocommunity.packages.memcached" + } + ], + "migrate": { + "root": [{ + "old": "phpMemcachedAdmin", + "new": "phpMemcachedAdmin" + }] + }, + "pkg_dir_prepare": [{ + "source": "/var/packages/memcached/target/share/phpMemcachedAdmin", + "target": "phpMemcachedAdmin", + "mode": "0755", + "user": "sc-memcached", + "group": "http" + }] + } +} \ No newline at end of file diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index c2454fba8df..8f43288b817 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -1,43 +1,44 @@ #!/bin/sh -# Package -PACKAGE="memcached" - # Others -INSTALL_DIR="/var/packages/${PACKAGE}/target/" +# Only used for DSM 6 WEB_DIR="/var/services/web" -PATH="${INSTALL_DIR}/bin:/usr/local/bin:/bin:/usr/bin:/usr/syno/bin" -MEMCACHED="${INSTALL_DIR}/bin/memcached" +PATH="${SYNOPKG_PKGDEST}/bin:/usr/local/bin:/bin:/usr/bin:/usr/syno/bin" +MEMCACHED="${SYNOPKG_PKGDEST}/bin/memcached" SERVICE_COMMAND="${MEMCACHED} -d -m `awk '/MemTotal/{memory=$2/1024*0.15; if (memory > 64) memory=64; printf "%0.f", memory}' /proc/meminfo` -P ${PID_FILE}" service_postinst () { - # Install the web interface - cp -Rp ${INSTALL_DIR}/share/phpMemcachedAdmin ${WEB_DIR} - - chown http ${WEB_DIR}/phpMemcachedAdmin/Temp/ - - chown http ${WEB_DIR}/phpMemcachedAdmin/Config/ + if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then - # Install busybox stuff - ${INSTALL_DIR}/bin/busybox --install ${INSTALL_DIR}/bin + # Install the web interface + cp -Rp "${SYNOPKG_PKGDEST}/share/phpMemcachedAdmin" "${WEB_DIR}" + + chown http "${WEB_DIR}/phpMemcachedAdmin/Temp/" + + chown http "${WEB_DIR}/phpMemcachedAdmin/Config/" + fi return 0 } service_postuninst () { - # Remove the web interface - rm -fr ${WEB_DIR}/phpMemcachedAdmin + if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then + # Remove the web interface + rm -fr "${WEB_DIR}/phpMemcachedAdmin" + fi return 0 } service_preupgrade () { - # Remove the web interface - rm -fr ${WEB_DIR}/phpMemcachedAdmin + if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then + # Remove the web interface + rm -fr "${WEB_DIR}/phpMemcachedAdmin" + fi return 0 } From 902e170391f81e1a41e908ba6f73b1c9dcaec539 Mon Sep 17 00:00:00 2001 From: Smaarn Date: Sun, 1 May 2022 18:33:37 +0200 Subject: [PATCH 03/31] Fixed invalid no-arch switch --- spk/memcached/Makefile | 3 --- 1 file changed, 3 deletions(-) diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index ef8b53c40c6..0fb9157ca79 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -27,9 +27,6 @@ START_DEP_SERVICES = apache-web POST_STRIP_TARGET = memcached_extra_install -# Pure PHP package, make sure ARCH is not defined -override ARCH= - include ../../mk/spksrc.spk.mk .PHONY: memcached_extra_install From 160113f566d67821047269ae8e51b0d6e570d6e1 Mon Sep 17 00:00:00 2001 From: Smaarn Date: Sun, 1 May 2022 19:06:28 +0200 Subject: [PATCH 04/31] Added missing CONF_DIR parameter --- spk/memcached/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index 0fb9157ca79..a9abd89179d 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -15,6 +15,8 @@ CHANGELOG = "1. Bump 1.4.13 -> 1.6.9
2. Add DSM 7 compliance" HOMEPAGE = https://memcached.org/ LICENSE = +CONF_DIR = src/conf + SPK_USER = auto SERVICE_SETUP = src/service-setup.sh From 318bcf3c04ac8f54e80b06599297f12ab56073da Mon Sep 17 00:00:00 2001 From: Smaarn Date: Sun, 1 May 2022 19:31:59 +0200 Subject: [PATCH 05/31] Fixed setup to handle configuration file --- spk/memcached/src/service-setup.sh | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 8f43288b817..4e485944604 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -6,10 +6,10 @@ WEB_DIR="/var/services/web" PATH="${SYNOPKG_PKGDEST}/bin:/usr/local/bin:/bin:/usr/bin:/usr/syno/bin" MEMCACHED="${SYNOPKG_PKGDEST}/bin/memcached" SERVICE_COMMAND="${MEMCACHED} -d -m `awk '/MemTotal/{memory=$2/1024*0.15; if (memory > 64) memory=64; printf "%0.f", memory}' /proc/meminfo` -P ${PID_FILE}" +CONFIG_FILE="${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.php" service_postinst () { - if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then # Install the web interface @@ -20,6 +20,18 @@ service_postinst () chown http "${WEB_DIR}/phpMemcachedAdmin/Config/" fi + if [ "${SYNOPKG_PKG_STATUS}" == "INSTALL" ]; then + cp "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.sample.php" "${CONFIG_FILE}" + chgrp http "${CONFIG_FILE}" + chmod g+w "${CONFIG_FILE}" + elif [ -f "${TMP_DIR}/Config/Memcache.php" ]; then + cp -p "${TMP_DIR}/Config/Memcache.php" "${CONFIG_FILE}" + else + cp "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.sample.php" "${CONFIG_FILE}" + chgrp http "${CONFIG_FILE}" + chmod g+w "${CONFIG_FILE}" + fi + return 0 } @@ -38,7 +50,17 @@ service_preupgrade () if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then # Remove the web interface rm -fr "${WEB_DIR}/phpMemcachedAdmin" + else + if [ -f "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.php" ]; then + mkdir -p "${TMP_DIR}/Config/" + cp -p "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.php" "${TMP_DIR}/Config/Memcache.php" + fi fi return 0 } + +service_postupgrade () +{ + +} From ddb30a76cb7df55e3e335b693398b3a7608c64c1 Mon Sep 17 00:00:00 2001 From: Smaarn Date: Sun, 1 May 2022 19:38:43 +0200 Subject: [PATCH 06/31] Improve upgrade procedure --- spk/memcached/src/service-setup.sh | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 4e485944604..716a510dc2b 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -21,13 +21,13 @@ service_postinst () fi if [ "${SYNOPKG_PKG_STATUS}" == "INSTALL" ]; then - cp "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.sample.php" "${CONFIG_FILE}" + cp -p "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.sample.php" "${CONFIG_FILE}" chgrp http "${CONFIG_FILE}" chmod g+w "${CONFIG_FILE}" elif [ -f "${TMP_DIR}/Config/Memcache.php" ]; then cp -p "${TMP_DIR}/Config/Memcache.php" "${CONFIG_FILE}" else - cp "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.sample.php" "${CONFIG_FILE}" + cp -p "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.sample.php" "${CONFIG_FILE}" chgrp http "${CONFIG_FILE}" chmod g+w "${CONFIG_FILE}" fi @@ -47,14 +47,13 @@ service_postuninst () service_preupgrade () { + if [ -f "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.php" ]; then + mkdir -p "${TMP_DIR}/Config/" + cp -p "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.php" "${TMP_DIR}/Config/Memcache.php" + fi if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then # Remove the web interface rm -fr "${WEB_DIR}/phpMemcachedAdmin" - else - if [ -f "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.php" ]; then - mkdir -p "${TMP_DIR}/Config/" - cp -p "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.php" "${TMP_DIR}/Config/Memcache.php" - fi fi return 0 From 596912d8c35e1fc9b40cc08fd361958a817bbe86 Mon Sep 17 00:00:00 2001 From: Smaarn Date: Sun, 1 May 2022 19:40:44 +0200 Subject: [PATCH 07/31] Cleanup unnecessary code --- spk/memcached/src/service-setup.sh | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 716a510dc2b..747ef265778 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -31,8 +31,6 @@ service_postinst () chgrp http "${CONFIG_FILE}" chmod g+w "${CONFIG_FILE}" fi - - return 0 } service_postuninst () @@ -41,8 +39,6 @@ service_postuninst () # Remove the web interface rm -fr "${WEB_DIR}/phpMemcachedAdmin" fi - - return 0 } service_preupgrade () @@ -55,11 +51,4 @@ service_preupgrade () # Remove the web interface rm -fr "${WEB_DIR}/phpMemcachedAdmin" fi - - return 0 -} - -service_postupgrade () -{ - } From 879a0a9a6d3a77e94e9f1d6d49367b5758795ef1 Mon Sep 17 00:00:00 2001 From: Smaarn Date: Sun, 1 May 2022 20:46:18 +0200 Subject: [PATCH 08/31] Fix upgrade procedure attempt #2 --- spk/memcached/src/service-setup.sh | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 747ef265778..0d8cc0cc697 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -6,14 +6,15 @@ WEB_DIR="/var/services/web" PATH="${SYNOPKG_PKGDEST}/bin:/usr/local/bin:/bin:/usr/bin:/usr/syno/bin" MEMCACHED="${SYNOPKG_PKGDEST}/bin/memcached" SERVICE_COMMAND="${MEMCACHED} -d -m `awk '/MemTotal/{memory=$2/1024*0.15; if (memory > 64) memory=64; printf "%0.f", memory}' /proc/meminfo` -P ${PID_FILE}" -CONFIG_FILE="${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.php" +CONFIG_DIR="${WEB_DIR}/phpMemcachedAdmin/Config" +CONFIG_BACKUP="${TMP_DIR}/Config" service_postinst () { if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then # Install the web interface - cp -Rp "${SYNOPKG_PKGDEST}/share/phpMemcachedAdmin" "${WEB_DIR}" + cp -Rpv "${SYNOPKG_PKGDEST}/share/phpMemcachedAdmin" "${WEB_DIR}" chown http "${WEB_DIR}/phpMemcachedAdmin/Temp/" @@ -21,18 +22,27 @@ service_postinst () fi if [ "${SYNOPKG_PKG_STATUS}" == "INSTALL" ]; then - cp -p "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.sample.php" "${CONFIG_FILE}" + cp -pv "${CONFIG_DIR}/Memcache.sample.php" "${CONFIG_DIR}/Memcache.php" chgrp http "${CONFIG_FILE}" chmod g+w "${CONFIG_FILE}" - elif [ -f "${TMP_DIR}/Config/Memcache.php" ]; then - cp -p "${TMP_DIR}/Config/Memcache.php" "${CONFIG_FILE}" + elif [ -d "${CONFIG_BACKUP}" ]; then + tar -cf - -C "${CONFIG_BACKUP}" --exclude="Memcache.sample.php" . | tar -xvf - -C "${CONFIG_DIR}" else - cp -p "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.sample.php" "${CONFIG_FILE}" + cp -pv "${CONFIG_DIR}/Memcache.sample.php" "${CONFIG_DIR}/Memcache.php" chgrp http "${CONFIG_FILE}" chmod g+w "${CONFIG_FILE}" fi } +service_preuninst () +{ + if [ "${SYNOPKG_PKG_STATUS}" == "UPGRADE" ]; then + if [ -d "${TMP_DIR}/Config/" ]; then + cp -pRv "${TMP_DIR}/Config" "${TMP_DIR}" + fi + fi +} + service_postuninst () { if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then @@ -43,10 +53,6 @@ service_postuninst () service_preupgrade () { - if [ -f "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.php" ]; then - mkdir -p "${TMP_DIR}/Config/" - cp -p "${WEB_DIR}/phpMemcachedAdmin/Config/Memcache.php" "${TMP_DIR}/Config/Memcache.php" - fi if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then # Remove the web interface rm -fr "${WEB_DIR}/phpMemcachedAdmin" From 345583c71097b8aa091e6e93c0a8533f21bcc9d7 Mon Sep 17 00:00:00 2001 From: Smaarn Date: Tue, 3 May 2022 07:23:49 +0200 Subject: [PATCH 09/31] Cleanup of enforced compilation parameters --- cross/memcached/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cross/memcached/Makefile b/cross/memcached/Makefile index 6a7ac7a31a4..641be3608d7 100644 --- a/cross/memcached/Makefile +++ b/cross/memcached/Makefile @@ -12,7 +12,7 @@ COMMENT = Free & open source, high-performance, distributed memory object cachi LICENSE = BSD PRE_CONFIGURE_TARGET = memcached_pre_configure -CONFIGURE_ARGS = ac_cv_c_endian=little + GNU_CONFIGURE = 1 include ../../mk/spksrc.cross-cc.mk From b478819de80fdf2468e0f63d973a7c9db395e90a Mon Sep 17 00:00:00 2001 From: Smaarn Date: Tue, 3 May 2022 21:03:59 +0200 Subject: [PATCH 10/31] Attemptive fix at configuration files --- spk/memcached/src/service-setup.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 0d8cc0cc697..05e254905d6 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -7,6 +7,7 @@ PATH="${SYNOPKG_PKGDEST}/bin:/usr/local/bin:/bin:/usr/bin:/usr/syno/bin" MEMCACHED="${SYNOPKG_PKGDEST}/bin/memcached" SERVICE_COMMAND="${MEMCACHED} -d -m `awk '/MemTotal/{memory=$2/1024*0.15; if (memory > 64) memory=64; printf "%0.f", memory}' /proc/meminfo` -P ${PID_FILE}" CONFIG_DIR="${WEB_DIR}/phpMemcachedAdmin/Config" +CONFIG_FILE="${CONFIG_DIR}/Memcache.php" CONFIG_BACKUP="${TMP_DIR}/Config" service_postinst () @@ -22,13 +23,13 @@ service_postinst () fi if [ "${SYNOPKG_PKG_STATUS}" == "INSTALL" ]; then - cp -pv "${CONFIG_DIR}/Memcache.sample.php" "${CONFIG_DIR}/Memcache.php" + cp -v "${CONFIG_DIR}/Memcache.sample.php" "${CONFIG_FILE}" chgrp http "${CONFIG_FILE}" chmod g+w "${CONFIG_FILE}" elif [ -d "${CONFIG_BACKUP}" ]; then tar -cf - -C "${CONFIG_BACKUP}" --exclude="Memcache.sample.php" . | tar -xvf - -C "${CONFIG_DIR}" else - cp -pv "${CONFIG_DIR}/Memcache.sample.php" "${CONFIG_DIR}/Memcache.php" + cp -v "${CONFIG_DIR}/Memcache.sample.php" "${CONFIG_FILE}" chgrp http "${CONFIG_FILE}" chmod g+w "${CONFIG_FILE}" fi From 57d5c3734703a1c3f7d92ebecf1991db252d2d87 Mon Sep 17 00:00:00 2001 From: Smaarn Date: Tue, 3 May 2022 21:25:38 +0200 Subject: [PATCH 11/31] Fixing backup process --- spk/memcached/src/service-setup.sh | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 05e254905d6..9999310139b 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -35,15 +35,6 @@ service_postinst () fi } -service_preuninst () -{ - if [ "${SYNOPKG_PKG_STATUS}" == "UPGRADE" ]; then - if [ -d "${TMP_DIR}/Config/" ]; then - cp -pRv "${TMP_DIR}/Config" "${TMP_DIR}" - fi - fi -} - service_postuninst () { if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then @@ -55,7 +46,14 @@ service_postuninst () service_preupgrade () { if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then + if [ -d "${CONFIG_DIR}" ]; then + cp -pRv "${CONFIG_DIR}" "${TMP_DIR}" + fi # Remove the web interface rm -fr "${WEB_DIR}/phpMemcachedAdmin" + else + if [ -d "${CONFIG_DIR}" ]; then + cp -Rv "${CONFIG_DIR}" "${TMP_DIR}" + fi fi } From af8ed11d0cbabf683394315fe23e92a8e54a6cbd Mon Sep 17 00:00:00 2001 From: Smaarn Date: Tue, 3 May 2022 21:36:56 +0200 Subject: [PATCH 12/31] Fixed invalid WEB_DIR environment variable --- spk/memcached/src/service-setup.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 9999310139b..a87a4db955b 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -2,7 +2,15 @@ # Others # Only used for DSM 6 -WEB_DIR="/var/services/web" +WEB_DIR="/var/services/web_packages" +DSM6_WEB_DIR="/var/services/web" +DSM7_WEB_DIR="/var/services/web_packages" +if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then +WEB_DIR="${DSM6_WEB_DIR}" +else +WEB_DIR="${DSM7_WEB_DIR}" +fi + PATH="${SYNOPKG_PKGDEST}/bin:/usr/local/bin:/bin:/usr/bin:/usr/syno/bin" MEMCACHED="${SYNOPKG_PKGDEST}/bin/memcached" SERVICE_COMMAND="${MEMCACHED} -d -m `awk '/MemTotal/{memory=$2/1024*0.15; if (memory > 64) memory=64; printf "%0.f", memory}' /proc/meminfo` -P ${PID_FILE}" From cbd20cc8c41d32cfc9a2b2b7c109053a09bee568 Mon Sep 17 00:00:00 2001 From: Smaarn Date: Tue, 3 May 2022 23:21:52 +0200 Subject: [PATCH 13/31] Replace the default configuration file by a file provided upon package generation --- spk/memcached/Makefile | 4 +++- spk/memcached/src/service-setup.sh | 17 +++++------------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index a9abd89179d..2b4adf54019 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -11,13 +11,13 @@ DESCRIPTION = Free \& open source, high-performance, distributed memory object c ADMIN_URL = /phpMemcachedAdmin/ DISPLAY_NAME = Memcached CHANGELOG = "1. Bump 1.4.13 -> 1.6.9
2. Add DSM 7 compliance" - HOMEPAGE = https://memcached.org/ LICENSE = CONF_DIR = src/conf SPK_USER = auto +SPK_GROUP = http SERVICE_SETUP = src/service-setup.sh # This is a bogus value to ensure that everything is tailored for a SERVICE_COMMAND @@ -35,3 +35,5 @@ include ../../mk/spksrc.spk.mk memcached_extra_install: install -m 755 -d $(STAGING_DIR)/app install -m 644 src/app/config $(STAGING_DIR)/app/config + install -m 775 $(STAGING_DIR)/share/phpMemcachedAdmin/Config/Memcache.sample.php \ + $(STAGING_DIR)/share/phpMemcachedAdmin/Config/Memcache.php diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index a87a4db955b..4555a442daf 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -29,18 +29,6 @@ service_postinst () chown http "${WEB_DIR}/phpMemcachedAdmin/Config/" fi - - if [ "${SYNOPKG_PKG_STATUS}" == "INSTALL" ]; then - cp -v "${CONFIG_DIR}/Memcache.sample.php" "${CONFIG_FILE}" - chgrp http "${CONFIG_FILE}" - chmod g+w "${CONFIG_FILE}" - elif [ -d "${CONFIG_BACKUP}" ]; then - tar -cf - -C "${CONFIG_BACKUP}" --exclude="Memcache.sample.php" . | tar -xvf - -C "${CONFIG_DIR}" - else - cp -v "${CONFIG_DIR}/Memcache.sample.php" "${CONFIG_FILE}" - chgrp http "${CONFIG_FILE}" - chmod g+w "${CONFIG_FILE}" - fi } service_postuninst () @@ -51,6 +39,11 @@ service_postuninst () fi } +service_postupgrade () +{ + tar -cf - -C "${CONFIG_BACKUP}" --exclude="Memcache.sample.php" . | tar -xvf - -C "${CONFIG_DIR}" +} + service_preupgrade () { if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then From 81eb80f26096fc2c04c02eac8f1e39d14bac975d Mon Sep 17 00:00:00 2001 From: Smaarn Date: Tue, 3 May 2022 23:35:40 +0200 Subject: [PATCH 14/31] Fixed restoration to be performed --- spk/memcached/src/service-setup.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 4555a442daf..76cbdcaec99 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -39,9 +39,10 @@ service_postuninst () fi } -service_postupgrade () +service_restore () { tar -cf - -C "${CONFIG_BACKUP}" --exclude="Memcache.sample.php" . | tar -xvf - -C "${CONFIG_DIR}" + rm -rvf "${CONFIG_BACKUP}" } service_preupgrade () @@ -58,3 +59,4 @@ service_preupgrade () fi fi } + From c0a2b9b213d54826fd612df702030f8ab24be346 Mon Sep 17 00:00:00 2001 From: Smaarn Date: Tue, 3 May 2022 23:45:33 +0200 Subject: [PATCH 15/31] Prefer using tar command to perform backups --- spk/memcached/src/service-setup.sh | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 76cbdcaec99..8b2b254433a 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -15,7 +15,6 @@ PATH="${SYNOPKG_PKGDEST}/bin:/usr/local/bin:/bin:/usr/bin:/usr/syno/bin" MEMCACHED="${SYNOPKG_PKGDEST}/bin/memcached" SERVICE_COMMAND="${MEMCACHED} -d -m `awk '/MemTotal/{memory=$2/1024*0.15; if (memory > 64) memory=64; printf "%0.f", memory}' /proc/meminfo` -P ${PID_FILE}" CONFIG_DIR="${WEB_DIR}/phpMemcachedAdmin/Config" -CONFIG_FILE="${CONFIG_DIR}/Memcache.php" CONFIG_BACKUP="${TMP_DIR}/Config" service_postinst () @@ -41,22 +40,19 @@ service_postuninst () service_restore () { - tar -cf - -C "${CONFIG_BACKUP}" --exclude="Memcache.sample.php" . | tar -xvf - -C "${CONFIG_DIR}" + tar -cf - -C "${CONFIG_BACKUP}" . | tar -xvf - -C "${CONFIG_DIR}" rm -rvf "${CONFIG_BACKUP}" } service_preupgrade () { + if [ -d "${CONFIG_DIR}" ]; then + mkdir -p "${CONFIG_BACKUP}" + tar -cf - -C "${CONFIG_DIR}" --exclude="Memcache.sample.php" . | tar -xvf - -C "${CONFIG_BACKUP}" + fi if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then - if [ -d "${CONFIG_DIR}" ]; then - cp -pRv "${CONFIG_DIR}" "${TMP_DIR}" - fi # Remove the web interface rm -fr "${WEB_DIR}/phpMemcachedAdmin" - else - if [ -d "${CONFIG_DIR}" ]; then - cp -Rv "${CONFIG_DIR}" "${TMP_DIR}" - fi fi } From e2c1ffebc48724bc2741acc3aae2a44b52aa2876 Mon Sep 17 00:00:00 2001 From: Smaarn Date: Sat, 7 May 2022 13:50:59 +0200 Subject: [PATCH 16/31] Simplified web directory computing + fixed sc-memcecahed to be part of the http group --- spk/memcached/Makefile | 2 +- spk/memcached/src/service-setup.sh | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index 2b4adf54019..ba19fdaf235 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -17,7 +17,7 @@ LICENSE = CONF_DIR = src/conf SPK_USER = auto -SPK_GROUP = http +SYSTEM_GROUP = http SERVICE_SETUP = src/service-setup.sh # This is a bogus value to ensure that everything is tailored for a SERVICE_COMMAND diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 8b2b254433a..61577c37395 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -2,13 +2,10 @@ # Others # Only used for DSM 6 -WEB_DIR="/var/services/web_packages" DSM6_WEB_DIR="/var/services/web" -DSM7_WEB_DIR="/var/services/web_packages" +WEB_DIR="/var/services/web_packages" if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then WEB_DIR="${DSM6_WEB_DIR}" -else -WEB_DIR="${DSM7_WEB_DIR}" fi PATH="${SYNOPKG_PKGDEST}/bin:/usr/local/bin:/bin:/usr/bin:/usr/syno/bin" From f142ea113e362beab34373dc69333d2735cc5f9d Mon Sep 17 00:00:00 2001 From: Smaarn Date: Sat, 7 May 2022 14:46:18 +0200 Subject: [PATCH 17/31] Remove verbosity on tar extraction commands --- spk/memcached/src/service-setup.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 61577c37395..975a7114ad8 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -37,15 +37,17 @@ service_postuninst () service_restore () { - tar -cf - -C "${CONFIG_BACKUP}" . | tar -xvf - -C "${CONFIG_DIR}" - rm -rvf "${CONFIG_BACKUP}" + if [ -d "${CONFIG_BACKUP}" ]; then + tar -cf - -C "${CONFIG_BACKUP}" . | tar -xf - -C "${CONFIG_DIR}" + rm -rvf "${CONFIG_BACKUP}" + fi } service_preupgrade () { if [ -d "${CONFIG_DIR}" ]; then mkdir -p "${CONFIG_BACKUP}" - tar -cf - -C "${CONFIG_DIR}" --exclude="Memcache.sample.php" . | tar -xvf - -C "${CONFIG_BACKUP}" + tar -cf - -C "${CONFIG_DIR}" --exclude="Memcache.sample.php" . | tar -xf - -C "${CONFIG_BACKUP}" fi if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then # Remove the web interface From 7bda705047ab2e55cb08477dd1f9413d585af07d Mon Sep 17 00:00:00 2001 From: Smaarn Date: Sat, 7 May 2022 15:06:36 +0200 Subject: [PATCH 18/31] Added explicit service port informations --- spk/memcached/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index ba19fdaf235..ad5f5347e97 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -19,6 +19,9 @@ CONF_DIR = src/conf SPK_USER = auto SYSTEM_GROUP = http +SERVICE_PORT = 11211 +SERVICE_PORT_TITLE = $(DISPLAY_NAME) + SERVICE_SETUP = src/service-setup.sh # This is a bogus value to ensure that everything is tailored for a SERVICE_COMMAND # The real value is defined by the setup file From 1d69e5d76ca76b259a35192a476e190658e5144b Mon Sep 17 00:00:00 2001 From: Smaarn Date: Sat, 7 May 2022 15:43:02 +0200 Subject: [PATCH 19/31] Fixed invalid service shortcut declaration and ui config entry to force generation of images for DSM UI --- spk/memcached/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index ad5f5347e97..64dcf2d1af1 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -21,6 +21,9 @@ SYSTEM_GROUP = http SERVICE_PORT = 11211 SERVICE_PORT_TITLE = $(DISPLAY_NAME) +NO_SERVICE_SHORTCUT = yes +# The service shortcut is not auto generated **but** images are still useful +ICON_DIR = $(STAGING_DIR)/$(DSM_UI_DIR)/images SERVICE_SETUP = src/service-setup.sh # This is a bogus value to ensure that everything is tailored for a SERVICE_COMMAND From e59fa974c2b19ef1753e61acd2fa112eafcbcd24 Mon Sep 17 00:00:00 2001 From: Smaarn Date: Sat, 7 May 2022 15:51:30 +0200 Subject: [PATCH 20/31] No need to generate icons since it's actually not the same (phpMemcachedAdmin is not memcached) --- spk/memcached/Makefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index 64dcf2d1af1..3a332b1994e 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -22,8 +22,6 @@ SYSTEM_GROUP = http SERVICE_PORT = 11211 SERVICE_PORT_TITLE = $(DISPLAY_NAME) NO_SERVICE_SHORTCUT = yes -# The service shortcut is not auto generated **but** images are still useful -ICON_DIR = $(STAGING_DIR)/$(DSM_UI_DIR)/images SERVICE_SETUP = src/service-setup.sh # This is a bogus value to ensure that everything is tailored for a SERVICE_COMMAND From 3a62fea2914249b3c9f899def422381afa1ad0b1 Mon Sep 17 00:00:00 2001 From: Smaarn Date: Sat, 7 May 2022 16:06:09 +0200 Subject: [PATCH 21/31] Fixed resource to include service port configuration --- spk/memcached/src/conf/resource | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spk/memcached/src/conf/resource b/spk/memcached/src/conf/resource index 896aaa5e8ac..d3457c33606 100644 --- a/spk/memcached/src/conf/resource +++ b/spk/memcached/src/conf/resource @@ -1,4 +1,7 @@ { + "port-config": { + "protocol-file": "app/memcached.sc" + }, "webservice": { "services": [{ "service": "phpMemcachedAdmin", From da8abee6303dea48cc5595993b039c92de96efab Mon Sep 17 00:00:00 2001 From: hgy59 Date: Sat, 21 May 2022 11:29:57 +0200 Subject: [PATCH 22/31] memcached: rework - update memcached to v1.6.15 - aarch64 patch is not required (https://github.com/memcached/memcached/issues/743 is not an issue) - update phpMemcachedAdmin to include fix for 1.6.x - fix service user --- cross/memcached/Makefile | 2 +- cross/memcached/digests | 6 ++-- .../patches/aarch64/001-crc32-support.patch | 36 ------------------- cross/phpmemcachedadmin/Makefile | 30 +++++++++------- cross/phpmemcachedadmin/PLIST | 2 +- cross/phpmemcachedadmin/digests | 6 ++-- spk/memcached/Makefile | 18 ++++------ 7 files changed, 32 insertions(+), 68 deletions(-) delete mode 100644 cross/memcached/patches/aarch64/001-crc32-support.patch diff --git a/cross/memcached/Makefile b/cross/memcached/Makefile index 641be3608d7..023a5ea8adf 100644 --- a/cross/memcached/Makefile +++ b/cross/memcached/Makefile @@ -1,5 +1,5 @@ PKG_NAME = memcached -PKG_VERS = 1.6.9 +PKG_VERS = 1.6.15 PKG_EXT = tar.gz PKG_DIST_NAME = $(PKG_NAME)-$(PKG_VERS).$(PKG_EXT) PKG_DIST_SITE = http://www.memcached.org/files diff --git a/cross/memcached/digests b/cross/memcached/digests index 001501b91a2..ec388fbd611 100644 --- a/cross/memcached/digests +++ b/cross/memcached/digests @@ -1,3 +1,3 @@ -memcached-1.6.9.tar.gz SHA1 42ae062094fdf083cfe7b21ff377c781011c2be1 -memcached-1.6.9.tar.gz SHA256 d5a62ce377314dbffdb37c4467e7763e3abae376a16171e613cbe69956f092d1 -memcached-1.6.9.tar.gz MD5 ee802a316d7d622aaaec22382ca65004 +memcached-1.6.15.tar.gz SHA1 badcfa0d65f5797cc9c2f957f3fbfedbd8c13411 +memcached-1.6.15.tar.gz SHA256 8d7abe3d649378edbba16f42ef1d66ca3f2ac075f2eb97145ce164388e6ed515 +memcached-1.6.15.tar.gz MD5 8a21ef7bc1c427e6cd88cac270394898 diff --git a/cross/memcached/patches/aarch64/001-crc32-support.patch b/cross/memcached/patches/aarch64/001-crc32-support.patch deleted file mode 100644 index b9f0e18b1a3..00000000000 --- a/cross/memcached/patches/aarch64/001-crc32-support.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 0548859b47a90fcbe5da97ed2a71e2660384cc48 Mon Sep 17 00:00:00 2001 -From: Sergey Dryabzhinsky -Date: Tue, 24 Nov 2020 22:16:56 +0300 -Subject: [PATCH] For issue #743 - Fix missing hw crc32 capability check on - arm64 for old gcc/libc - ---- - crc32c.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/crc32c.c b/crc32c.c -index 916e0e67e..d2e359826 100644 ---- crc32c.c -+++ crc32c.c -@@ -275,7 +275,7 @@ void crc32c_init(void) { - - #elif defined(__aarch64__) && defined(__linux__) - #include -- -+#if defined(HWCAP_CRC32) - static inline uint32_t crc32cx(uint32_t crc, const uint64_t data) - { - asm(".arch_extension crc\n" -@@ -336,6 +336,12 @@ void crc32c_init(void) { - if (auxv & HWCAP_CRC32) - crc32c = crc32c_hw; - } -+#else /* no hw crc32 on arm64 system supported? old compiler/libc/kernel? */ -+void crc32c_init(void) { -+ crc32c = crc32c_sw; -+} -+#endif -+ - #else /* !__x86_64__i && !__aarch64__ */ - void crc32c_init(void) { - crc32c = crc32c_sw; \ No newline at end of file diff --git a/cross/phpmemcachedadmin/Makefile b/cross/phpmemcachedadmin/Makefile index 954b4e9948f..dc359ee8a86 100644 --- a/cross/phpmemcachedadmin/Makefile +++ b/cross/phpmemcachedadmin/Makefile @@ -1,25 +1,29 @@ PKG_NAME = phpMemcachedAdmin -PKG_VERS = 1.3.0 PKG_EXT = tar.gz -PKG_DIST_NAME = $(PKG_VERS).$(PKG_EXT) -PKG_DIST_FILE = $(PKG_NAME)-$(PKG_VERS).$(PKG_EXT) -PKG_DIST_SITE = https://github.com/elijaa/phpmemcachedadmin/archive/refs/tags -PKG_DIR = $(PKG_NAME)-$(PKG_VERS) +PKG_DOWNLOAD_METHOD = git +PKG_GIT_HASH = aaf3d16a2a1e3dff72dd358f1758d96f0f174cb3 +PKG_DIST_SITE = https://github.com/elijaa/phpmemcachedadmin.git +PKG_DIST_FILE = $(PKG_NAME)-git$(PKG_GIT_HASH).$(PKG_EXT) +PKG_DIR = $(PKG_NAME)-git$(PKG_GIT_HASH) + +# Unfortunately only version 1.3.0 is officially released, but +# we need the commit aaf3d16 of 12 Jun 2020 for memcached 1.6.x +# Issue #19: fix mem_requested key change in Memcached 1.5.17 DEPENDS = HOMEPAGE = https://github.com/elijaa/phpmemcachedadmin -COMMENT = Graphic stand-alone administration for memcached to monitor and debug purpose -LICENSE = Apache License 2.0 +COMMENT = Graphic stand-alone administration for memcached to monitor and debug purpose. +LICENSE = Apache 2.0 -EXTRACT_PATH = $(WORK_DIR)/$(PKG_DIR) -CONFIGURE_TARGET = nop -COMPILE_TARGET = nop +EXTRACT_PATH = $(WORK_DIR) INSTALL_TARGET = phpmemcachedadmin_install -include ../../mk/spksrc.cross-cc.mk +include ../../mk/spksrc.install-resources.mk .PHONY: phpmemcachedadmin_install +# make a copy of the sample config as on DSM7 it is not possible to create this at installation time. phpmemcachedadmin_install: - mkdir -p $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME) - tar -cf - -C $(WORK_DIR)/$(PKG_DIR)/phpmemcachedadmin-$(PKG_VERS) . | tar -xf - -C $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME) + @mkdir -p $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME) + @tar -cf - -C $(WORK_DIR)/$(PKG_DIR) . | tar -xf - -C $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME) + @cp -f $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME)/Config/Memcache.sample.php $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME)/Config/Memcache.php diff --git a/cross/phpmemcachedadmin/PLIST b/cross/phpmemcachedadmin/PLIST index b713ed4cad8..61759b8f587 100644 --- a/cross/phpmemcachedadmin/PLIST +++ b/cross/phpmemcachedadmin/PLIST @@ -1 +1 @@ -rsc:share/phpMemcachedAdmin +rsc:share/phpMemcachedAdmin/ diff --git a/cross/phpmemcachedadmin/digests b/cross/phpmemcachedadmin/digests index bd735f1fd31..aae29a33749 100644 --- a/cross/phpmemcachedadmin/digests +++ b/cross/phpmemcachedadmin/digests @@ -1,3 +1,3 @@ -phpMemcachedAdmin-1.3.0.tar.gz SHA1 101fcae71834c466e51950e02bcaa6998ecbc4bc -phpMemcachedAdmin-1.3.0.tar.gz SHA256 9afae91888c991ad11a3d0433dc86720b4b08cf1320391cffb471f24bdabda2c -phpMemcachedAdmin-1.3.0.tar.gz MD5 195eb5e718be44c4e2c7b82c3dff6693 +phpMemcachedAdmin-gitaaf3d16a2a1e3dff72dd358f1758d96f0f174cb3.tar.gz SHA1 28d8c233e6e1814fd25a37a2c1f7d3ee35a94d32 +phpMemcachedAdmin-gitaaf3d16a2a1e3dff72dd358f1758d96f0f174cb3.tar.gz SHA256 1248fe1c6df610b6ea69dfba1a2774d182160a444759d3bf1b4782458d40fe00 +phpMemcachedAdmin-gitaaf3d16a2a1e3dff72dd358f1758d96f0f174cb3.tar.gz MD5 e1e846983f33fcdb480c91c365bc7cac diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index 3a332b1994e..640e95531b1 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -1,5 +1,5 @@ SPK_NAME = memcached -SPK_VERS = 1.6.9 +SPK_VERS = 1.6.15 SPK_REV = 3 SPK_ICON = src/memcached.png DSM_UI_DIR = app @@ -10,23 +10,19 @@ MAINTAINER = Diaoul DESCRIPTION = Free \& open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load. It comes with phpMemcachedAdmin, a graphic stand-alone administration for memcached to monitor and debug purpose. ADMIN_URL = /phpMemcachedAdmin/ DISPLAY_NAME = Memcached -CHANGELOG = "1. Bump 1.4.13 -> 1.6.9
2. Add DSM 7 compliance" +CHANGELOG = "1. Update memcached from v1.4.13 to v1.6.15.
2. Add DSM 7 compliance." + HOMEPAGE = https://memcached.org/ LICENSE = CONF_DIR = src/conf -SPK_USER = auto -SYSTEM_GROUP = http - +SERVICE_USER = auto SERVICE_PORT = 11211 -SERVICE_PORT_TITLE = $(DISPLAY_NAME) -NO_SERVICE_SHORTCUT = yes -SERVICE_SETUP = src/service-setup.sh -# This is a bogus value to ensure that everything is tailored for a SERVICE_COMMAND -# The real value is defined by the setup file -SERVICE_COMMAND = memcached +# SERVICE_COMMAND is defined in service setup script +STARTABLE = yes +SERVICE_SETUP = src/service-setup.sh INSTALL_DEP_SERVICES = apache-web START_DEP_SERVICES = apache-web From febf56e93edf9e1d8fcbd883d6b6368d78e6982a Mon Sep 17 00:00:00 2001 From: hgy59 Date: Sat, 21 May 2022 15:52:22 +0200 Subject: [PATCH 23/31] framework: enhanced for custom app/config file - add Makefile variable DSM_UI_CONFIG for package specific app/config files --- mk/spksrc.service.mk | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mk/spksrc.service.mk b/mk/spksrc.service.mk index 08d9bba2897..08ffafe30fe 100644 --- a/mk/spksrc.service.mk +++ b/mk/spksrc.service.mk @@ -7,7 +7,7 @@ # conf/SPK_NAME.sc if SERVICE_PORT and DSM<7 # conf/resource if SERVICE_CERT or DSM7 # app/SPK_NAME.sc if SERVICE_PORT and DSM7 -# app/config if DSM_UI_DIR +# app/config if DSM_UI_DIR (may be overwritten by DSM_UI_CONFIG) # # Targets are executed in the following order: # service_msg_target @@ -418,6 +418,9 @@ endif DESC=$(shell echo ${DESCRIPTION} | sed -e 's/\\//g' -e 's/"/\\"/g') $(STAGING_DIR)/$(DSM_UI_DIR)/config: $(create_target_dir) +ifneq ($(wildcard $(DSM_UI_CONFIG)),) + cat $(DSM_UI_CONFIG) > $@ +else @echo '{}' | jq --arg name "${DISPLAY_NAME}" \ --arg desc "${DESC}" \ --arg id "com.synocommunity.packages.${SPK_NAME}" \ @@ -428,7 +431,7 @@ $(STAGING_DIR)/$(DSM_UI_DIR)/config: --arg type "${SERVICE_TYPE}" \ --argjson allUsers ${SERVICE_PORT_ALL_USERS} \ '{".url":{($$id):{"title":$$name, "desc":$$desc, "icon":$$icon, "type":$$type, "protocol":$$prot, "port":$$port, "url":$$url, "allUsers":$$allUsers, "grantPrivilege":"all", "advanceGrantPrivilege":true}}}' > $@ - +endif SERVICE_FILES += $(STAGING_DIR)/$(DSM_UI_DIR)/config endif endif From fd543451fb5b447e6d57c9df94b3334d573cd23f Mon Sep 17 00:00:00 2001 From: hgy59 Date: Sat, 21 May 2022 15:59:54 +0200 Subject: [PATCH 24/31] memcached: rework (2) - use custom app/config file to link with phpMemcachdAdmin - update icon - update config backup/restore and limit to DSM < 7 - set owner of config file on DSM < 7 --- spk/memcached/Makefile | 1 + spk/memcached/src/app/config | 2 +- spk/memcached/src/memcached.png | Bin 5567 -> 41254 bytes spk/memcached/src/service-setup.sh | 62 ++++++++++++++--------------- 4 files changed, 33 insertions(+), 32 deletions(-) diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index 640e95531b1..9351008ad03 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -19,6 +19,7 @@ CONF_DIR = src/conf SERVICE_USER = auto SERVICE_PORT = 11211 +DSM_UI_CONFIG = src/app/config # SERVICE_COMMAND is defined in service setup script STARTABLE = yes diff --git a/spk/memcached/src/app/config b/spk/memcached/src/app/config index 716ec041e6b..afa92b18eb5 100644 --- a/spk/memcached/src/app/config +++ b/spk/memcached/src/app/config @@ -2,7 +2,7 @@ ".url" : { "com.synocommunity.packages.memcached" : { "title": "phpMemcachedAdmin", - "desc": "phpMemcachedAdmin", + "desc": "PHPMemcachedAdmin - memcached admin interface", "icon": "images/memcached-{0}.png", "protocol": "http", "type": "url", diff --git a/spk/memcached/src/memcached.png b/spk/memcached/src/memcached.png index f9e20335a6620e283ad765b6365de36c5cf43663..85b5e396cbf8165a1686ee17658a8f289f45ae78 100644 GIT binary patch literal 41254 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 Tk7%s~z~^6`d)gJ6juHO{zmykv literal 5567 zcmV;w6+r5VP)&nFP> z%WgscZCi%>X>X^8I6v+d^mf0$nj%Fx$9Q##=8p{1 zT5GHL?xx2A+|l7omRjeN6kA*p1IA161=#$qnT~c^>FJ_;Ym5x>{Ov&m(BW*BdhU)= zaBXeJ2JOy(&Ygx17&~)^576H4-SYCuSRkjEe-9XOjidD zUAjVT3yY+O8rPgap+H%t?y<9{DBB*VAb-a-`J~fIZx1C84N>pMcS;6MlPhvy>x%~u zNK*J_ZV}8EC?9K~(MQixx~E$a1UG=|l<91zkw?!^F5V`dTT2WP2L0mDe$pdh(T=7E zJ)j$cVlwRs@wp!L>ERHKJ#w0X=@02`OYI=Qu2RQj?lRd5o`V`}%7(z$V9lZ9x6JGC(lg;t$9 zFi5jU4^vQ)I#I{`{Rdgu9I}+QMiKzq`I^Ua-CIg$pwUR9!7L3FKli}>lp5@prc#tm zvq?2`?18%J2Gwo$fZ%%6)RfM44osegJ0$E*oIH7q<$SAaO2U1GmMBfKcz~D93$_bA zq{$UIjoEw5Bd%hIXHA|s=32f3G=TZ2KD?Yw+HIZks>`lsFG%mI3T8EN2mb;<_p(ns104(uzVSlXTi2tbB||aWO2M3Fz#$Gi)ug!_Fi`}L zqL)iUJ*9Mm8;3@EJ+B0fe0iWx%#4+5^KiN>_xDn2|6s#>_gf7}P`Nef(u9;wHl>R> zWED!sym<`@52zWoyB;YKFLtNTedcgYb&Il!<Hfu-zb2tg6z3 z@|Y4`I5bprsamsL`>cr%MVlP&gR-b!sck%1tl2j2h|jypT+^m>Zlop&cw}{z4qUoQ z!F-sic@78Vco)c$IP&Sc}s}G<< z&uLorj>c*7l+btc6KY*p6hQ62@*#EK8Bq#80Jp*P==|_O3a;fuAV;pPO$l^7zjJhg zhAv+fkvp-a6!l-frPwdt22ywkx@k8~lcMrydWGV%^P;Q>hGcd+c;gne&dn>adTVArw=n9wcwJ;pzKlG(e$443`-5RZYk(Zcn$(NdvD*XOwIf|dzSBVE zY%+GUNU1Kft#?K?r3O==IVs(gT!~`Z4i!tg)~Zr_m~HruiOGgjI|djQS430k>g|AI z&d{aUy9SvK3!qsQIe;W9(-G;qm6Znox<+ZVr?4* znv~KVfaGNQ_8OP4?Cuh8i_f-ZBuPuNm39N%l;XRO>WX1mjS9`{Z=psU4IZpPmyQ zxUHys9YB(HHB$|*S?+F#It`T|cT==eo(t}J zN;lQ!!zIc9bWD1*&Ca=^NVl@Qbs;ITYsZqN$zd+R(e@yFCj|=BERA16!RZ>EtY1I^ zKN>S>GI4XJ?BFiyd`;<*(`5Tw0B(8lTv8@ed)xei(o9!HJt4hHiJ3XedE!>@#5-#N zNrKR9QPzwmn-m3DyH!ZBYIx09rY9z*>jHY5&9sn|Md0j(qtVXoD6`8zSLt|DGCUa6 z-ab8R?Ql_pLI;JggF!bWsn#fNfFvPenwGsQat2*`4&Dm9z`VAhNbTS*n8$BfT6WLc zZ5!RNL&A3RX*ZsLuBqCuL~1eN%o#xK%9PI3o#68F+oRagL4n=O+&ztkC3)~5(-ndS zq5MIi3*~Z3W+GMtsm~qItd@>%~n483`(FTSy94EdxBF zULYDsg+=pou$_oXJDWD{U6TzwMdT`EBwV1TDGhpbWtAe!X=d4)RGF6L71w3T%NJCa zVmIpoMtKS_g^bh{7d?V%<8$t*7NB9z*?=T>aNZUEd0m86%UU<4r_LNtmny4t1{M(@ zK3#RuBUrU-`3yZ^ZeGdML)-AKmWe6pm@&!I<=ftX?nH%{^0E%pgQZ9+lPJ){;b4KY zW;;zBrd=eH5%cCMTD!GmDk_{wa__3CalyS|r<-cCUr>%(W6G2cMXqgTZd>mh^oCXz z1d?Fg)GL58nzEtUSh<9C8xM2oX|N; zlf0UA@z!Kh*rp4sTne$4ns#dd@B=qLX7-&F8vuyeJ39^^^&;YC@cKvUbJ}pfvMkTH zwW__NVe2~{sqmhykrgss!OI2Khs^^Z*Mkg>3j2j~2eSR(|6UTC8l(sMgpXXv``J0_ z{p7A#j-<*>gc8RV1{672(5+Rtx_pGyUI1ON6|u%kfe_eEhg^>dU%I+%$Mz+I*Kd)| zAcNwuKte2%2-bE85P)9e_XF2Z+93mFOw+T7SWlfZ)-H@nZWhY4x7SPyA`%CV9`5Au zYF7Nk_nKqnaga}YLJc&{+7`vj{p-AA??R?4ZrNqxG>Am~V%oJj$E0z6IITj>!J^sR zp$YADG)Z+EZBPM}q=Lu0O}b_6*!3}&P~XEo=<)t_o@(zQ__S3!mI2Qu;-2q~?nd** zPSe6`sK}xN`KAS(HE3)wplWt$0dX)7?K(;~#7R!Ih#n}D%?Y|@v3F(m%;m7j-%cL2 zSxug=bakoAWNufe#>m~>E7R@$TC7tCRph!sx%Rj?4rI5;^`boQOei^?oOU6WuW47f zgkTplwX4h?I~|NOPPgk|gX_;xkn)PnbIPxAHn#x`CpoFk0$R(Ub&p%pg^r_+@vTK=!`Z)hqXlkydg2jaDSL|`Ye|}swKIm>g55nIAczAUO;fa zd}G$t?*=-w&+=j`Vae&-pH8%gS5t(k9M(QPwduY>t?2 z?jyR;$kyaiO^w7thO{`Y(%1x83p3*b6~@!BHc$FCbdK^7zH6vLj|>N9HVG88A`5tnj6j2wzg&H~^i!+SjvbpINZpEK94=3ghXv(YuXGW|apw7^zr( zaMO?hJ5Klas{0+dJa)ruRoF{*&rv$$7q;#O#R51?c*tf%s30Jsl&w0T`~%DHu@W54 z7dq%?#sOCDwx9jN!1$-aZ_%BS@)z|ey{{h>T%?pj4KaV-CY&D8W5 zQ514o^C=W1b15e9CJn|0Of6F^}g$Rym)MigD+@|s;&sZf-m0zuqGh3&VK#4z@Fk}%JP-GV%1kb& zEUs@?m-GI($EaYs;875(o=qS) z;Ea!qi{B0%K2#h4<#i?5)}3dQDbdkE{cJB+^NyjeTrNjL2k)a;YfHsvrc-H}nw+Ax zcpDAwAFSeA(rALs%+=LZzGojrqG3^YY5Nb{x1WMI4eH)Fh52{9exmfJWT?=|R5~iomJwq`p=EI^q!v>1~MZyvK$&WA67#V?_-E*MUwWPj zWzn{{7v*02$M1_eAAjO;I>5l|W%q?cVY+_xLmK(vn{A=XzQfkdEq$<@w=8UPsIDb{jcX~nt?xd z>Nq{}_~$nCMI;iTi|5~^%d_*l8}#*2tkJLk?=s!~=o9+N*S<;0gf$&-dP^>4_P>FR;O> zlAL48gDaH>6P}6pbU-gKXvjrTV>^<5`QN{wo7Zj%piv*%iu;$6sUjC!PA$_rZ@w++ zbo$`Qt@uI1vCGokGeVH~T#uEtv06KB( z-dM5GLAW+U8U?ffrPFCB;6=I5y|>HJ3YsgGqp+1T7X*^;8}^z_Vt0m z7lUP!KbSe6V+tD|9TQZ#xh{)?M59r9@Wg}GCV84EfQl#L8{{(vWJ@eY?fgto@6^N; z_eZLzLpVU9>?Hq&L4<2-Yio4+;WIR_Z?NuxRE_b-VKoak%ISOnSPldR04V0E=bmP^ z8Kl*fReJ5auL^mIvSx9izA1nYVS>dTP@yXRYIGu4b+Cea6EJ}N4j$OY)bnE5AY~3P zI=-o{5Z6`hSpYWP9;auReQy*gB;l(2W+y0Af}Kk?{ zu53UHtT2{q*uzJLDZ!LnIvDVbkvk)TJ!{N;plD8G$LSK8zQ$HUv~({yendPTr(U*H zFktY0xEIfx7@J^`G+R{Mj-NbU6mQ@p*-VCRVF`7eqkroUx@oaK=S7{*CY4=hWeJUY z;>%BN8VJy|NAHb_PBpN5g(z=UsMjcp3VeU`3!mRK$Z-7!|NNTJ1wUigoYxJffu1D0=zav)|=Ef1pa`UEN)RvU1s+^_k^0>}1&H z02IHWA#DgksPKGr8dxWOLwS@%9h*LL{Q$G2rG=?7QI#T47l7=$Rv`nPre6skxG|gjMP_SIS4nXmqTh--QCyp{&3e*zT(34s86gupC ztGd$5X_ocN6|Eqx0Xs@JM5dQ^M77UoOwh$q9j@wviRU69Ay6eQuby?4Uw2g(^a&4V zLHr4qPhs*w_d)lQ54xXx(Ea3t?k68~Klz~h$p_s}yC3wl-!)B<;Co+j3;ItvkNJJJ z=hIEjzjO=wo1Fi~@3TFhzQg$qx1eV^f1C4P`Te#h6DIV(#rf4rqI$bowm;$gI_H-- z?wEwJ diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 975a7114ad8..197e7a14fcc 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -1,57 +1,57 @@ -#!/bin/sh -# Others -# Only used for DSM 6 -DSM6_WEB_DIR="/var/services/web" -WEB_DIR="/var/services/web_packages" if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then -WEB_DIR="${DSM6_WEB_DIR}" + # Only used for DSM 6 + WEB_DIR="/var/services/web" + CONFIG_DIR="${WEB_DIR}/phpMemcachedAdmin/Config" + CONFIG_FILE="${CONFIG_DIR}/Memcache.php" + CONFIG_BACKUP="${TMP_DIR}/Config" fi -PATH="${SYNOPKG_PKGDEST}/bin:/usr/local/bin:/bin:/usr/bin:/usr/syno/bin" +PATH="${SYNOPKG_PKGDEST}/bin:${PATH}" MEMCACHED="${SYNOPKG_PKGDEST}/bin/memcached" -SERVICE_COMMAND="${MEMCACHED} -d -m `awk '/MemTotal/{memory=$2/1024*0.15; if (memory > 64) memory=64; printf "%0.f", memory}' /proc/meminfo` -P ${PID_FILE}" -CONFIG_DIR="${WEB_DIR}/phpMemcachedAdmin/Config" -CONFIG_BACKUP="${TMP_DIR}/Config" +MEMORY=$(awk '/MemTotal/{memory=$2/1024*0.15; if (memory > 64) memory=64; printf "%0.f", memory}' /proc/meminfo) +SERVICE_COMMAND="${MEMCACHED} -d -m ${MEMORY} -P ${PID_FILE}" service_postinst () { if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then - - # Install the web interface - cp -Rpv "${SYNOPKG_PKGDEST}/share/phpMemcachedAdmin" "${WEB_DIR}" - - chown http "${WEB_DIR}/phpMemcachedAdmin/Temp/" - - chown http "${WEB_DIR}/phpMemcachedAdmin/Config/" + + # Install the web interface + cp -Rpv "${SYNOPKG_PKGDEST}/share/phpMemcachedAdmin" "${WEB_DIR}" + + if [ -d "${CONFIG_BACKUP}" ]; then + tar -cf - -C "${CONFIG_BACKUP}" --exclude="Memcache.sample.php" . | tar -xvf - -C "${CONFIG_DIR}" + fi + + chown http "${WEB_DIR}/phpMemcachedAdmin/Temp/" + chown http "${CONFIG_DIR}" + chown http "${CONFIG_FILE}" fi } -service_postuninst () +service_preuninst () { if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then - # Remove the web interface - rm -fr "${WEB_DIR}/phpMemcachedAdmin" + if [ "${SYNOPKG_PKG_STATUS}" == "UPGRADE" ]; then + if [ -d "${TMP_DIR}/Config/" ]; then + cp -pRv "${TMP_DIR}/Config" "${TMP_DIR}" + fi + fi fi } -service_restore () +service_postuninst () { - if [ -d "${CONFIG_BACKUP}" ]; then - tar -cf - -C "${CONFIG_BACKUP}" . | tar -xf - -C "${CONFIG_DIR}" - rm -rvf "${CONFIG_BACKUP}" + if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then + # Remove the web interface + rm -fr "${WEB_DIR}/phpMemcachedAdmin" fi } service_preupgrade () { - if [ -d "${CONFIG_DIR}" ]; then - mkdir -p "${CONFIG_BACKUP}" - tar -cf - -C "${CONFIG_DIR}" --exclude="Memcache.sample.php" . | tar -xf - -C "${CONFIG_BACKUP}" - fi if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then - # Remove the web interface - rm -fr "${WEB_DIR}/phpMemcachedAdmin" + # Remove the web interface + rm -fr "${WEB_DIR}/phpMemcachedAdmin" fi } - From fd55dcb626bedda2db33337f3377b994d025ff08 Mon Sep 17 00:00:00 2001 From: hgy59 Date: Thu, 2 Jun 2022 20:54:55 +0200 Subject: [PATCH 25/31] minor cleanup - update license - remove autoconf as configure script is included --- cross/memcached/Makefile | 8 +------- spk/memcached/Makefile | 4 ++-- spk/memcached/src/service-setup.sh | 2 +- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/cross/memcached/Makefile b/cross/memcached/Makefile index 023a5ea8adf..00d5558b647 100644 --- a/cross/memcached/Makefile +++ b/cross/memcached/Makefile @@ -9,14 +9,8 @@ DEPENDS = cross/libevent HOMEPAGE = https://www.memcached.org/ COMMENT = Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load. -LICENSE = BSD - -PRE_CONFIGURE_TARGET = memcached_pre_configure +LICENSE = 3-Clause BSD GNU_CONFIGURE = 1 include ../../mk/spksrc.cross-cc.mk - -.PHONY: memcached_pre_configure -memcached_pre_configure: - @$(RUN) autoconf diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index 9351008ad03..0bf7e377c7a 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -13,7 +13,7 @@ DISPLAY_NAME = Memcached CHANGELOG = "1. Update memcached from v1.4.13 to v1.6.15.
2. Add DSM 7 compliance." HOMEPAGE = https://memcached.org/ -LICENSE = +LICENSE = 3-Clause BSD CONF_DIR = src/conf @@ -37,4 +37,4 @@ memcached_extra_install: install -m 755 -d $(STAGING_DIR)/app install -m 644 src/app/config $(STAGING_DIR)/app/config install -m 775 $(STAGING_DIR)/share/phpMemcachedAdmin/Config/Memcache.sample.php \ - $(STAGING_DIR)/share/phpMemcachedAdmin/Config/Memcache.php + $(STAGING_DIR)/share/phpMemcachedAdmin/Config/Memcache.php diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 197e7a14fcc..5834cabb7c5 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -18,7 +18,7 @@ service_postinst () # Install the web interface cp -Rpv "${SYNOPKG_PKGDEST}/share/phpMemcachedAdmin" "${WEB_DIR}" - + if [ -d "${CONFIG_BACKUP}" ]; then tar -cf - -C "${CONFIG_BACKUP}" --exclude="Memcache.sample.php" . | tar -xvf - -C "${CONFIG_DIR}" fi From 73a8a459c1a749a45203193e575f6ca5e0d50d2d Mon Sep 17 00:00:00 2001 From: hgy59 Date: Thu, 2 Jun 2022 22:40:40 +0200 Subject: [PATCH 26/31] activate DSM 7 webservice icon - avoid default DSM UI icon on DSM 7 --- spk/memcached/src/conf/resource | 1 + 1 file changed, 1 insertion(+) diff --git a/spk/memcached/src/conf/resource b/spk/memcached/src/conf/resource index d3457c33606..e0ee9f965b9 100644 --- a/spk/memcached/src/conf/resource +++ b/spk/memcached/src/conf/resource @@ -8,6 +8,7 @@ "display_name": "phpMemcachedAdmin", "type": "apache_php", "root": "phpMemcachedAdmin", + "icon": "app/images/memcached-{0}.png", "backend": 2, "php": { "profile_name": "php-memcached-admin", From b6aa2ce4a496b63a578d715d68e35a6e0bdfc22e Mon Sep 17 00:00:00 2001 From: hgy59 Date: Fri, 3 Jun 2022 13:39:40 +0200 Subject: [PATCH 27/31] add diyspk/memaslap to test and benchmark memcached server - add cross/libmemcached - enable build of memaslap - fix build for DSM 7 (issue with newer compilers) - add patches for correct program name and faster build --- cross/libmemcached/Makefile | 21 ++++ cross/libmemcached/PLIST | 23 ++++ cross/libmemcached/digests | 3 + ...clients_memflush-for-newer-compilers.patch | 23 ++++ .../002-avoid-build-of-test-programs.patch | 15 +++ .../003-adjust-programname-of-memaslap.patch | 100 ++++++++++++++++++ diyspk/memaslap/Makefile | 16 +++ 7 files changed, 201 insertions(+) create mode 100644 cross/libmemcached/Makefile create mode 100644 cross/libmemcached/PLIST create mode 100644 cross/libmemcached/digests create mode 100644 cross/libmemcached/patches/001-fix-clients_memflush-for-newer-compilers.patch create mode 100644 cross/libmemcached/patches/002-avoid-build-of-test-programs.patch create mode 100644 cross/libmemcached/patches/003-adjust-programname-of-memaslap.patch create mode 100644 diyspk/memaslap/Makefile diff --git a/cross/libmemcached/Makefile b/cross/libmemcached/Makefile new file mode 100644 index 00000000000..be4233872da --- /dev/null +++ b/cross/libmemcached/Makefile @@ -0,0 +1,21 @@ +PKG_NAME = libmemcached +PKG_VERS = 1.0.18 +PKG_EXT = tar.gz +PKG_DIST_NAME = $(PKG_NAME)-$(PKG_VERS).$(PKG_EXT) +PKG_DIST_SITE = https://launchpad.net/libmemcached/1.0/$(PKG_VERS)/+download +PKG_DIR = $(PKG_NAME)-$(PKG_VERS) + +DEPENDS = cross/libevent + +HOMEPAGE = https://libmemcached.org/libMemcached.html +COMMENT = libMemcached is an open source C/C++ client library and tools for the memcached server. +LICENSE = 3-Clause BSD + +GNU_CONFIGURE = 1 +CONFIGURE_ARGS = --disable-static +CONFIGURE_ARGS += --enable-memaslap +CONFIGURE_ARGS += ax_cv_gcc_atomic_builtins=yes +# https://medium.com/swlh/the-complete-guide-to-benchmark-the-performance-of-memcached-on-ubuntu-16-04-71edeaf6e740 +CONFIGURE_ARGS += ax_cv_libevent=yes + +include ../../mk/spksrc.cross-cc.mk diff --git a/cross/libmemcached/PLIST b/cross/libmemcached/PLIST new file mode 100644 index 00000000000..ddba525d252 --- /dev/null +++ b/cross/libmemcached/PLIST @@ -0,0 +1,23 @@ +bin:bin/memaslap +bin:bin/memcapable +bin:bin/memcat +bin:bin/memcp +bin:bin/memdump +bin:bin/memerror +bin:bin/memexist +bin:bin/memflush +bin:bin/memparse +bin:bin/memping +bin:bin/memrm +bin:bin/memslap +bin:bin/memstat +bin:bin/memtouch +lnk:lib/libhashkit.so +lnk:lib/libhashkit.so.2 +lib:lib/libhashkit.so.2.0.0 +lnk:lib/libmemcached.so +lnk:lib/libmemcached.so.11 +lib:lib/libmemcached.so.11.0.0 +lnk:lib/libmemcachedutil.so +lnk:lib/libmemcachedutil.so.2 +lib:lib/libmemcachedutil.so.2.0.0 diff --git a/cross/libmemcached/digests b/cross/libmemcached/digests new file mode 100644 index 00000000000..aae74bf44b3 --- /dev/null +++ b/cross/libmemcached/digests @@ -0,0 +1,3 @@ +libmemcached-1.0.18.tar.gz SHA1 8be06b5b95adbc0a7cb0f232e237b648caf783e1 +libmemcached-1.0.18.tar.gz SHA256 e22c0bb032fde08f53de9ffbc5a128233041d9f33b5de022c0978a2149885f82 +libmemcached-1.0.18.tar.gz MD5 b3958716b4e53ddc5992e6c49d97e819 diff --git a/cross/libmemcached/patches/001-fix-clients_memflush-for-newer-compilers.patch b/cross/libmemcached/patches/001-fix-clients_memflush-for-newer-compilers.patch new file mode 100644 index 00000000000..d777f9bfd99 --- /dev/null +++ b/cross/libmemcached/patches/001-fix-clients_memflush-for-newer-compilers.patch @@ -0,0 +1,23 @@ +# avoid comparison of pointer with integer +# error: ISO C++ forbids comparison between pointer and integer [-fpermissive] +# +--- clients/memflush.cc.orig 2014-02-09 12:52:42.000000000 +0100 ++++ clients/memflush.cc 2022-06-03 10:06:40.989938212 +0200 +@@ -39,7 +39,7 @@ + { + options_parse(argc, argv); + +- if (opt_servers == false) ++ if (opt_servers == NULL) + { + char *temp; + +@@ -48,7 +48,7 @@ + opt_servers= strdup(temp); + } + +- if (opt_servers == false) ++ if (opt_servers == NULL) + { + std::cerr << "No Servers provided" << std::endl; + exit(EXIT_FAILURE); diff --git a/cross/libmemcached/patches/002-avoid-build-of-test-programs.patch b/cross/libmemcached/patches/002-avoid-build-of-test-programs.patch new file mode 100644 index 00000000000..3ff16e31940 --- /dev/null +++ b/cross/libmemcached/patches/002-avoid-build-of-test-programs.patch @@ -0,0 +1,15 @@ +# For faster build: +# - remove target with test programs (noinst_PROGRAMS) in generated Makefile. +# PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) +# +--- Makefile.in.orig 2014-02-09 11:52:56.000000000 +0000 ++++ Makefile.in 2022-06-03 08:39:02.989627735 +0000 +@@ -9961,7 +9961,7 @@ + $(MAKE) $(AM_MAKEFLAGS) check-TESTS + check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +-all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(DATA) $(HEADERS) \ ++all-am: Makefile $(LTLIBRARIES) $(bin_PROGRAMS) $(MANS) $(DATA) $(HEADERS) \ + mem_config.h + install-binPROGRAMS: install-libLTLIBRARIES + diff --git a/cross/libmemcached/patches/003-adjust-programname-of-memaslap.patch b/cross/libmemcached/patches/003-adjust-programname-of-memaslap.patch new file mode 100644 index 00000000000..f7f0697e6be --- /dev/null +++ b/cross/libmemcached/patches/003-adjust-programname-of-memaslap.patch @@ -0,0 +1,100 @@ +# Adjust the program name to be able to identify the tool as memaslap +# +# memslap is another tool of libmemcached, that is not as useful +# as it does not show stats nor accepts parameters such as threads or time. +# +--- clients/memaslap.c.orig 2014-02-09 11:52:42.000000000 +0000 ++++ clients/memaslap.c 2022-06-03 09:57:33.085672134 +0000 +@@ -1,5 +1,5 @@ + /* +- * memslap ++ * memaslap + * + * (c) Copyright 2009, Schooner Information Technology, Inc. + * All rights reserved. +@@ -32,7 +32,7 @@ + #include "ms_setting.h" + #include "ms_thread.h" + +-#define PROGRAM_NAME "memslap" ++#define PROGRAM_NAME "memaslap" + #define PROGRAM_DESCRIPTION \ + "Generates workload against memcached servers." + +@@ -111,7 +111,7 @@ + static void ms_statistic_init(void); + static void ms_stats_init(void); + static void ms_print_statistics(int in_time); +-static void ms_print_memslap_stats(struct timeval *start_time, ++static void ms_print_memaslap_stats(struct timeval *start_time, + struct timeval *end_time); + static void ms_monitor_slap_mode(void); + +@@ -130,7 +130,7 @@ + printf(" %s\n\n", description); + printf( + "Usage:\n" +- " memslap -hV | -s servers [-F config_file] [-t time | -x exe_num] [...]\n\n" ++ " memaslap -hV | -s servers [-F config_file] [-t time | -x exe_num] [...]\n\n" + "Options:\n"); + + for (int x= 0; long_options[x].name; x++) +@@ -146,13 +146,13 @@ + + printf( + "\nExamples:\n" +- " memslap -s 127.0.0.1:11211 -S 5s\n" +- " memslap -s 127.0.0.1:11211 -t 2m -v 0.2 -e 0.05 -b\n" +- " memslap -s 127.0.0.1:11211 -F config -t 2m -w 40k -S 20s -o 0.2\n" +- " memslap -s 127.0.0.1:11211 -F config -t 2m -T 4 -c 128 -d 20 -P 40k\n" +- " memslap -s 127.0.0.1:11211 -F config -t 2m -d 50 -a -n 40\n" +- " memslap -s 127.0.0.1:11211,127.0.0.1:11212 -F config -t 2m\n" +- " memslap -s 127.0.0.1:11211,127.0.0.1:11212 -F config -t 2m -p 2\n\n"); ++ " memaslap -s 127.0.0.1:11211 -S 5s\n" ++ " memaslap -s 127.0.0.1:11211 -t 2m -v 0.2 -e 0.05 -b\n" ++ " memaslap -s 127.0.0.1:11211 -F config -t 2m -w 40k -S 20s -o 0.2\n" ++ " memaslap -s 127.0.0.1:11211 -F config -t 2m -T 4 -c 128 -d 20 -P 40k\n" ++ " memaslap -s 127.0.0.1:11211 -F config -t 2m -d 50 -a -n 40\n" ++ " memaslap -s 127.0.0.1:11211,127.0.0.1:11212 -F config -t 2m\n" ++ " memaslap -s 127.0.0.1:11211,127.0.0.1:11212 -F config -t 2m -p 2\n\n"); + + exit(0); + } /* ms_help_command */ +@@ -286,7 +286,7 @@ + + case OPT_UDP: + return +- "UDP support, default memslap uses TCP, TCP port and UDP port of\n" ++ "UDP support, default memaslap uses TCP, TCP port and UDP port of\n" + " server must be same."; + + case OPT_EXPIRE: +@@ -708,8 +708,8 @@ + } /* ms_print_statistics */ + + +-/* used to print the states of memslap */ +-static void ms_print_memslap_stats(struct timeval *start_time, ++/* used to print the states of memaslap */ ++static void ms_print_memaslap_stats(struct timeval *start_time, + struct timeval *end_time) + { + char buf[1024]; +@@ -803,7 +803,7 @@ + + fprintf(stdout, "%s", buf); + fflush(stdout); +-} /* ms_print_memslap_stats */ ++} /* ms_print_memaslap_stats */ + + + /* the loop of the main thread, wait the work threads to complete */ +@@ -883,7 +883,7 @@ + gettimeofday(&end_time, NULL); + } + +- ms_print_memslap_stats(&start_time, &end_time); ++ ms_print_memaslap_stats(&start_time, &end_time); + } /* ms_monitor_slap_mode */ + + diff --git a/diyspk/memaslap/Makefile b/diyspk/memaslap/Makefile new file mode 100644 index 00000000000..ce0349471ef --- /dev/null +++ b/diyspk/memaslap/Makefile @@ -0,0 +1,16 @@ +SPK_NAME = memaslap +SPK_VERS = 1.0 +SPK_REV = 1 + +DEPENDS = cross/libmemcached + +MAINTAINER = SynoCommunity +DESCRIPTION = memaslap (contained in libMemcached) is a client tool to test memcached. +STARTABLE = no + +HOMEPAGE = http://docs.libmemcached.org/bin/memaslap.html +LICENSE = 3-Clause BSD + +SPK_COMMANDS = bin/memaslap + +include ../../mk/spksrc.spk.mk From 6b37ef48f592f6d9b7660556186688a880f2c200 Mon Sep 17 00:00:00 2001 From: hgy59 Date: Fri, 3 Jun 2022 18:07:02 +0200 Subject: [PATCH 28/31] memcachd: optimize code - use code optimization - fix build for OLD_PPC_ARCHS --- cross/memcached/Makefile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cross/memcached/Makefile b/cross/memcached/Makefile index 00d5558b647..27ed6e577ff 100644 --- a/cross/memcached/Makefile +++ b/cross/memcached/Makefile @@ -12,5 +12,13 @@ COMMENT = Free & open source, high-performance, distributed memory object cachi LICENSE = 3-Clause BSD GNU_CONFIGURE = 1 +ADDITIONAL_CFLAGS = -O + +include ../../mk/spksrc.archs.mk +ifeq ($(findstring $(ARCH),$(OLD_PPC_ARCHS)),$(ARCH)) +# EFD_NONBLOCK is not defined (define it OR disable use of eventfd) +#ADDITIONAL_CFLAGS += -DEFD_NONBLOCK=0x0004000 +CONFIGURE_ARGS = ac_cv_func_eventfd=no +endif include ../../mk/spksrc.cross-cc.mk From 31c93bedd4bca5c52e16fdc8c98e7cfe987484a7 Mon Sep 17 00:00:00 2001 From: hgy59 Date: Sat, 4 Jun 2022 15:06:28 +0200 Subject: [PATCH 29/31] update generic installers - remove SYNOPKG_DSM_VERSION_MAJOR check in installers - use GROUP variable for group in set_unix_permissions for DSM 6 --- mk/spksrc.service.installer.dsm5 | 24 +++++++++--------------- mk/spksrc.service.installer.dsm6 | 4 ++-- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/mk/spksrc.service.installer.dsm5 b/mk/spksrc.service.installer.dsm5 index 8c2ec936a18..0efcc29af17 100644 --- a/mk/spksrc.service.installer.dsm5 +++ b/mk/spksrc.service.installer.dsm5 @@ -174,11 +174,7 @@ set_unix_permissions () DIRNAME=$1 if [ -n "${EFF_USER}" ]; then echo "Granting '${EFF_USER}' unix ownership on ${DIRNAME}" - if [ $SYNOPKG_DSM_VERSION_MAJOR -lt 6 ]; then - chown -R ${EFF_USER}:root "${DIRNAME}" - else - chown -R ${EFF_USER}:${USER} "${DIRNAME}" - fi + chown -R ${EFF_USER}:root "${DIRNAME}" fi } @@ -246,16 +242,14 @@ postinst () # Service user management if [ -n "${EFF_USER}" ]; then - if [ $SYNOPKG_DSM_VERSION_MAJOR -lt 6 ]; then - # DSM 5 specific operations - # Create prefixed synouser - if ! cat /etc/passwd | grep "${EFF_USER}:x:" &> /dev/null; then - synouser --add "${EFF_USER}" "" "$USER_DESC" 0 "" 0 2>&1 | install_log - # Set HOME for consistency with DSM 6, location available even if homes not enabled - BACKUP_PASSWD="/tmp/install_${SYNOPKG_PKGNAME}_passwd" - cp /etc/passwd ${BACKUP_PASSWD} 2>&1 | install_log - sed -i "s#/var/services/homes/${EFF_USER}#/var/packages/${SYNOPKG_PKGNAME}/target#" /etc/passwd 2>&1 | install_log - fi + # DSM 5 specific operations + # Create prefixed synouser + if ! cat /etc/passwd | grep "${EFF_USER}:x:" &> /dev/null; then + synouser --add "${EFF_USER}" "" "$USER_DESC" 0 "" 0 2>&1 | install_log + # Set HOME for consistency with DSM 6, location available even if homes not enabled + BACKUP_PASSWD="/tmp/install_${SYNOPKG_PKGNAME}_passwd" + cp /etc/passwd ${BACKUP_PASSWD} 2>&1 | install_log + sed -i "s#/var/services/homes/${EFF_USER}#/var/packages/${SYNOPKG_PKGNAME}/target#" /etc/passwd 2>&1 | install_log fi # Register service in "users" group to access any content if [ "$ADD_USER_IN_USERS" = "yes" ]; then diff --git a/mk/spksrc.service.installer.dsm6 b/mk/spksrc.service.installer.dsm6 index 264e4c9d118..c501184d118 100644 --- a/mk/spksrc.service.installer.dsm6 +++ b/mk/spksrc.service.installer.dsm6 @@ -178,8 +178,8 @@ set_unix_permissions () DIRNAME=$1 if [ -n "${EFF_USER}" ]; then echo "Granting '${EFF_USER}' unix ownership on ${DIRNAME}" - if [ $SYNOPKG_DSM_VERSION_MAJOR -lt 6 ]; then - chown -R ${EFF_USER}:root "${DIRNAME}" + if [ -n "${GROUP}" ]; then + chown -R ${EFF_USER}:${GROUP} "${DIRNAME}" else chown -R ${EFF_USER}:${USER} "${DIRNAME}" fi From 2dadf1c8272abedca9016049f82e2480c78bbe8c Mon Sep 17 00:00:00 2001 From: hgy59 Date: Sat, 4 Jun 2022 15:33:14 +0200 Subject: [PATCH 30/31] fix phpmemcachedadmin configuration - update phpmemcachedadmin to store config in var folder and link as Config into web folder - fix folder permissions for phpmemcachedadmin - create Memcache.php on demand --- cross/phpmemcachedadmin/Makefile | 17 ++++++++-- cross/phpmemcachedadmin/PLIST | 1 + diyspk/memaslap/Makefile | 2 +- spk/memcached/Makefile | 6 ++-- spk/memcached/src/service-setup.sh | 54 +++++++----------------------- 5 files changed, 31 insertions(+), 49 deletions(-) diff --git a/cross/phpmemcachedadmin/Makefile b/cross/phpmemcachedadmin/Makefile index dc359ee8a86..6afc92af3c8 100644 --- a/cross/phpmemcachedadmin/Makefile +++ b/cross/phpmemcachedadmin/Makefile @@ -21,9 +21,20 @@ INSTALL_TARGET = phpmemcachedadmin_install include ../../mk/spksrc.install-resources.mk +CONFIG_FOLDER = $(STAGING_INSTALL_PREFIX)/var/phpmemcachedadmin.config + +# remarks: +# PLIST must containe rsc:var/* +# without '*' wildcard, the folder is not copied to the staging folder +# for packages for DSM 7 + .PHONY: phpmemcachedadmin_install -# make a copy of the sample config as on DSM7 it is not possible to create this at installation time. +# link the Config folder into var for backup/restore on package update +# and for on demand creation of the default config on DSM 7. phpmemcachedadmin_install: @mkdir -p $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME) - @tar -cf - -C $(WORK_DIR)/$(PKG_DIR) . | tar -xf - -C $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME) - @cp -f $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME)/Config/Memcache.sample.php $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME)/Config/Memcache.php + @tar -cf - -C $(WORK_DIR)/$(PKG_DIR) --exclude Config . | tar -xf - -C $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME) + @echo folder=$(CONFIG_FOLDER) + @install -d -m 755 $(CONFIG_FOLDER) + @install -m 755 $(WORK_DIR)/$(PKG_DIR)/Config/* $(CONFIG_FOLDER)/ + @cd $(STAGING_INSTALL_PREFIX)/share/$(PKG_NAME) && ln -sf $(INSTALL_PREFIX_VAR)/phpmemcachedadmin.config Config diff --git a/cross/phpmemcachedadmin/PLIST b/cross/phpmemcachedadmin/PLIST index 61759b8f587..02a341361c5 100644 --- a/cross/phpmemcachedadmin/PLIST +++ b/cross/phpmemcachedadmin/PLIST @@ -1 +1,2 @@ rsc:share/phpMemcachedAdmin/ +rsc:var/* diff --git a/diyspk/memaslap/Makefile b/diyspk/memaslap/Makefile index ce0349471ef..eeffd97d6b4 100644 --- a/diyspk/memaslap/Makefile +++ b/diyspk/memaslap/Makefile @@ -5,7 +5,7 @@ SPK_REV = 1 DEPENDS = cross/libmemcached MAINTAINER = SynoCommunity -DESCRIPTION = memaslap (contained in libMemcached) is a client tool to test memcached. +DESCRIPTION = memaslap is a load generation and benchmark tool for memcached servers. It generates configurable workload such as threads, concurrencies, connections, run time, overwrite, miss rate, key size, value size, get/set proportion, expected throughput, and so on. STARTABLE = no HOMEPAGE = http://docs.libmemcached.org/bin/memaslap.html diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index 0bf7e377c7a..d0504c398c2 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -34,7 +34,5 @@ include ../../mk/spksrc.spk.mk .PHONY: memcached_extra_install memcached_extra_install: - install -m 755 -d $(STAGING_DIR)/app - install -m 644 src/app/config $(STAGING_DIR)/app/config - install -m 775 $(STAGING_DIR)/share/phpMemcachedAdmin/Config/Memcache.sample.php \ - $(STAGING_DIR)/share/phpMemcachedAdmin/Config/Memcache.php + @install -m 755 -d $(STAGING_DIR)/app $(STAGING_DIR)/var/phpmemcachedadmin.config + @install -m 644 src/app/config $(STAGING_DIR)/app/config diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 5834cabb7c5..812f7747057 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -1,10 +1,9 @@ if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then - # Only used for DSM 6 - WEB_DIR="/var/services/web" - CONFIG_DIR="${WEB_DIR}/phpMemcachedAdmin/Config" - CONFIG_FILE="${CONFIG_DIR}/Memcache.php" - CONFIG_BACKUP="${TMP_DIR}/Config" + # for DSM < 7 + CONFIG_DIR="${SYNOPKG_PKGVAR}/phpmemcachedadmin.config" + # for owner of var folder + GROUP=http fi PATH="${SYNOPKG_PKGDEST}/bin:${PATH}" @@ -14,44 +13,17 @@ SERVICE_COMMAND="${MEMCACHED} -d -m ${MEMORY} -P ${PID_FILE}" service_postinst () { - if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then - - # Install the web interface - cp -Rpv "${SYNOPKG_PKGDEST}/share/phpMemcachedAdmin" "${WEB_DIR}" - - if [ -d "${CONFIG_BACKUP}" ]; then - tar -cf - -C "${CONFIG_BACKUP}" --exclude="Memcache.sample.php" . | tar -xvf - -C "${CONFIG_DIR}" - fi - - chown http "${WEB_DIR}/phpMemcachedAdmin/Temp/" - chown http "${CONFIG_DIR}" - chown http "${CONFIG_FILE}" + # create Memcache.php on demand + if [ ! -e "${SYNOPKG_PKGVAR}/phpmemcachedadmin.config/Memcache.php" ]; then + echo "Create default config file Memcache.php" + cp -f ${SYNOPKG_PKGVAR}/phpmemcachedadmin.config/Memcache.sample.php ${SYNOPKG_PKGVAR}/phpmemcachedadmin.config/Memcache.php fi -} -service_preuninst () -{ - if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then - if [ "${SYNOPKG_PKG_STATUS}" == "UPGRADE" ]; then - if [ -d "${TMP_DIR}/Config/" ]; then - cp -pRv "${TMP_DIR}/Config" "${TMP_DIR}" - fi - fi - fi -} - -service_postuninst () -{ - if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then - # Remove the web interface - rm -fr "${WEB_DIR}/phpMemcachedAdmin" - fi -} - -service_preupgrade () -{ if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then - # Remove the web interface - rm -fr "${WEB_DIR}/phpMemcachedAdmin" + # make config writable by user http + chmod -R g+w ${CONFIG_DIR} + chown -R :http ${SYNOPKG_PKGDEST}/share + # make Temp and other folders ritable by user http + chmod -R g+w ${SYNOPKG_PKGDEST}/share fi } From ac1ae8ccd13d623befb2f330f310281da6cc7ec4 Mon Sep 17 00:00:00 2001 From: hgy59 Date: Sat, 4 Jun 2022 16:38:42 +0200 Subject: [PATCH 31/31] cleanup --- cross/phpmemcachedadmin/Makefile | 5 ----- cross/phpmemcachedadmin/PLIST | 2 +- spk/memcached/Makefile | 2 +- spk/memcached/src/service-setup.sh | 4 ++-- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/cross/phpmemcachedadmin/Makefile b/cross/phpmemcachedadmin/Makefile index 6afc92af3c8..02b21b3fa7a 100644 --- a/cross/phpmemcachedadmin/Makefile +++ b/cross/phpmemcachedadmin/Makefile @@ -23,11 +23,6 @@ include ../../mk/spksrc.install-resources.mk CONFIG_FOLDER = $(STAGING_INSTALL_PREFIX)/var/phpmemcachedadmin.config -# remarks: -# PLIST must containe rsc:var/* -# without '*' wildcard, the folder is not copied to the staging folder -# for packages for DSM 7 - .PHONY: phpmemcachedadmin_install # link the Config folder into var for backup/restore on package update # and for on demand creation of the default config on DSM 7. diff --git a/cross/phpmemcachedadmin/PLIST b/cross/phpmemcachedadmin/PLIST index 02a341361c5..46955e2bfb8 100644 --- a/cross/phpmemcachedadmin/PLIST +++ b/cross/phpmemcachedadmin/PLIST @@ -1,2 +1,2 @@ rsc:share/phpMemcachedAdmin/ -rsc:var/* +rsc:var/phpmemcachedadmin.config/ diff --git a/spk/memcached/Makefile b/spk/memcached/Makefile index d0504c398c2..a6f0c6fb290 100644 --- a/spk/memcached/Makefile +++ b/spk/memcached/Makefile @@ -34,5 +34,5 @@ include ../../mk/spksrc.spk.mk .PHONY: memcached_extra_install memcached_extra_install: - @install -m 755 -d $(STAGING_DIR)/app $(STAGING_DIR)/var/phpmemcachedadmin.config + @install -m 755 -d $(STAGING_DIR)/app @install -m 644 src/app/config $(STAGING_DIR)/app/config diff --git a/spk/memcached/src/service-setup.sh b/spk/memcached/src/service-setup.sh index 812f7747057..0ead8cf1e45 100644 --- a/spk/memcached/src/service-setup.sh +++ b/spk/memcached/src/service-setup.sh @@ -20,10 +20,10 @@ service_postinst () fi if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ]; then - # make config writable by user http + # make config writable by http group chmod -R g+w ${CONFIG_DIR} chown -R :http ${SYNOPKG_PKGDEST}/share - # make Temp and other folders ritable by user http + # make Temp and other folders writable by http group chmod -R g+w ${SYNOPKG_PKGDEST}/share fi }