git: 9bf4ac146671 - main - net/lavinmq: new port AMQP-compliant message broker

From: Dave Cottlehuber <dch_at_FreeBSD.org>
Date: Wed, 11 Jan 2023 22:11:34 UTC
The branch main has been updated by dch:

URL: https://cgit.FreeBSD.org/ports/commit/?id=9bf4ac14667186f43abbe71ced1ed8e3df6c87c6

commit 9bf4ac14667186f43abbe71ced1ed8e3df6c87c6
Author:     Dave Cottlehuber <dch@FreeBSD.org>
AuthorDate: 2023-01-11 22:01:21 +0000
Commit:     Dave Cottlehuber <dch@FreeBSD.org>
CommitDate: 2023-01-11 22:09:36 +0000

    net/lavinmq: new port AMQP-compliant message broker
    
    High performance AMQP-0.9.1 compatible, written in Crystal.
    
    Differential Revision: https://reviews.freebsd.org/D31410
---
 GIDs                                       |  2 +-
 UIDs                                       |  2 +-
 net/Makefile                               |  1 +
 net/lavinmq/Makefile                       | 88 ++++++++++++++++++++++++++++
 net/lavinmq/distinfo                       | 17 ++++++
 net/lavinmq/files/lavinmq.in               | 94 ++++++++++++++++++++++++++++++
 net/lavinmq/files/patch-src_lavinmqperf.cr | 11 ++++
 net/lavinmq/pkg-descr                      | 16 +++++
 net/lavinmq/pkg-plist                      | 10 ++++
 9 files changed, 239 insertions(+), 2 deletions(-)

diff --git a/GIDs b/GIDs
index 4b9e29f03df0..08e2ed3767a4 100644
--- a/GIDs
+++ b/GIDs
@@ -255,7 +255,7 @@ _arti:*:311:
 _sphinx:*:312:
 _fastdfs:*:313:
 promscale:*:314:
-# free: 315
+lavinmq:*:315:
 # free: 316
 # free: 317
 # free: 318
diff --git a/UIDs b/UIDs
index 411248604fa9..7a7aee1f9492 100644
--- a/UIDs
+++ b/UIDs
@@ -260,7 +260,7 @@ _arti:*:311:311::0:0:Arti Daemon:/nonexistent:/usr/sbin/nologin
 _sphinx:*:312:312::0:0:Sphinxsearch Owner:/nonexistent:/usr/sbin/nologin
 _fastdfs:*:313:313::0:0:FastDFS Owner:/nonexistent:/usr/sbin/nologin
 promscale:*:314:314::0:0:Promscale:/nonexistent:/usr/sbin/nologin
-# free: 315
+lavinmq:*:315:315::0:0:LavinMQ user:/nonexistent:/usr/sbin/nologin
 # free: 316
 # free: 317
 # free: 318
diff --git a/net/Makefile b/net/Makefile
index 392ac26afc8b..bacf08db86c3 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -346,6 +346,7 @@
     SUBDIR += lambdamoo
     SUBDIR += landrop
     SUBDIR += latd
+    SUBDIR += lavinmq
     SUBDIR += ldap-stats
     SUBDIR += ldapbrowser
     SUBDIR += ldapdiff
