Date: Tue, 28 Apr 2026 12:20:01 +0000 From: Ronald Klop <ronald@FreeBSD.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org Cc: Angelo Polo <language.devel@gmail.com> Subject: git: 7390911f653d - main - databases/cassandra5: new port Cassandra 5.0 Message-ID: <69f0a5f1.2569b.131eaf7b@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch main has been updated by ronald: URL: https://cgit.FreeBSD.org/ports/commit/?id=7390911f653d615db8240fde5d0057f244eac2b4 commit 7390911f653d615db8240fde5d0057f244eac2b4 Author: Angelo Polo <language.devel@gmail.com> AuthorDate: 2026-04-22 05:45:41 +0000 Commit: Ronald Klop <ronald@FreeBSD.org> CommitDate: 2026-04-28 12:19:40 +0000 databases/cassandra5: new port Cassandra 5.0 Highly scalable distributed database PR: 282693 --- databases/Makefile | 1 + databases/cassandra5/Makefile | 199 ++ databases/cassandra5/distinfo | 7 + databases/cassandra5/files/cassandra.in | 39 + .../cassandra5/files/maven/.build/build-bench.xml | 153 ++ .../files/maven/.build/build-checkstyle.xml | 64 + .../cassandra5/files/maven/.build/build-cqlsh.xml | 24 + .../cassandra5/files/maven/.build/build-git.xml | 70 + .../cassandra5/files/maven/.build/build-owasp.xml | 118 ++ .../cassandra5/files/maven/.build/build-rat.xml | 111 ++ .../files/maven/.build/build-resolver.xml | 314 +++ .../cassandra5/files/maven/.build/build-sonar.xml | 247 +++ .../maven/.build/cassandra-build-deps-template.xml | 159 ++ .../files/maven/.build/cassandra-deps-template.xml | 380 ++++ .../cassandra5/files/maven/.build/checkstyle.xml | 188 ++ .../files/maven/.build/checkstyle_suppressions.xml | 25 + .../files/maven/.build/checkstyle_test.xml | 149 ++ .../files/maven/.build/generate-snyk-file | 75 + .../.build/owasp/dependency-check-suppressions.xml | 42 + .../files/maven/.build/parent-pom-template.xml | 1267 ++++++++++++ .../maven/.build/sonar/sonar-quality-gate.json | 22 + .../maven/.build/sonar/sonar-quality-profile.xml | 30 + .../files/maven/.build/sonar/sonar-report.sh | 66 + .../files/maven/.build/sonar/sonar-setup-local.sh | 74 + .../files/maven/build.properties.default | 23 + databases/cassandra5/files/maven/build.xml | 2094 ++++++++++++++++++++ .../cassandra/anttasks/EchoEclipseProjectLibs.java | 66 + .../apache/cassandra/anttasks/JdkProperties.java | 33 + .../cassandra/anttasks/SetSystemProperty.java | 62 + .../org/apache/cassandra/anttasks/TestHelper.java | 55 + .../cassandra/anttasks/TestNameCheckTask.java | 195 ++ databases/cassandra5/files/patch-build.xml | 153 ++ .../cassandra5/files/patch-conf_cassandra-env.sh | 11 + .../cassandra5/files/patch-conf_cassandra.yaml | 71 + databases/cassandra5/files/patch-doc_Makefile | 7 + ...rc_java_org_apache_cassandra_config_Config.java | 11 + ...cassandra_db_commitlog_MemoryMappedSegment.java | 11 + ...e_cassandra_service_NativeTransportService.java | 18 + ...org_apache_cassandra_service_StartupChecks.java | 17 + ..._apache_cassandra_utils_FastByteOperations.java | 108 + ...a_org_apache_cassandra_utils_NativeLibrary.java | 14 + .../files/patch-test_conf_cassandra-murmur.yaml | 10 + .../files/patch-test_conf_cassandra-seeds.yaml | 10 + .../files/patch-test_conf_cassandra.yaml | 10 + ...-test_conf_unit-test-conf_test-native-port.yaml | 10 + databases/cassandra5/pkg-descr | 12 + databases/cassandra5/pkg-message | 9 + databases/cassandra5/pkg-plist | 184 ++ 48 files changed, 7018 insertions(+) diff --git a/databases/Makefile b/databases/Makefile index 52bf7ba758e6..50083c93131a 100644 --- a/databases/Makefile +++ b/databases/Makefile @@ -30,6 +30,7 @@ SUBDIR += cassandra-cpp-driver SUBDIR += cassandra3 SUBDIR += cassandra4 + SUBDIR += cassandra5 SUBDIR += casstcl SUBDIR += cayley SUBDIR += cdb diff --git a/databases/cassandra5/Makefile b/databases/cassandra5/Makefile new file mode 100644 index 000000000000..7af4c9afebd7 --- /dev/null +++ b/databases/cassandra5/Makefile @@ -0,0 +1,199 @@ +PORTNAME= cassandra +DISTVERSION= 5.0.8 +CATEGORIES= databases java +MASTER_SITES= https://archive.apache.org/dist/${PORTNAME}/${DISTVERSION}/:apache \ + https://repo1.maven.org/maven2/com/github/luben/zstd-jni/1.5.6-7/:maven +PKGNAMESUFFIX= 5 +DISTNAME= apache-${PORTNAME}-${DISTVERSION}-src +DISTFILES= ${DISTNAME}.tar.gz:apache \ + ${ZSTD_DISTFILE} \ + ${MAVEN_CACHE_FILE}:prefetch +DIST_SUBDIR= ${PORTNAME} +EXTRACT_ONLY= ${DISTNAME}.tar.gz \ + ${MAVEN_CACHE_FILE} + +MAINTAINER= language.devel@gmail.com +COMMENT= Highly scalable distributed database +WWW= https://cassandra.apache.org/ + +LICENSE= APACHE20 +LICENSE_FILE= ${WRKSRC}/LICENSE.txt + +FETCH_DEPENDS= ${JAVA}:${JAVA_PORT} \ + ant:devel/apache-ant +RUN_DEPENDS= snappyjava>=0:archivers/snappy-java \ + netty>0:java/netty + +USES= cpe java:ant python shebangfix +USE_RC_SUBR= cassandra +SHEBANG_FILES= bin/cqlsh.py pylib/setup.py +TEST_TARGET= test +CPE_VENDOR= apache + +CONFLICTS= cassandra[34] + +JAVA_VERSION= 11 17 +JAVA_VENDOR= openjdk + +FETCH_ENV+= JAVA_HOME=${JAVA_HOME} +SUB_LIST= JAVA_HOME=${JAVA_HOME} + +USERS= cassandra +GROUPS= cassandra + +DATADIR= ${JAVASHAREDIR}/${PORTNAME} +BUILD_DIST_DIR= ${WRKSRC}/build/dist +REPO_DIR= ${WRKDIR}/repository + +CONFIG_FILES= cassandra-env.sh \ + cassandra-jaas.config \ + cassandra-rackdc.properties \ + cassandra.yaml \ + cassandra_latest.yaml \ + commitlog_archiving.properties \ + hotspot_compiler \ + jvm11-clients.options \ + jvm11-server.options \ + jvm17-clients.options \ + jvm17-server.options \ + jvm-clients.options \ + jvm-server.options \ + logback-tools.xml \ + logback.xml + +SCRIPT_FILES= cassandra \ + nodetool \ + sstableloader \ + sstablescrub \ + sstableupgrade \ + sstableutil \ + sstableverify + +ZSTDJNI_VERSION= ${MASTER_SITES:M*\:maven:H:T} +PLIST_SUB= DISTVERSION=${DISTVERSION} ZSTDJNI_VERSION=${ZSTDJNI_VERSION} + +OPTIONS_DEFINE= SIGAR DOCS +OPTIONS_SUB= yes + +SIGAR_DESC= Use SIGAR to collect system information +SIGAR_RUN_DEPENDS= java-sigar>=1.6.4:java/sigar + +DOCS_BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}sphinx>=0,1:textproc/py-sphinx@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}sphinx_rtd_theme>0:textproc/py-sphinx_rtd_theme@${PY_FLAVOR} + +PORTDOCS= * + +MAVEN_CACHE_FILE= apache-${PORTNAME}-${DISTVERSION}-repo.tar.xz + +post-patch: + @${REINPLACE_CMD} -e 's|for interpreter in |for interpreter in ${PYTHON_CMD} |' ${WRKSRC}/bin/cqlsh + +post-patch-DOCS-on: + @${REINPLACE_CMD} -e 's|python3|${PYTHON_CMD}|' ${WRKSRC}/doc/Makefile + +do-build: + @${DO_NADA} # Do nothing: Prevent USE_ANT from running a default build target. + +do-build-DOCS-on: + cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} CASSANDRA_LOG_DIR=${WRKDIR}/gen-doc-log ${ANT} -Dmaven.repo.local=${REPO_DIR} -Dlocal.repository=${REPO_DIR} ${USEJDK11} -Dpycmd=${PYTHON_CMD} -Dpyver=${PYTHON_VER} freebsd-stage-doc + +do-build-DOCS-off: + cd ${WRKSRC} && ${MAKE_ENV} ${ANT} -Dmaven.repo.local=${REPO_DIR} -Dlocal.repository=${REPO_DIR} ${USEJDK11} freebsd-stage + +post-build: +.for f in ${SCRIPT_FILES} + @${REINPLACE_CMD} -e 's|/usr/share/cassandra|${DATADIR}/bin|' ${BUILD_DIST_DIR}/bin/${f} +.endfor + @${REINPLACE_CMD} -e 's|`dirname "$$0"`/..|${DATADIR}|' ${BUILD_DIST_DIR}/bin/cassandra.in.sh + @${REINPLACE_CMD} -e 's|$$CASSANDRA_HOME/lib/sigar-bin|${JAVAJARDIR}|' ${BUILD_DIST_DIR}/bin/cassandra.in.sh + @${REINPLACE_CMD} -e 's|$$CASSANDRA_HOME/lib/sigar-bin|${JAVAJARDIR}|' ${BUILD_DIST_DIR}/conf/cassandra-env.sh + @${REINPLACE_CMD} -e 's|$$CASSANDRA_HOME/conf|${ETCDIR}|' ${BUILD_DIST_DIR}/bin/cassandra.in.sh +.for f in ${CONFIG_FILES} + @${MV} ${BUILD_DIST_DIR}/conf/${f} ${BUILD_DIST_DIR}/conf/${f}.sample +.endfor + @${MV} ${BUILD_DIST_DIR}/conf/cassandra-topology.properties.example ${BUILD_DIST_DIR}/conf/cassandra-topology.properties.sample + @${RM} ${BUILD_DIST_DIR}/lib/licenses/sigar* + @${RMDIR} ${BUILD_DIST_DIR}/lib/sigar-bin + @${RM} ${BUILD_DIST_DIR}/lib/zstd-jni* + @${RM} ${BUILD_DIST_DIR}/lib/licenses/zstd-jni* + +do-install: + ${MKDIR} ${STAGEDIR}${DATADIR} +.for f in CHANGES LICENSE NEWS NOTICE + cd ${BUILD_DIST_DIR} && ${INSTALL_DATA} ${f}.txt ${STAGEDIR}${DATADIR}/ +.endfor +.for d in lib pylib tools + cd ${BUILD_DIST_DIR} && ${COPYTREE_SHARE} ${d} ${STAGEDIR}${DATADIR}/ "! -path '*/bin/*'" +.endfor + ${MKDIR} ${STAGEDIR}${ETCDIR} + cd ${BUILD_DIST_DIR}/conf && ${COPYTREE_SHARE} . ${STAGEDIR}${ETCDIR}/ + cd ${BUILD_DIST_DIR} && ${COPYTREE_BIN} bin ${STAGEDIR}${DATADIR} + cd ${BUILD_DIST_DIR} && ${INSTALL_DATA} bin/cassandra.in.sh ${STAGEDIR}${DATADIR}/bin/ + cd ${BUILD_DIST_DIR} && ${COPYTREE_BIN} tools/bin ${STAGEDIR}${DATADIR}/ + cd ${BUILD_DIST_DIR} && ${INSTALL_DATA} tools/bin/cassandra.in.sh ${STAGEDIR}${DATADIR}/tools/bin/ + cd ${BUILD_DIST_DIR} && ${INSTALL_DATA} tools/lib/fqltool.jar ${STAGEDIR}${DATADIR}/tools/lib/ + cd ${BUILD_DIST_DIR} && ${INSTALL_DATA} tools/lib/stress.jar ${STAGEDIR}${DATADIR}/tools/lib/ +.for f in ${SCRIPT_FILES} + ${RLN} ${STAGEDIR}${DATADIR}/bin/${f} ${STAGEDIR}${PREFIX}/bin/${f} +.endfor + ${RLN} ${STAGEDIR}${DATADIR}/bin/cqlsh ${STAGEDIR}${PREFIX}/bin/cqlsh + ${LN} -s ${JAVAJARDIR}/snappy-java.jar ${STAGEDIR}${DATADIR}/lib/snappy-java.jar + +do-test: + @cd ${WRKSRC} && ${ANT} -Dmaven.repo.local=${REPO_DIR} -Dlocal.repository=${REPO_DIR} ${USEJDK11} -Dstagedlib=${STAGEDIR}${DATADIR}/lib test + +.include <bsd.port.pre.mk> + +pre-fetch: +.if !exists(${DISTDIR}/${DIST_SUBDIR}/${MAVEN_CACHE_FILE}) + ${MKDIR} ${DISTDIR}/${DIST_SUBDIR} + ${MKDIR} ${WRKSRC}/.build + ${MKDIR} ${WRKSRC}/src/java + ${CP} -r ${FILESDIR}/maven/test ${WRKSRC}/ + ${CP} ${FILESDIR}/maven/build.* ${WRKSRC}/ + ${CP} -r ${FILESDIR}/maven/.build ${WRKSRC}/ + cd ${WRKSRC} && ${FETCH_ENV} ${ANT} -Dmaven.repo.local=${REPO_DIR} -Dlocal.repository=${REPO_DIR} ${USEJDK11} resolver-dist-lib + cd ${REPO_DIR} && ${FIND} . -type f -name "*.repositories" -a -exec ${SED} -i '' -e '2s,.*,Mon Aug 08 20:40:04 CEST 2022,' {} + + cd ${WRKDIR} && ${MTREE_CMD} -cbnSp repository | ${MTREE_CMD} -C | ${SED} \ + -e 's:time=[0-9.]*:time=0.000000000:' \ + -e 's:\([gu]id\)=[0-9]*:\1=0:g' \ + -e 's:flags=.*:flags=none:' \ + -e 's:^\.:./repository:' \ + > maven-offline-cache.mtree + cd ${WRKDIR} && ${TAR} cJf ${DISTDIR}/${DIST_SUBDIR}/${MAVEN_CACHE_FILE} \ + @maven-offline-cache.mtree + ${SHA256} ${WRKDIR}/maven-offline-cache.mtree ${DISTDIR}/${DIST_SUBDIR}/${MAVEN_CACHE_FILE} +.endif + +.if ${JAVA_PORT_VERSION} == 11 +USEJDK11= -Duse.jdk11=true -Drat.skip=true +.endif + +.if ${ARCH} == amd64 +PLIST_SUB+= AMD64ONLY="" +.else +PLIST_SUB+= AMD64ONLY="@comment " +.endif + +.if ${ARCH} == amd64 +ZSTD_DISTFILE= zstd-jni-${MASTER_SITES:M*\:maven:H:T}-freebsd_${ARCH}.jar:maven +.else +ZSTD_DISTFILE= +.endif + +post-install: + ${LN} -s ${JAVAJARDIR}/netty.jar ${STAGEDIR}${DATADIR}/lib/netty.jar +.if ${ARCH} == amd64 + ${CP} ${DISTDIR}/${DIST_SUBDIR}/zstd-jni-${ZSTDJNI_VERSION}-freebsd_${ARCH}.jar ${STAGEDIR}${DATADIR}/lib/ +.endif + +post-install-DOCS-on: + ${MKDIR} ${STAGEDIR}${DOCSDIR} +.for d in doc javadoc + cd ${BUILD_DIST_DIR} && ${COPYTREE_SHARE} ${d} ${STAGEDIR}${DOCSDIR}/ +.endfor + +post-install-SIGAR-on: + ${LN} -s ${JAVAJARDIR}/sigar.jar ${STAGEDIR}${DATADIR}/lib/sigar.jar + +.include <bsd.port.post.mk> diff --git a/databases/cassandra5/distinfo b/databases/cassandra5/distinfo new file mode 100644 index 000000000000..8635b76112b8 --- /dev/null +++ b/databases/cassandra5/distinfo @@ -0,0 +1,7 @@ +TIMESTAMP = 1776391960 +SHA256 (cassandra/apache-cassandra-5.0.8-src.tar.gz) = d378d59b5f539dd69c4d3c284bb7e8c767dc255090b11acf3f4722e0833af24c +SIZE (cassandra/apache-cassandra-5.0.8-src.tar.gz) = 24857092 +SHA256 (cassandra/zstd-jni-1.5.6-7-freebsd_amd64.jar) = b50239f5e525d62ebc50398ed42a1473c83c3128f34c76755c3b59912123b9ef +SIZE (cassandra/zstd-jni-1.5.6-7-freebsd_amd64.jar) = 492759 +SHA256 (cassandra/apache-cassandra-5.0.8-repo.tar.xz) = 0a784de55b5fe2f3728b2b3bb564e8fffb833dd33e94c5f53e3f91c7480a36dc +SIZE (cassandra/apache-cassandra-5.0.8-repo.tar.xz) = 114267432 diff --git a/databases/cassandra5/files/cassandra.in b/databases/cassandra5/files/cassandra.in new file mode 100644 index 000000000000..9615fbe572f6 --- /dev/null +++ b/databases/cassandra5/files/cassandra.in @@ -0,0 +1,39 @@ +#!/bin/sh + +# PROVIDE: cassandra +# REQUIRE: LOGIN +# KEYWORD: shutdown +# +# Be sure to configure full settings in %%ETCDIR%% prior to enabling daemon. +# +# Add the following lines to /etc/rc.conf or /etc/.conf.local to +# enable the Cassandra daemon: +# cassandra_enable: Set to "YES" to enable the daemon. +# cassandra_user: The user under which to run the daemon. +# Defaults to "cassandra". + +. /etc/rc.subr + +name=cassandra +rcvar=cassandra_enable +desc="Cassandra daemon" + +load_rc_config $name + +: ${cassandra_enable:=NO} +: ${cassandra_user:=cassandra} + +pidfile=/var/run/cassandra/cassandra.pid + +command=/usr/sbin/daemon +command_args="-frP ${pidfile} %%PREFIX%%/bin/cassandra -f" +start_precmd="${name}_prestart" + +cassandra_prestart() +{ + export JAVA_HOME=%%JAVA_HOME%% + install -d -o ${cassandra_user} /var/run/cassandra + install -d -o ${cassandra_user} /var/log/cassandra +} + +run_rc_command "$1" diff --git a/databases/cassandra5/files/maven/.build/build-bench.xml b/databases/cassandra5/files/maven/.build/build-bench.xml new file mode 100644 index 000000000000..b10fc644250e --- /dev/null +++ b/databases/cassandra5/files/maven/.build/build-bench.xml @@ -0,0 +1,153 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<project basedir="." name="apache-cassandra-bench" + xmlns:if="ant:if" xmlns:unless="ant:unless"> + + <property name="async-profiler.version" value="2.9"/> + <condition property="async-profiler.suffix" value="linux-arm64"> + <and> + <os arch="aarch64"/> + <isset property="isLinux"/> + </and> + </condition> + <condition property="async-profiler.suffix" value="linux-x64"> + <and> + <os arch="amd64"/> + <isset property="isLinux"/> + </and> + </condition> + <condition property="async-profiler.suffix" value="macos"> + <isset property="isMac"/> + </condition> + <property name="async-profiler.name" value="async-profiler-${async-profiler.version}-${async-profiler.suffix}"/> + <property name="async-profiler.base" value="${build.dir}/async-profiler"/> + + <property name="test.profiler.opts.default" value="event=cpu;threads=true;output=flamegraph;simple=true;ann=true"/> + <property name="test.profiler.output" value="${build.test.dir}/profiler"/> + + <target name="microbench" depends="maybe-build-test"> + <jmh/> + </target> + + <target name="microbench-test" depends="maybe-build-test" description="test each microbench runs once"> + <!-- Only used to test jmh classes run without error. Not to be used for actual performance tests --> + <jmh> + <extra-args> + <arg value="-f"/><arg value="1"/> + <arg value="-wi"/><arg value="0"/> + <arg value="-i"/><arg value="1"/> + </extra-args> + </jmh> + </target> + + <target name="microbench-with-profiler" depends="maybe-build-test,-fetch-async-profiler"> + <condition property="test.profiler.opts" value="${test.profiler.opts.default}" else="${profiler.opts}"> + <or> + <not> + <isset property="profiler.opts"/> + </not> + <equals arg1="${profiler.opts}" arg2=""/> + </or> + </condition> + + <property name="async-profiler.lib.path" value="${async-profiler.base}/build/libasyncProfiler.so"/> + + <mkdir dir="${test.profiler.output}"/> + + <jmh> + <extra-args> + <arg value="-prof"/> + <arg value="async:libPath=${async-profiler.lib.path};dir=${test.profiler.output};${test.profiler.opts}"/> + </extra-args> + </jmh> + </target> + + <macrodef name="jmh"> + <element name="extra-args" optional="true"/> + <sequential> + <java classname="org.openjdk.jmh.Main" fork="true" failonerror="true" > + <classpath> + <path refid="cassandra.classpath.test"/> + <pathelement location="${test.classes}"/> + <pathelement location="${test.conf}"/> + <pathelement location="${async-profiler.base}/lib/async-profiler.jar"/> + <pathelement location="${async-profiler.base}/lib/converter.jar"/> + </classpath> + + <jvmarg line="${java-jvmargs}"/> + <jvmarg line="${_std-test-jvmargs}"/> + <jvmarg line="${test.jvm.args}"/> + + <!-- total memory must fit within the pod constraints, see comments in .jenkins/Jenkinsfile and dind's container resourceRequestMemory in .jenkins/k8s/jenkins-deployment.yaml --> + <!-- note! this is used for both the JMH runner and VMH fork --> + <jvmarg value="-Xmx1G"/> + + <arg value="-foe"/> + <arg value="true"/> + <arg value="-rf"/> + <arg value="json"/> + <arg value="-rff"/> + <arg value="${build.test.dir}/jmh-result.json"/> + <arg value="-v"/> + <arg value="EXTRA"/> + + <arg line="${jmh.args}"/> + + <extra-args/> + + <!-- TODO https://issues.apache.org/jira/browse/CASSANDRA-18873 --> + <!-- The classes listed below are broken, and so currently ignored, see CASSANDRA-18873 --> + <arg value="-e" if:blank="${benchmark.name}"/> + <arg value="AtomicBTreePartitionUpdateBench|BTreeSearchIteratorBench|BTreeTransformBench|BTreeUpdateBench|FastThreadLocalBench|KeyLookupBench|MutationBench|(instance.*Bench)|ReadWriteBench|ZeroCopyStreamingBench" if:blank="${benchmark.name}"/> + + <arg value=".*microbench.*${benchmark.name}"/> + </java> + </sequential> + </macrodef> + + <target name="-fetch-async-profiler"> + <mkdir dir="${tmp.dir}"/> + <mkdir dir="${async-profiler.base}"/> + + <antcall target="-fetch-async-profiler-mac" if:true="${isMac}" inheritrefs="true"/> + <antcall target="-fetch-async-profiler-linux" if:true="${isLinux}" inheritrefs="true"/> + + <move todir="${async-profiler.base}"> + <fileset dir="${async-profiler.base}/${async-profiler.name}"> + <include name="**"/> + </fileset> + </move> + <delete dir="${async-profiler.base}/${async-profiler.name}" includeemptydirs="true"/> + </target> + + <target name="-fetch-async-profiler-linux"> + <get src="https://github.com/async-profiler/async-profiler/releases/download/v${async-profiler.version}/${async-profiler.name}.tar.gz" + dest="${tmp.dir}/${async-profiler.name}.tar.gz" retries="3" httpusecaches="true" skipexisting="true"/> + <gunzip src="${tmp.dir}/${async-profiler.name}.tar.gz" dest="${tmp.dir}/"/> + <untar src="${tmp.dir}/${async-profiler.name}.tar" dest="${async-profiler.base}/"/> + <delete file="${tmp.dir}/${async-profiler.name}.tar"/> + </target> + + <target name="-fetch-async-profiler-mac"> + <get src="https://github.com/async-profiler/async-profiler/releases/download/v${async-profiler.version}/${async-profiler.name}.zip" + dest="${tmp.dir}/${async-profiler.name}.zip" retries="3" httpusecaches="true" skipexisting="true"/> + <unzip src="${tmp.dir}/${async-profiler.name}.zip" dest="${async-profiler.base}/"/> + </target> + +</project> diff --git a/databases/cassandra5/files/maven/.build/build-checkstyle.xml b/databases/cassandra5/files/maven/.build/build-checkstyle.xml new file mode 100644 index 000000000000..af5867e4aa9a --- /dev/null +++ b/databases/cassandra5/files/maven/.build/build-checkstyle.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + <project basedir="." name="apache-cassandra-checkstyle" + xmlns:rat="antlib:org.apache.rat.anttasks"> + + <target name="init-checkstyle" depends="resolver-retrieve-build,build-project" unless="no-checkstyle"> + <path id="checkstyle.lib.path"> + <fileset dir="${test.lib}/jars" includes="*.jar"/> + </path> + <!-- Sevntu custom checks are retrieved by Ivy into lib folder + and will be accessible to checkstyle--> + <taskdef resource="com/puppycrawl/tools/checkstyle/ant/checkstyle-ant-task.properties" + classpathref="checkstyle.lib.path"/> + </target> + + <target name="checkstyle" depends="init-checkstyle,build-project" description="Run custom checkstyle code analysis" unless="no-checkstyle"> + <property name="checkstyle.log.dir" value="${build.dir}/checkstyle" /> + <property name="checkstyle.report.file" value="${checkstyle.log.dir}/checkstyle_report.xml"/> + <mkdir dir="${checkstyle.log.dir}" /> + + <property name="checkstyle.properties" value="${build.helpers.dir}/checkstyle.xml" /> + <property name="checkstyle.suppressions" value="${build.helpers.dir}/checkstyle_suppressions.xml" /> + <checkstyle config="${checkstyle.properties}" + failureProperty="checkstyle.failure" + failOnViolation="true"> + <formatter type="plain"/> + <formatter type="xml" tofile="${checkstyle.report.file}"/> + <fileset dir="${build.src.java}" includes="**/*.java"/> + </checkstyle> + </target> + + <target name="checkstyle-test" depends="init-checkstyle,resolver-retrieve-build,build-project" description="Run custom checkstyle code analysis on tests" unless="no-checkstyle"> + <property name="checkstyle.log.dir" value="${build.dir}/checkstyle" /> + <property name="checkstyle_test.report.file" value="${checkstyle.log.dir}/checkstyle_report_test.xml"/> + <mkdir dir="${checkstyle.log.dir}" /> + + <property name="checkstyle_test.properties" value="${build.helpers.dir}/checkstyle_test.xml" /> + <property name="checkstyle.suppressions" value="${build.helpers.dir}/checkstyle_suppressions.xml" /> + <checkstyle config="${checkstyle_test.properties}" + failureProperty="checkstyle.failure" + failOnViolation="true"> + <formatter type="plain"/> + <formatter type="xml" tofile="${checkstyle_test.report.file}"/> + <fileset dir="${test.dir}" includes="**/*.java"/> + </checkstyle> + </target> + +</project> diff --git a/databases/cassandra5/files/maven/.build/build-cqlsh.xml b/databases/cassandra5/files/maven/.build/build-cqlsh.xml new file mode 100644 index 000000000000..45e0e46a494d --- /dev/null +++ b/databases/cassandra5/files/maven/.build/build-cqlsh.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<project basedir="." name="apache-cassandra-cqlsh-tasks" + xmlns:if="ant:if"> + <target name="set-cqlsh-version"> + <echo file="pylib/cqlshlib/serverversion.py" append="false">version = "${base.version}"${line.separator}</echo> + </target> +</project> diff --git a/databases/cassandra5/files/maven/.build/build-git.xml b/databases/cassandra5/files/maven/.build/build-git.xml new file mode 100644 index 000000000000..50db9be2bfe1 --- /dev/null +++ b/databases/cassandra5/files/maven/.build/build-git.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<project basedir="." name="apache-cassandra-git-tasks" + xmlns:if="ant:if"> + + <target name="_get-git-sha"> + <exec executable="git" osfamily="unix" dir="${basedir}" logError="false" failonerror="false" failifexecutionfails="false" resultproperty="git.is-available.exit-code"> + <arg value="rev-parse"/> + <arg value="--is-inside-work-tree"/> + <redirector outputproperty="git.is-available.output"/> + </exec> + <condition property="git.is-available" else="false"> + <equals arg1="${git.is-available.exit-code}" arg2="0"/> + </condition> + <echo message="git.is-available=${git.is-available}"/> + + <exec if:true="${git.is-available}" executable="git" osfamily="unix" dir="${basedir}" logError="true" failonerror="false" failifexecutionfails="false"> + <arg value="describe"/> + <arg value="--match=''"/> + <arg value="--always"/> + <arg value="--abbrev=0"/> + <arg value="--dirty"/> + <redirector outputproperty="git.sha"/> + </exec> + <property name="git.sha" value="Unknown"/> + <echo level="info">git.sha=${git.sha}</echo> + + <exec if:true="${git.is-available}" executable="git" osfamily="unix" dir="${basedir}" logError="true" failonerror="false" failifexecutionfails="false"> + <arg value="diff"/> + <arg value="--stat"/> + <redirector outputproperty="git.diffstat"/> + </exec> + <condition property="is-dirty"> + <contains string="${git.sha}" substring="-dirty"/> + </condition> + <echo level="warning" if:true="${is-dirty}">Repository state is dirty</echo> + <echo level="warning" if:true="${is-dirty}">${git.diffstat}</echo> + + <exec if:true="${git.is-available}" executable="bash" dir="${basedir}" logError="true" failonerror="false" failifexecutionfails="false"> + <arg value="-c"/> + <arg value="([[ -f .git ]] && (basename `cat .git | cut -f 2 -d ' '`)) || (basename `pwd`)"/> + <redirector outputproperty="git.worktree.name"/> + </exec> + <echo message="git.worktree.name=${git.worktree.name}"/> + + <exec if:true="${git.is-available}" executable="bash" dir="${basedir}" logError="true" failonerror="false" failifexecutionfails="false"> + <arg value="-c"/> + <arg value="git branch --show-current"/> + <redirector outputproperty="git.branch.name"/> + </exec> + <echo message="git.branch.name=${git.branch.name}"/> + + </target> +</project> diff --git a/databases/cassandra5/files/maven/.build/build-owasp.xml b/databases/cassandra5/files/maven/.build/build-owasp.xml new file mode 100644 index 000000000000..7ab160ffb986 --- /dev/null +++ b/databases/cassandra5/files/maven/.build/build-owasp.xml @@ -0,0 +1,118 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<project basedir="." name="apache-cassandra-owasp-tasks" + xmlns:unless="ant:unless" + xmlns:if="ant:if"> + <property name="dependency-check.version" value="12.1.6"/> + <property name="dependency-check.home" value="${tmp.dir}/dependency-check-ant-${dependency-check.version}"/> + <property name="dependency-check.archive.dir" value="${local.repository}/org/owasp/dependency-check-ant/${dependency-check.version}"/> + <property name="dependency-check.archive.name" value="dependency-check-ant-${dependency-check.version}-release.zip"/> + <property name="dependency-check.report.dir" value="${build.dir}/owasp"/> + + <condition property="dependency-check-ant.archive.present"> + <available file="${dependency-check.archive.dir}/${dependency-check.archive.name}" type="file" /> + </condition> + + <target name="-dependency-check-download" + description="Fetch OWASP Dependency checker" + unless="dependency-check-ant.archive.present"> + + <mkdir dir="${dependency-check.archive.dir}"/> + <get src="https://github.com/dependency-check/DependencyCheck/releases/download/v${dependency-check.version}/${dependency-check.archive.name}" + dest="${dependency-check.archive.dir}/${dependency-check.archive.name}" retries="3"/> + </target> + + <target name="-dependency-check-init" depends="-dependency-check-download"> + <delete dir="${dependency-check.home}" includeemptydirs="true" failonerror="false"/> + <mkdir dir="${dependency-check.home}"/> + <unzip src="${dependency-check.archive.dir}/${dependency-check.archive.name}" dest="${dependency-check.home}"/> + </target> + + <target name="-run-owasp-scan" description="Dependency-Check Analysis" + depends="-dependency-check-init,resolver-dist-lib"> + <property name="nvd.api.key" value="dummy" if:set="env.NVD_DATAFEED_URL" /> + <fail unless:set="nvd.api.key"> + Please set the nvd.api.key property to your NVD API key. It is recommended to put that property into your + ~/.ant/build.properties file. You can get your API key from https://nvd.nist.gov/developers/request-an-api-key + </fail> + + <echo unless:set="nvd.data.dir"> + Since the NVD database is pretty large, you should consider storing it in some persistent location to reuse + it between builds. You can do that by setting the nvd.data.dir property to a directory of your choice, + such as ~/.cache/ant/owasp/database for Linux or ~/Library/Caches/Ant/owasp/database for MacOS. + Putting that property into your ~/.ant/build.properties file is recommended. + </echo> + + <property name="nvd.data.dir" value="${tmp.dir}/owasp/database"/> + <property name="nvd.validity.hours" value="4"/> + + <path id="dependency-check.path"> + <fileset dir="${dependency-check.home}/dependency-check-ant/lib"> + <include name="*.jar"/> + </fileset> + </path> + + <taskdef resource="dependency-check-taskdefs.properties"> + <classpath refid="dependency-check.path" /> + </taskdef> + + <!-- + default value for nvdValidForHours is 4 after which sync is done again + + failBuildOnCVSS is by default 11 so build would never fail, + the table categorising vulnerabilities is here (1), so by setting + "failBuildOnCVSS" to 1, we will fail the build on any CVE found + if it is not suppressed already owasp/dependency-check-suppressions.xml + + If a vendor provides no details about a vulnerability, + NVD will score that vulnerability as 10.0 (the highest rating translating to critical). + + (1) https://nvd.nist.gov/vuln-metrics/cvss + --> + <condition property="nvdDatafeedUrl" value="${env.NVD_DATAFEED_URL}" else=""> + <isset property="env.NVD_DATAFEED_URL" /> + </condition> + <dependency-check projectname="Apache Cassandra" + nvdApiKey="${nvd.api.key}" + reportoutputdirectory="${dependency-check.report.dir}" + reportformat="ALL" + prettyPrint="true" + nvdValidForHours="${nvd.validity.hours}" + centralAnalyzerUseCache="true" + nodeAuditAnalyzerUseCache="true" + failBuildOnCVSS="1" + assemblyAnalyzerEnabled="false" + dataDirectory="${nvd.data.dir}" + suppressionFile="${build.helpers.dir}/owasp/dependency-check-suppressions.xml" + nvdDatafeedUrl="${nvdDatafeedUrl}"> + <fileset refid="dependencies_to_check"/> + </dependency-check> + </target> + + <target name="dependency-check" depends="resolver-dist-lib,generate-snyk-file"> + <fileset dir="lib" id="dependencies_to_check"> + <include name="**/*.jar"/> + </fileset> + <antcall target="-run-owasp-scan" inheritrefs="true" inheritall="true"/> + </target> + + <target name="generate-snyk-file" unless="ant.gen-snyk.skip"> + <exec executable="python3" failonerror="true"><arg value="${basedir}/.build/generate-snyk-file"/></exec> + </target> +</project> diff --git a/databases/cassandra5/files/maven/.build/build-rat.xml b/databases/cassandra5/files/maven/.build/build-rat.xml new file mode 100644 index 000000000000..7219e0cf8aa6 --- /dev/null +++ b/databases/cassandra5/files/maven/.build/build-rat.xml @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<project basedir="." name="apache-cassandra-rat-tasks" + xmlns:rat="antlib:org.apache.rat.anttasks"> + + <!-- + License audit tool + --> + + <target name="_rat_init" depends="resolver-init"> + <typedef uri="antlib:org.apache.rat.anttasks" classpathref="rat.classpath"/> + </target> + + <target name="_build_ratinclude" depends="_rat_init"> + <exec executable="git" failifexecutionfails="false" failonerror="false" resultproperty="git.success" output="${build.dir}/.ratinclude"> + <arg line="ls-tree -r HEAD --name-only"/> + </exec> + <condition property="rat.skip" value="true"> + <not> + <equals arg1="${git.success}" arg2="0"/> + </not> + </condition> + </target> + + <target name="rat-check" depends="_build_ratinclude" unless="rat.skip" description="License checks on source" > + <rat:report reportFile="${build.dir}/rat.txt"> + <fileset dir="." includesfile="${build.dir}/.ratinclude"> + <!-- Config files with not much creativity --> + <exclude name=".asf.yaml"/> + <exclude name=".snyk"/> + <exclude name="**/cassandra*.yaml"/> + <exclude NAME="doc/antora.yml"/> + <exclude name="ide/**/*"/> + <exclude name="**/*.json"/> + <exclude name="pylib/cqlshlib/test/config/sslhandling*.config"/> + <exclude NAME="src/resources/org/apache/cassandra/cql3/reserved_keywords.txt"/> + <exclude NAME="src/resources/org/apache/cassandra/index/sasi/analyzer/filter/*.txt"/> + <exclude name="test/conf/cdc.yaml"/> + <exclude name="test/conf/commitlog*.yaml"/> + <exclude name="test/conf/system_keyspaces_directory.yaml"/> + <exclude name="test/conf/sstableloader_with_encryption.yaml"/> + <exclude name="test/conf/unit-test-conf/test-native-port.yaml"/> + <exclude name="test/resources/data/config/YamlConfigurationLoaderTest/*.yaml"/> + <exclude name="tools/cqlstress-*.yaml"/> + <!-- test data --> + <exclude name="pylib/cqlshlib/test/test_authproviderhandling_config/*"/> + <exclude name="test/**/cassandra*.conf"/> + <exclude name="test/**/*.csv"/> + <exclude name="test/**/*.txt"/> + <exclude name="test/data/**/*.adler32"/> + <exclude name="test/data/**/*.crc32"/> + <exclude name="test/data/**/CommitLog-*.log"/> + <exclude name="test/data/**/*.bin"/> + <exclude name="test/data/**/*.db"/> + <exclude name="test/data/**/*.sha1"/> + <exclude name="test/data/CASSANDRA-15313/lz4-jvm-crash-failure.txt"/> + <exclude name="test/data/jmxdump/cassandra-*-jmx.yaml"/> + <!-- Documentation files --> + <exclude name=".github/pull_request_template.md"/> + <exclude name=".github/workflows/code-check.yaml"/> + <exclude NAME="doc/modules/**/*"/> + <exclude NAME="src/java/**/*.md"/> + <exclude NAME="**/README*"/> + <exclude NAME="CHANGES.txt"/> + <exclude NAME="CASSANDRA-14092.txt"/> + <exclude NAME="debian/TODO"/> + <!-- legal files --> + <exclude NAME="NOTICE.txt"/> + <exclude NAME="LICENSE.txt"/> + <!-- misc --> + <exclude NAME="**/*.patch"/> + <exclude NAME="**/*.diff"/> + <exclude NAME="debian/cassandra.bash-completion"/> + <exclude NAME="debian/cassandra-sysctl.conf"/> + <exclude NAME="debian/cassandra.install"/> + <exclude NAME="debian/cassandra-tools.install"/> + <exclude NAME="debian/compat"/> + <exclude NAME="debian/control"/> + <exclude NAME="debian/dirs"/> + <exclude NAME="debian/patches/series"/> + </fileset> + </rat:report> + <exec executable="grep" outputproperty="rat.failed.files" failifexecutionfails="false"> + <arg line="-A5 'Unapproved licenses' ${build.dir}/rat.txt"/> + </exec> + <fail message="Some files have missing or incorrect license information. Check RAT report in ${build.dir}/rat.txt for more details! \n ${rat.failed.files}"> + <condition> + <and> + <not> + <resourcecontains resource="${build.dir}/rat.txt" substring="0 Unknown Licenses" casesensitive="false" /> + </not> + </and> + </condition> + </fail> + </target> +</project> diff --git a/databases/cassandra5/files/maven/.build/build-resolver.xml b/databases/cassandra5/files/maven/.build/build-resolver.xml new file mode 100644 index 000000000000..09263d42aa6e --- /dev/null +++ b/databases/cassandra5/files/maven/.build/build-resolver.xml @@ -0,0 +1,314 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<project basedir="." name="apache-cassandra-resolver-tasks" + xmlns:resolver="antlib:org.apache.maven.resolver.ant" + xmlns:if="ant:if" + xmlns:unless="ant:unless"> + + <!-- details of what version of Resolver ANT Tasks to fetch --> + <property name="resolver-ant-tasks.version" value="1.3.0" /> + <property name="resolver-ant-tasks.local" value="${local.repository}/org/apache/maven/resolver/maven-resolver-ant-tasks/${resolver-ant-tasks.version}/maven-resolver-ant-tasks-${resolver-ant-tasks.version}.jar"/> + <property name="resolver-ant-tasks.url" value="https://repo1.maven.org/maven2/org/apache/maven/resolver/maven-resolver-ant-tasks" /> + <condition property="resolver-ant-tasks.jar.exists"> + <available file="${resolver-ant-tasks.local}" /> + </condition> + + <property name="artifact.python.pypi" value="https://files.pythonhosted.org/packages" /> + <property name="artifact.github.release" value="https://github.com" /> + + <!-- some artifacts are fetched from github as blobs; these are all in the cassandra project, but in an older commit --> + <property name="lib.download.sha" value="1371883db3d8bf7d7c54e0baaca89c6c2d2a5abe"/> + <property name="lib.download.base.url" value="https://raw.githubusercontent.com/apache/cassandra/${lib.download.sha}" /> + <property name="lib.download.url.postfix" value="" /> + + <path id="resolver-ant-tasks.classpath" path="${resolver-ant-tasks.local}" /> + + <!-- + Fetch Resolver Ant Tasks and Cassandra's dependencies. + --> + + <target name="_resolver_download" unless="resolver-ant-tasks.jar.exists" description="Fetch Resolver ANT Tasks from Maven Central Repository"> + <echo>Downloading Resolver ANT Tasks...</echo> + <mkdir dir="${local.repository}/org/apache/maven/resolver/maven-resolver-ant-tasks/${resolver-ant-tasks.version}" /> + + <retry retrycount="3" retrydelay="10" > + <get src="${resolver-ant-tasks.url}/${resolver-ant-tasks.version}/maven-resolver-ant-tasks-${resolver-ant-tasks.version}-uber.jar" + dest="${resolver-ant-tasks.local}" usetimestamp="true" quiet="true"/> + </retry> + </target> + + <target name="resolver-init" depends="init,_resolver_download" unless="resolver-ant-tasks.initialized" description="Initialize Resolver ANT Tasks"> + + <typedef uri="antlib:org.apache.maven.resolver.ant" resource="org/apache/maven/resolver/ant/antlib.xml" classpathref="resolver-ant-tasks.classpath" /> + <resolver:remoterepos id="all"> + <remoterepo id="resolver-central" url="${artifact.remoteRepository.central}"/> + <remoterepo id="resolver-apache" url="${artifact.remoteRepository.apache}"/> + <!-- Snapshot artifacts must not exist in nor be downloaded by any Cassandra release artifact. + Please validate that all artifacts included in parent-pom-template.xml are release + artifacts before committing. *** 6391 LINES SKIPPED ***home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69f0a5f1.2569b.131eaf7b>