diff --git a/net/lavinmq/Makefile b/net/lavinmq/Makefile
new file mode 100644
index 000000000000..5c1a67ad9e35
--- /dev/null
+++ b/net/lavinmq/Makefile
@@ -0,0 +1,88 @@
+PORTNAME=	lavinmq
+DISTVERSIONPREFIX=	v
+DISTVERSION=	1.0.0-beta.8
+CATEGORIES=	net
+
+PATCH_SITES=	https://github.com/${GH_ACCOUNT}/${GH_PROJECT}/commit/
+# PATCHFILES+=	3a73c414b749.patch:-p1 # https://github.com/cloudamqp/lavinmq/pull/273
+
+MAINTAINER=	dch@FreeBSD.org
+COMMENT=	Next-generation AMQP 0.9.1 based message broker
+
+LICENSE=	APACHE20
+
+BUILD_DEPENDS=	crystal:lang/crystal \
+		help2man:misc/help2man \
+		shards:devel/shards
+
+USES=		pkgconfig ssl:build
+USE_GITHUB=	yes
+GH_ACCOUNT=	cloudamqp
+GH_TUPLE=	\
+		84codes:http-protection:893a191d55e301e0df96d6dd0f7d72c527bddeb8:a/deps/http-protection \
+		84codes:systemd.cr:v2.0.0:systemd/deps/systemd.cr \
+		cloudamqp:amq-protocol.cr:v1.1.2:proto/deps/amq-protocol.cr \
+		cloudamqp:amqp-client.cr:v1.0.9:client/deps/amqp-client.cr \
+		luislavena:radix:v0.4.1:radix/deps/radix \
+		schovi:baked_file_system:v0.10.0:baked/deps/baked_file_system \
+		tbrand:router.cr:v0.2.8:router/deps/router.cr
+
+USE_RC_SUBR=	lavinmq
+
+USERS=		lavinmq
+GROUPS=		lavinmq
+
+PORTDOCS=	CHANGELOG.md NOTICE README.md SECURITY.md
+
+OPTIONS_DEFINE=	DOCS
+
+SHARDS_ENV=	--time --verbose --production --release --no-color --stats --static
+
+post-extract:
+	# force shards to use local paths, not git repos, for dependencies
+	@${RM} ${WRKSRC}/shard.lock
+	@${REINPLACE_CMD} -E \
+		-e 's,github: .*/,path: deps/,' \
+		-e '/branch:/d' \
+		-e '/version: .>1/d' \
+		${WRKSRC}/shard.yml ${WRKSRC}/deps/*/shard.yml
+	# switch config example into hier(5) compliance
+	@${REINPLACE_CMD} -E \
+		-e 's,/etc/,${PREFIX}/etc/,' \
+		-e 's,/lib/,/db/,' \
+		-e 's,/tmp/lavinmq-http.sock,/var/run/lavinmq/http.sock,' \
+		-e 's,/tmp/lavinmq.sock,/var/run/lavinmq/amqp.sock,' \
+		${WRKSRC}/extras/config.ini
+
+do-build:
+	${MKDIR} ${WRKDIR}/man1
+	(cd ${WRKSRC} && ${LOCALBASE}/bin/shards lock ${SHARDS_ENV} \
+		&& ${LOCALBASE}/bin/shards build ${SHARDS_ENV})
+	help2man -Nn "fast and advanced message queue server" \
+		${WRKSRC}/bin/lavinmq     -o ${WRKDIR}/man1/lavinmq.1
+	help2man -Nn "control utility for lavinmq server" \
+		${WRKSRC}/bin/lavinmqctl  -o ${WRKDIR}/man1/lavinmqctl.1
+	help2man -Nn "performance testing tool for amqp servers" \
+		${WRKSRC}/bin/lavinmqperf -o ${WRKDIR}/man1/lavinmqperf.1
+
+do-install:
+	${MKDIR} ${STAGEDIR}${ETCDIR} \
+		${STAGEDIR}/var/db/lavinmq \
+		${STAGEDIR}/var/log/lavinmq \
+		${STAGEDIR}${MAN1PREFIX}/man/man1
+	${INSTALL_DATA} ${WRKSRC}/extras/config.ini \
+		${STAGEDIR}${ETCDIR}/config.ini.sample
+.for f in lavinmq lavinmqctl lavinmqperf
+	${INSTALL_PROGRAM} ${WRKSRC}/bin/${f} \
+		${STAGEDIR}${PREFIX}/bin
+	${INSTALL_MAN} ${WRKDIR}/man1/${f}.1 ${STAGEDIR}${MAN1PREFIX}/man/man1/
+.endfor
+
+do-install-DOCS-on:
+	${MKDIR} ${STAGEDIR}${DOCSDIR}
+.for f in ${PORTDOCS}
+	${INSTALL_DATA} ${WRKSRC}/${f} \
+		${STAGEDIR}${DOCSDIR}
+.endfor
+
+.include <bsd.port.mk>
diff --git a/net/lavinmq/distinfo b/net/lavinmq/distinfo
new file mode 100644
index 000000000000..8ffa20a7e6a0
--- /dev/null
+++ b/net/lavinmq/distinfo
@@ -0,0 +1,17 @@
+TIMESTAMP = 1672656176
+SHA256 (cloudamqp-lavinmq-v1.0.0-beta.8_GH0.tar.gz) = e0c7a90bc0b240f2dcf118a9c922c4b0ee604f19dfb2ed0b7137cb73af8abe3b
+SIZE (cloudamqp-lavinmq-v1.0.0-beta.8_GH0.tar.gz) = 707858
+SHA256 (84codes-http-protection-893a191d55e301e0df96d6dd0f7d72c527bddeb8_GH0.tar.gz) = eba9fed6dff8ed2b1322ca57b5bdd1e6d4afe49367ca84f38cd0cd7c062dab93
+SIZE (84codes-http-protection-893a191d55e301e0df96d6dd0f7d72c527bddeb8_GH0.tar.gz) = 10307
+SHA256 (84codes-systemd.cr-v2.0.0_GH0.tar.gz) = 4dd0c6f838542f97338866aef36de7b464c06112c4434e4db48aa65586b68ef3
+SIZE (84codes-systemd.cr-v2.0.0_GH0.tar.gz) = 4339
+SHA256 (cloudamqp-amq-protocol.cr-v1.1.2_GH0.tar.gz) = 23c1f3bd2c611a4249fc4a5438db2d68d647dfef900138675aabdc0e4a122ca5
+SIZE (cloudamqp-amq-protocol.cr-v1.1.2_GH0.tar.gz) = 15611
+SHA256 (cloudamqp-amqp-client.cr-v1.0.9_GH0.tar.gz) = 9c7cbcd390b353ac9e138d669ec251236341c0f8ccf18b190f37b46f16a5c0d8
+SIZE (cloudamqp-amqp-client.cr-v1.0.9_GH0.tar.gz) = 19647
+SHA256 (luislavena-radix-v0.4.1_GH0.tar.gz) = 5f207eb769101d94726eb476eb5f9b4603482c7941396ab4c85866722b7497b1
+SIZE (luislavena-radix-v0.4.1_GH0.tar.gz) = 13847
+SHA256 (schovi-baked_file_system-v0.10.0_GH0.tar.gz) = ea63c25b5327817bb494edb3e74950a42a4a50efc25e8035292f15f1e3039a50
+SIZE (schovi-baked_file_system-v0.10.0_GH0.tar.gz) = 56007
+SHA256 (tbrand-router.cr-v0.2.8_GH0.tar.gz) = a64540dbd57bc2feba50a432b37d3647f4ab72ee16058746623f3f024b5f3f25
+SIZE (tbrand-router.cr-v0.2.8_GH0.tar.gz) = 5132
diff --git a/net/lavinmq/files/lavinmq.in b/net/lavinmq/files/lavinmq.in
new file mode 100644
index 000000000000..352f00d8e1be
--- /dev/null
+++ b/net/lavinmq/files/lavinmq.in
@@ -0,0 +1,94 @@
+#!/bin/sh
+
+# PROVIDE: lavinmq
+# REQUIRE: DAEMON
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
+# to enable this service:
+#
+# lavinmq_enable (bool):	Set it to YES to enable lavinmq.
+#			Default is "NO".
+# lavinmq_user (user):	Set user to run lavinmq.
+#			Default is "lavinmq".
+# lavinmq_group (group):	Set group to run lavinmq.
+#			Default is "lavinmq".
+# lavinmq_config (file):	Set lavinmq config file.
+#			Default is "%%ETCDIR%%/lavinmq.conf".
+# lavinmq_syslog_output_enable (bool):	Set to enable syslog output.
+#					Default is "NO". See daemon(8).
+# lavinmq_syslog_output_priority (str):	Set syslog priority if syslog enabled.
+#					Default is "info". See daemon(8).
+# lavinmq_syslog_output_facility (str):	Set syslog facility if syslog enabled.
+#					Default is "daemon". See daemon(8).
+
+. /etc/rc.subr
+
+name=lavinmq
+rcvar=lavinmq_enable
+
+load_rc_config $name
+
+: ${lavinmq_enable:="NO"}
+: ${lavinmq_dir:="/var/db/lavinmq"}
+: ${lavinmq_run:="/var/run/lavinmq"}
+: ${lavinmq_user:="lavinmq"}
+: ${lavinmq_group:="lavinmq"}
+: ${lavinmq_config:="%%ETCDIR%%/config.ini"}
+
+DAEMON=$(/usr/sbin/daemon 2>&1 | grep -q syslog ; echo $?)
+if [ ${DAEMON} -eq 0 ]; then
+        : ${lavinmq_syslog_output_enable:="NO"}
+        : ${lavinmq_syslog_output_priority:="info"}
+        : ${lavinmq_syslog_output_facility:="daemon"}
+        if checkyesno lavinmq_syslog_output_enable; then
+                lavinmq_syslog_output_flags="-T ${name}"
+
+                if [ -n "${lavinmq_syslog_output_priority}" ]; then
+                        lavinmq_syslog_output_flags="${lavinmq_syslog_output_flags} -s ${lavinmq_syslog_output_priority}"
+                fi
+
+                if [ -n "${lavinmq_syslog_output_facility}" ]; then
+                        lavinmq_syslog_output_flags="${lavinmq_syslog_output_flags} -l ${lavinmq_syslog_output_facility}"
+                fi
+        fi
+else
+        lavinmq_syslog_output_enable="NO"
+        lavinmq_syslog_output_flags=""
+fi
+
+pidfile=/var/run/lavinmq/daemon.pid
+procname="%%PREFIX%%/bin/lavinmq"
+command="/usr/sbin/daemon"
+command_args="-f -t ${name} ${lavinmq_syslog_output_flags} -p ${pidfile} /usr/bin/env ${lavinmq_env} ${procname} --config=${lavinmq_config}"
+
+extra_commands="reload monitor"
+monitor_cmd=lavinmq_monitor
+start_precmd=lavinmq_startprecmd
+required_files="$lavinmq_config"
+
+lavinmq_monitor()
+{
+	sig_reload=USR1
+	run_rc_command "reload"
+}
+
+lavinmq_startprecmd()
+{
+        if [ ! -d ${lavinmq_run} ]; then
+                install -d -o ${lavinmq_user} -g ${lavinmq_group} ${lavinmq_run}
+        fi
+
+        if [ ! -d ${lavinmq_dir} ]; then
+                install -d -o ${lavinmq_user} -g ${lavinmq_group} ${lavinmq_dir}
+        fi
+
+        if [ ! -e ${pidfile} ]; then
+                install -o ${lavinmq_user} -g ${lavinmq_group} /dev/null ${pidfile};
+        fi
+
+        # remove stray sockets that can block startup
+        rm -rf ${lavinmq_run}/*.sock /tmp/lavinmq
+}
+
+run_rc_command "$1"
diff --git a/net/lavinmq/files/patch-src_lavinmqperf.cr b/net/lavinmq/files/patch-src_lavinmqperf.cr
new file mode 100644
index 000000000000..6ee6f520610e
--- /dev/null
+++ b/net/lavinmq/files/patch-src_lavinmqperf.cr
@@ -0,0 +1,11 @@
+--- src/lavinmqperf.cr.orig	2023-01-02 14:26:00 UTC
++++ src/lavinmqperf.cr
+@@ -482,7 +482,7 @@ class ConnectionCount < Perf
+ 
+   private def client : AMQP::Client
+     client = @client ||= AMQP::Client.new(@uri)
+-    client.host = "127.0.#{Random.rand(UInt8)}.#{Random.rand(UInt8)}" if @random_localhost
++    # client.host = "127.0.#{Random.rand(UInt8)}.#{Random.rand(UInt8)}" if @random_localhost
+     client
+   end
+ 
diff --git a/net/lavinmq/pkg-descr b/net/lavinmq/pkg-descr
new file mode 100644
index 000000000000..1f89ac1f604f
--- /dev/null
+++ b/net/lavinmq/pkg-descr
@@ -0,0 +1,16 @@
+LavinMQ is a message queue server, also called a message broker, compatible
+with the AMQP0.9 spec, where messages are published by a sending service called
+a producer, via the broker, to then be consumed by the receiving service called
+a consumer. When not handling messages, the queue can route, buffer, and
+persist the messages according to rules set up by the user.
+
+Messages can be sent across languages, platforms, and OS, which decouple
+processes and creates a highly scalable system. lavinmq, as queue management
+software, gives an organized, safe place for messages to wait until another
+application or part of the system can come along and consume them for
+processing.
+
+lavinmq is written in Crystal, a statically compiled LLVM-based
+language with a ruby-like syntax.
+
+WWW: https://www.lavinmq.com/
diff --git a/net/lavinmq/pkg-plist b/net/lavinmq/pkg-plist
new file mode 100644
index 000000000000..79d59f50cd3b
--- /dev/null
+++ b/net/lavinmq/pkg-plist
@@ -0,0 +1,10 @@
+@dir(lavinmq,lavinmq,750) %%ETCDIR%%
+@dir(lavinmq,lavinmq,750) /var/db/lavinmq
+@dir(lavinmq,lavinmq,750) /var/log/lavinmq
+@sample %%ETCDIR%%/config.ini.sample
+bin/lavinmq
+bin/lavinmqctl
+bin/lavinmqperf
+man/man1/lavinmq.1.gz
+man/man1/lavinmqctl.1.gz
+man/man1/lavinmqperf.1.gz