aboutsummaryrefslogtreecommitdiff
path: root/sysutils/beats93
diff options
context:
space:
mode:
Diffstat (limited to 'sysutils/beats93')
-rw-r--r--sysutils/beats93/Makefile144
-rw-r--r--sysutils/beats93/distinfo15
-rw-r--r--sysutils/beats93/files/auditbeat.in50
-rw-r--r--sysutils/beats93/files/filebeat.in43
-rw-r--r--sysutils/beats93/files/heartbeat.in43
-rw-r--r--sysutils/beats93/files/metricbeat.in51
-rw-r--r--sysutils/beats93/files/packetbeat.in43
-rw-r--r--sysutils/beats93/files/patch-auditbeat_auditbeat.reference.yml20
-rw-r--r--sysutils/beats93/files/patch-auditbeat_auditbeat.yml13
-rw-r--r--sysutils/beats93/files/patch-dev-tools_mage_settings.go20
-rw-r--r--sysutils/beats93/files/patch-filebeat_filebeat.reference.yml26
-rw-r--r--sysutils/beats93/files/patch-filebeat_filebeat.yml33
-rw-r--r--sysutils/beats93/files/patch-go-sysinfo1314
-rw-r--r--sysutils/beats93/files/patch-heartbeat_heartbeat.yml11
-rw-r--r--sysutils/beats93/files/patch-libbeat_autodiscover_providers_docker_config.go11
-rw-r--r--sysutils/beats93/files/patch-libbeat_autodiscover_providers_docker_docker.go20
-rw-r--r--sysutils/beats93/files/patch-libbeat_autodiscover_providers_kubernetes_config.go11
-rw-r--r--sysutils/beats93/files/patch-libbeat_autodiscover_providers_kubernetes_kubernetes.go11
-rw-r--r--sysutils/beats93/files/patch-libbeat_scripts_Makefile26
-rw-r--r--sysutils/beats93/files/patch-metricbeat_metricbeat.reference.yml20
-rw-r--r--sysutils/beats93/files/patch-metricbeat_metricbeat.yml33
-rw-r--r--sysutils/beats93/files/patch-packetbeat_packetbeat.reference.yml11
-rw-r--r--sysutils/beats93/files/patch-packetbeat_packetbeat.yml23
-rw-r--r--sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-autodiscover_docker_client.go13
-rw-r--r--sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-autodiscover_docker_watcher.go13
-rw-r--r--sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__freebsd.go10
-rw-r--r--sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__procfs__common.go20
-rw-r--r--sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_system_filesystem_filesystem__unix.go14
-rw-r--r--sysutils/beats93/files/patch-vendor_modules.txt10
-rw-r--r--sysutils/beats93/files/pkg-message.in10
-rw-r--r--sysutils/beats93/pkg-descr18
-rw-r--r--sysutils/beats93/pkg-plist21
32 files changed, 2121 insertions, 0 deletions
diff --git a/sysutils/beats93/Makefile b/sysutils/beats93/Makefile
new file mode 100644
index 000000000000..74ce84b7b87b
--- /dev/null
+++ b/sysutils/beats93/Makefile
@@ -0,0 +1,144 @@
+PORTNAME= beats
+DISTVERSIONPREFIX= v
+DISTVERSION= 9.3.4
+PORTREVISION= 2
+CATEGORIES= sysutils
+MASTER_SITES= https://raw.githubusercontent.com/${GH_ACCOUNT}/${GH_PROJECT}/${DISTVERSIONFULL}/:gomod
+PKGNAMESUFFIX= ${DISTVERSION:R:S|.||}
+DISTFILES= go.mod:gomod
+
+MAINTAINER= elastic@FreeBSD.org
+COMMENT= Send logs, network, metrics and heartbeat to Elasticsearch or Logstash (${DISTVERSION:R}.x version)
+WWW= https://www.elastic.co/products/beats/
+
+LICENSE= APACHE20
+
+USES= go:modules
+USE_GITHUB= yes
+
+GH_ACCOUNT= elastic
+
+USE_RC_SUBR= ${GO_TARGET:S,./,,g}
+
+GO_MODULE= github.com/elastic/beats/v7
+CGO_CFLAGS= -I.
+CGO_LDFLAGS= -L.
+MAKE_ENV= GOBUILD_FLAGS="-mod=vendor"
+
+CONFLICTS= ${PORTNAME}*
+
+PORTSCOUT= limit:^${DISTVERSION:R:S|.|\.|}\.
+
+SUB_FILES= pkg-message
+
+OPTIONS_DEFINE= AUDITBEAT FILEBEAT HEARTBEAT METRICBEAT PACKETBEAT
+.ifmake makesum || makeplist || distclean
+OPTIONS_DEFAULT= ${OPTIONS_DEFINE}
+.else
+OPTIONS_DEFAULT= FILEBEAT HEARTBEAT METRICBEAT
+.endif
+OPTIONS_SUB= yes
+
+AUDITBEAT_DESC= Auditbeat
+FILEBEAT_DESC= Filebeat
+HEARTBEAT_DESC= Heartbeat
+METRICBEAT_DESC= Metricbeat
+PACKETBEAT_DESC= Packetbeat
+AUDITBEAT_MASTER_SITES= https://artifacts.elastic.co/downloads/beats/auditbeat/:auditbeat \
+ ${LOCAL_MASTER_SITES:S|$|:auditbeat|}
+AUDITBEAT_DISTFILES= auditbeat-${DISTVERSION}-darwin-x86_64.tar.gz:auditbeat
+AUDITBEAT_VARS= GO_TARGET+=./auditbeat
+FILEBEAT_MASTER_SITES= https://artifacts.elastic.co/downloads/beats/filebeat/:filebeat \
+ ${LOCAL_MASTER_SITES:S|$|:filebeat|}
+FILEBEAT_DISTFILES= filebeat-${DISTVERSION}-darwin-x86_64.tar.gz:filebeat
+FILEBEAT_VARS= GO_TARGET+=./filebeat
+HEARTBEAT_MASTER_SITES= https://artifacts.elastic.co/downloads/beats/heartbeat/:heartbeat \
+ ${LOCAL_MASTER_SITES:S|$|:heartbeat|}
+HEARTBEAT_DISTFILES= heartbeat-${DISTVERSION}-darwin-x86_64.tar.gz:heartbeat
+HEARTBEAT_VARS= GO_TARGET+=./heartbeat
+METRICBEAT_MASTER_SITES= https://artifacts.elastic.co/downloads/beats/metricbeat/:metricbeat \
+ ${LOCAL_MASTER_SITES:S|$|:metricbeat|}
+METRICBEAT_DISTFILES= metricbeat-${DISTVERSION}-darwin-x86_64.tar.gz:metricbeat
+METRICBEAT_VARS= GO_TARGET+=./metricbeat
+PACKETBEAT_MASTER_SITES= https://artifacts.elastic.co/downloads/beats/packetbeat/:packetbeat \
+ ${LOCAL_MASTER_SITES:S|$|:packetbeat|}
+PACKETBEAT_DISTFILES= packetbeat-${DISTVERSION}-darwin-x86_64.tar.gz:packetbeat
+PACKETBEAT_VARS= CGO_CFLAGS+=-I/usr/include \
+ CGO_LDFLAGS+=-L/usr/lib \
+ GO_TARGET+=./packetbeat
+
+LOCAL_MASTER_SITES= LOCAL/vvd/elastic
+
+.include <bsd.port.options.mk>
+
+post-patch:
+ ${REINPLACE_CMD} -e "s|%%BEATSVERSION%%|v${DISTVERSION}|g" ${WRKSRC}/dev-tools/mage/settings.go
+.for BEATMOD in ${GO_TARGET:S,^./,,g}
+ ${REINPLACE_CMD} -e "s|%%DATADIR%%|${DATADIR}|g" ${WRKSRC}/${BEATMOD}/*.yml
+.endfor
+
+do-install:
+ ${MKDIR} ${STAGEDIR}${ETCDIR}
+.for BEATMOD in ${GO_TARGET:S,^./,,g}
+ (${MKDIR} ${STAGEDIR}/var/db/beats/${BEATMOD} && \
+ ${INSTALL_PROGRAM} ${WRKDIR}/bin/${BEATMOD} \
+ ${STAGEDIR}${PREFIX}/sbin && \
+ ${INSTALL_DATA} ${WRKSRC}/${BEATMOD}/${BEATMOD}.yml \
+ ${STAGEDIR}${ETCDIR}/${BEATMOD}.yml.sample && \
+ ${INSTALL_DATA} ${WRKSRC}/${BEATMOD}/${BEATMOD}.reference.yml \
+ ${STAGEDIR}${ETCDIR}/${BEATMOD}.yml.reference)
+ (MODULE_SRC=${WRKDIR}/${BEATMOD}-${DISTVERSION}-darwin-x86_64/module; \
+ if [ -d $${MODULE_SRC} ]; then \
+ MODULE_DEST=${STAGEDIR}${DATADIR}/${BEATMOD}/module && \
+ ${MKDIR} $${MODULE_DEST} && \
+ cd $${MODULE_SRC} && ${COPYTREE_SHARE} . $${MODULE_DEST} && \
+ cd $${MODULE_DEST} && \
+ ${FIND} . -type d -empty | ${SORT} | \
+ ${SED} -e 's,^\.,@dir ${DATADIR_REL}/${BEATMOD}/module,' >> ${TMPPLIST} && \
+ ${FIND} . -not -type d | ${SORT} | \
+ ${SED} -e 's,^\.,${DATADIR_REL}/${BEATMOD}/module,' >> ${TMPPLIST}; \
+ fi) && \
+ (MODULESD_SRC=${WRKDIR}/${BEATMOD}-${DISTVERSION}-darwin-x86_64/modules.d; \
+ if [ -d $${MODULESD_SRC} ]; then \
+ MODULESD_DEST=${STAGEDIR}${EXAMPLESDIR}/${BEATMOD}.modules.d && \
+ ${MKDIR} $${MODULESD_DEST} && \
+ cd $${MODULESD_SRC} && ${COPYTREE_SHARE} . $${MODULESD_DEST} && \
+ cd $${MODULESD_DEST} && \
+ ${FIND} . -type d -empty | ${SORT} | \
+ ${SED} -e 's,^\.,@dir ${EXAMPLESDIR_REL}/${BEATMOD}.modules.d,' >> ${TMPPLIST} && \
+ ${FIND} . -not -type d | ${SORT} | \
+ ${SED} -e 's,^\.,${EXAMPLESDIR_REL}/${BEATMOD}.modules.d,' >> ${TMPPLIST}; \
+ ${MKDIR} ${STAGEDIR}${ETCDIR}/${BEATMOD}.modules.d && \
+ ${ECHO_CMD} "The modules.d files are now in ${EXAMPLESDIR}/${BEATMOD}.modules.d" > \
+ ${STAGEDIR}${ETCDIR}/${BEATMOD}.modules.d/README; \
+ ${ECHO_CMD} ${ETCDIR_REL}/${BEATMOD}.modules.d/README >> ${TMPPLIST}; \
+ fi) && \
+ (MONITORSD_SRC=${WRKDIR}/${BEATMOD}-${DISTVERSION}-darwin-x86_64/monitors.d; \
+ if [ -d $${MONITORSD_SRC} ]; then \
+ MONITORSD_DEST=${STAGEDIR}${EXAMPLESDIR}/${BEATMOD}.monitors.d && \
+ ${MKDIR} $${MONITORSD_DEST} && \
+ cd $${MONITORSD_SRC} && ${COPYTREE_SHARE} . $${MONITORSD_DEST} && \
+ cd $${MONITORSD_DEST} && \
+ ${FIND} . -type d -empty | ${SORT} | \
+ ${SED} -e 's,^\.,@dir ${EXAMPLESDIR_REL}/${BEATMOD}.monitors.d,' >> ${TMPPLIST} && \
+ ${FIND} . -not -type d | ${SORT} | \
+ ${SED} -e 's,^\.,${EXAMPLESDIR_REL}/${BEATMOD}.monitors.d,' >> ${TMPPLIST}; \
+ ${MKDIR} ${STAGEDIR}${ETCDIR}/${BEATMOD}.monitors.d && \
+ ${ECHO_CMD} "The monitors.d files are now in ${EXAMPLESDIR}/${BEATMOD}.monitors.d" > \
+ ${STAGEDIR}${ETCDIR}/${BEATMOD}.monitors.d/README; \
+ ${ECHO_CMD} ${ETCDIR_REL}/${BEATMOD}.monitors.d/README >> ${TMPPLIST}; \
+ fi) && \
+ (KIBANA_SRC=${WRKDIR}/${BEATMOD}-${DISTVERSION}-darwin-x86_64/kibana; \
+ if [ -d $${KIBANA_SRC} ]; then \
+ KIBANA_PATH=${STAGEDIR}${DATADIR}/${BEATMOD}/kibana; \
+ ${MKDIR} $${KIBANA_PATH} && \
+ cd $${KIBANA_SRC} && ${COPYTREE_SHARE} . $${KIBANA_PATH}; \
+ cd $${KIBANA_PATH} && \
+ ${FIND} . -type d -empty | ${SORT} | \
+ ${SED} -e 's,^\.,@dir ${DATADIR_REL}/${BEATMOD}/kibana,' >> ${TMPPLIST}; \
+ ${FIND} . -not -type d | ${SORT} | \
+ ${SED} -e 's,^\.,${DATADIR_REL}/${BEATMOD}/kibana,' >> ${TMPPLIST}; \
+ fi)
+.endfor
+
+.include <bsd.port.mk>
diff --git a/sysutils/beats93/distinfo b/sysutils/beats93/distinfo
new file mode 100644
index 000000000000..45cdbeaf0d8e
--- /dev/null
+++ b/sysutils/beats93/distinfo
@@ -0,0 +1,15 @@
+TIMESTAMP = 1779100000
+SHA256 (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/go.mod) = 17c3e68c34a4d6657ac6be4af3b7091eb42b47315cf5c6d5e6bf92151b33ea56
+SIZE (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/go.mod) = 30224
+SHA256 (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/auditbeat-9.3.4-darwin-x86_64.tar.gz) = 379aa56dab0f5286b1ce91c32f149deda2a9e951f42cb2ce29b36f16a1b6f7a2
+SIZE (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/auditbeat-9.3.4-darwin-x86_64.tar.gz) = 36240049
+SHA256 (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/filebeat-9.3.4-darwin-x86_64.tar.gz) = 1a471c59f73345613643f1406cf8c2e73173e113bbc79a51a7246a6cb6544ffb
+SIZE (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/filebeat-9.3.4-darwin-x86_64.tar.gz) = 56521790
+SHA256 (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/heartbeat-9.3.4-darwin-x86_64.tar.gz) = 5303daa0ec37566179bcd4a11c4a9d1c53518d407e2ed9f79f2255f608a46121
+SIZE (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/heartbeat-9.3.4-darwin-x86_64.tar.gz) = 36012179
+SHA256 (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/metricbeat-9.3.4-darwin-x86_64.tar.gz) = 1da59a8de4eb34e45827ef5998a405f2140fbed234d6ea7e4debdbb6843106fc
+SIZE (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/metricbeat-9.3.4-darwin-x86_64.tar.gz) = 60307592
+SHA256 (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/packetbeat-9.3.4-darwin-x86_64.tar.gz) = 71acf68dca55588abe75f5716bb8aab9f5e079f2711e75ade76d40b499713c40
+SIZE (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/packetbeat-9.3.4-darwin-x86_64.tar.gz) = 37242347
+SHA256 (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/elastic-beats-v9.3.4_GH0.tar.gz) = be44d5418b03e5cbd7a179cc515e49ee30be5eb2cf4a59ee8b9914e00532427c
+SIZE (go/sysutils_beats93/elastic-beats-v9.3.4_GH0/elastic-beats-v9.3.4_GH0.tar.gz) = 104490717
diff --git a/sysutils/beats93/files/auditbeat.in b/sysutils/beats93/files/auditbeat.in
new file mode 100644
index 000000000000..59f2443115cd
--- /dev/null
+++ b/sysutils/beats93/files/auditbeat.in
@@ -0,0 +1,50 @@
+#!/bin/sh
+
+# PROVIDE: auditbeat
+# REQUIRE: DAEMON
+# BEFORE: LOGIN
+# KEYWORD: shutdown
+
+# Add the following lines to /etc/rc.conf to enable auditbeat:
+#
+# auditbeat_enable (bool): Set to YES to enable auditbeat
+# Default: NO
+# auditbeat_flags (str): Extra flags passed to auditbeat
+# auditbeat_config (str): auditbeat configuration directory
+# Default: %%ETCDIR%%
+# auditbeat_conffile (str): auditbeat configuration file
+# relative to ${auditbeat_config}
+# Default: auditbeat.yml
+
+. /etc/rc.subr
+
+name="auditbeat"
+rcvar=${name}_enable
+load_rc_config $name
+
+: ${auditbeat_enable:="NO"}
+: ${auditbeat_config:="%%ETCDIR%%"}
+: ${auditbeat_conffile:="auditbeat.yml"}
+: ${auditbeat_home:="%%DATADIR%%/auditbeat"}
+: ${auditbeat_logs:="/var/log/beats"}
+: ${auditbeat_data:="/var/db/beats/auditbeat"}
+
+# daemon
+start_precmd=auditbeat_prestart
+command=/usr/sbin/daemon
+pidfile="/var/run/${name}"
+command_args="-frP ${pidfile} %%PREFIX%%/sbin/${name} ${auditbeat_flags} --path.config ${auditbeat_config} --path.home ${auditbeat_home} --path.data ${auditbeat_data} --path.logs ${auditbeat_logs} -c ${auditbeat_conffile}"
+auditbeat_prestart() {
+# Have to empty rc_flags so they don't get passed to daemon(8)
+ rc_flags=""
+}
+
+# auditbeat will refuse to quit if linprocfs is mounted, and sadly requires -9
+[ -f /compat/linux/proc/cpuinfo ] && stop_cmd=auditbeat_stop
+
+auditbeat_stop() {
+ pkill -9 -F ${pidfile} > /dev/null 2>&1
+ pkill -9 -F ${pidfile}.child > /dev/null 2>&1
+}
+
+run_rc_command "$1"
diff --git a/sysutils/beats93/files/filebeat.in b/sysutils/beats93/files/filebeat.in
new file mode 100644
index 000000000000..824c25222d38
--- /dev/null
+++ b/sysutils/beats93/files/filebeat.in
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+# PROVIDE: filebeat
+# REQUIRE: DAEMON
+# BEFORE: LOGIN
+# KEYWORD: shutdown
+
+# Add the following lines to /etc/rc.conf to enable filebeat:
+#
+# filebeat_enable (bool): Set to YES to enable filebeat
+# Default: NO
+# filebeat_flags (str): Extra flags passed to filebeat
+# filebeat_config (str): filebeat configuration directory
+# Default: %%ETCDIR%%
+# filebeat_conffile (str): filebeat configuration file
+# relative to ${filebeat_config}
+# Default: filebeat.yml
+
+. /etc/rc.subr
+
+name="filebeat"
+rcvar=${name}_enable
+load_rc_config $name
+
+: ${filebeat_enable:="NO"}
+: ${filebeat_config:="%%ETCDIR%%"}
+: ${filebeat_conffile:="filebeat.yml"}
+: ${filebeat_home:="%%DATADIR%%/filebeat"}
+: ${filebeat_logs:="/var/log/beats"}
+: ${filebeat_data:="/var/db/beats/filebeat"}
+
+# daemon
+start_precmd=filebeat_prestart
+command=/usr/sbin/daemon
+pidfile="/var/run/${name}"
+command_args="-frP ${pidfile} %%PREFIX%%/sbin/${name} ${filebeat_flags} --path.config ${filebeat_config} --path.home ${filebeat_home} --path.data ${filebeat_data} --path.logs ${filebeat_logs} -c ${filebeat_conffile}"
+
+filebeat_prestart() {
+# Have to empty rc_flags so they don't get passed to daemon(8)
+ rc_flags=""
+}
+
+run_rc_command "$1"
diff --git a/sysutils/beats93/files/heartbeat.in b/sysutils/beats93/files/heartbeat.in
new file mode 100644
index 000000000000..d89b13328b28
--- /dev/null
+++ b/sysutils/beats93/files/heartbeat.in
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+# PROVIDE: heartbeat
+# REQUIRE: DAEMON
+# BEFORE: LOGIN
+# KEYWORD: shutdown
+
+# Add the following lines to /etc/rc.conf to enable heartbeat:
+#
+# heartbeat_enable (bool): Set to YES to enable heartbeat
+# Default: NO
+# heartbeat_flags (str): Extra flags passed to heartbeat
+# heartbeat_config (str): heartbeat configuration directory
+# Default: %%ETCDIR%%
+# heartbeat_conffile (str): heartbeat configuration file
+# relative to ${heartbeat_config}
+# Default: heartbeat.yml
+
+. /etc/rc.subr
+
+name="heartbeat"
+rcvar=${name}_enable
+load_rc_config $name
+
+: ${heartbeat_enable:="NO"}
+: ${heartbeat_config:="%%ETCDIR%%"}
+: ${heartbeat_conffile:="heartbeat.yml"}
+: ${heartbeat_home:="%%DATADIR%%/heartbeat"}
+: ${heartbeat_logs:="/var/log/beats"}
+: ${heartbeat_data:="/var/db/beats/heartbeat"}
+
+# daemon
+start_precmd=heartbeat_prestart
+command=/usr/sbin/daemon
+pidfile="/var/run/${name}"
+command_args="-frP ${pidfile} %%PREFIX%%/sbin/${name} ${heartbeat_flags} --path.config ${heartbeat_config} --path.home ${heartbeat_home} --path.data ${heartbeat_data} --path.logs ${heartbeat_logs} -c ${heartbeat_conffile}"
+
+heartbeat_prestart() {
+# Have to empty rc_flags so they don't get passed to daemon(8)
+ rc_flags=""
+}
+
+run_rc_command "$1"
diff --git a/sysutils/beats93/files/metricbeat.in b/sysutils/beats93/files/metricbeat.in
new file mode 100644
index 000000000000..66ba9615d2ec
--- /dev/null
+++ b/sysutils/beats93/files/metricbeat.in
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+# PROVIDE: metricbeat
+# REQUIRE: DAEMON
+# BEFORE: LOGIN
+# KEYWORD: shutdown
+
+# Add the following lines to /etc/rc.conf to enable metricbeat:
+#
+# metricbeat_enable (bool): Set to YES to enable metricbeat
+# Default: NO
+# metricbeat_flags (str): Extra flags passed to metricbeat
+# metricbeat_config (str): metricbeat configuration directory
+# Default: %%ETCDIR%%
+# metricbeat_conffile (str): metricbeat configuration file
+# relative to ${metricbeat_config}
+# Default: metricbeat.yml
+
+. /etc/rc.subr
+
+name="metricbeat"
+rcvar=${name}_enable
+load_rc_config $name
+
+: ${metricbeat_enable:="NO"}
+: ${metricbeat_config:="%%ETCDIR%%"}
+: ${metricbeat_conffile:="metricbeat.yml"}
+: ${metricbeat_home:="%%DATADIR%%/metricbeat"}
+: ${metricbeat_logs:="/var/log/beats"}
+: ${metricbeat_data:="/var/db/beats/metricbeat"}
+
+# daemon
+start_precmd=metricbeat_prestart
+command=/usr/sbin/daemon
+pidfile="/var/run/${name}"
+command_args="-frP ${pidfile} %%PREFIX%%/sbin/${name} ${metricbeat_flags} --path.config ${metricbeat_config} --path.home ${metricbeat_home} --path.data ${metricbeat_data} --path.logs ${metricbeat_logs} -c ${metricbeat_conffile}"
+
+metricbeat_prestart() {
+# Have to empty rc_flags so they don't get passed to daemon(8)
+ rc_flags=""
+}
+
+# metricbeat will refuse to quit if linprocfs is mounted, and sadly requires -9
+[ -f /compat/linux/proc/cpuinfo ] && stop_cmd=metricbeat_stop
+
+metricbeat_stop() {
+ pkill -9 -F ${pidfile} > /dev/null 2>&1
+ pkill -9 -F ${pidfile}.child > /dev/null 2>&1
+}
+
+run_rc_command "$1"
diff --git a/sysutils/beats93/files/packetbeat.in b/sysutils/beats93/files/packetbeat.in
new file mode 100644
index 000000000000..2541bdcc9eb7
--- /dev/null
+++ b/sysutils/beats93/files/packetbeat.in
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+# PROVIDE: packetbeat
+# REQUIRE: DAEMON
+# BEFORE: LOGIN
+# KEYWORD: shutdown
+
+# Add the following lines to /etc/rc.conf to enable packetbeat
+#
+# packetbeat_enable (bool): Set to YES to enable packetbeat
+# Default: NO
+# packetbeat_flags (str): Extra flags passed to packetbeat
+# packetbeat_config (str): packetbeat configuration directory
+# Default: %%ETCDIR%%
+# packetbeat_conffile (str): packetbeat configuration file
+# relative to ${packetbeat_config}
+# Default: packetbeat.yml
+
+. /etc/rc.subr
+
+name="packetbeat"
+rcvar=${name}_enable
+load_rc_config $name
+
+: ${packetbeat_enable:="NO"}
+: ${packetbeat_config:="%%ETCDIR%%"}
+: ${packetbeat_conffile:="packetbeat.yml"}
+: ${packetbeat_home:="%%DATADIR%%/packetbeat"}
+: ${packetbeat_logs:="/var/log/beats"}
+: ${packetbeat_data:="/var/db/beats/packetbeat"}
+
+# daemon
+start_precmd=packetbeat_prestart
+command=/usr/sbin/daemon
+pidfile="/var/run/${name}"
+command_args="-frP ${pidfile} %%PREFIX%%/sbin/${name} ${packetbeat_flags} --path.config ${packetbeat_config} --path.home ${packetbeat_home} --path.data ${packetbeat_data} --path.logs ${packetbeat_logs} -c ${packetbeat_conffile}"
+
+packetbeat_prestart() {
+# Have to empty rc_flags so they don't get passed to daemon(8)
+ rc_flags=""
+}
+
+run_rc_command "$1"
diff --git a/sysutils/beats93/files/patch-auditbeat_auditbeat.reference.yml b/sysutils/beats93/files/patch-auditbeat_auditbeat.reference.yml
new file mode 100644
index 000000000000..13dc7dceefa4
--- /dev/null
+++ b/sysutils/beats93/files/patch-auditbeat_auditbeat.reference.yml
@@ -0,0 +1,20 @@
+--- auditbeat/auditbeat.reference.yml.orig 2026-02-23 21:59:26 UTC
++++ auditbeat/auditbeat.reference.yml
+@@ -14,7 +14,7 @@ auditbeat.config.modules:
+ auditbeat.config.modules:
+
+ # Glob pattern for configuration reloading
+- path: ${path.config}/modules.d/*.yml
++ path: ${path.config}/auditbeat.modules.d/*.yml
+
+ # Period on which files under path should be checked for changes
+ reload.period: 10s
+@@ -1250,7 +1250,7 @@ output.elasticsearch:
+
+ # The directory from where to read the dashboards. The default is the `kibana`
+ # folder in the home path.
+-#setup.dashboards.directory: ${path.home}/kibana
++#setup.dashboards.directory: %%DATADIR%%/auditbeat/kibana
+
+ # The URL from where to download the dashboard archive. It is used instead of
+ # the directory if it has a value.
diff --git a/sysutils/beats93/files/patch-auditbeat_auditbeat.yml b/sysutils/beats93/files/patch-auditbeat_auditbeat.yml
new file mode 100644
index 000000000000..ee2052ae5b40
--- /dev/null
+++ b/sysutils/beats93/files/patch-auditbeat_auditbeat.yml
@@ -0,0 +1,13 @@
+--- auditbeat/auditbeat.yml.orig 2026-02-23 21:59:26 UTC
++++ auditbeat/auditbeat.yml
+@@ -82,6 +82,10 @@ setup.template.settings:
+ # website.
+ #setup.dashboards.url:
+
++# The directory from where to read the dashboards. The default is the `kibana`
++# folder in the home path.
++#setup.dashboards.directory: %%DATADIR%%/auditbeat/kibana
++
+ # =================================== Kibana ===================================
+
+ # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
diff --git a/sysutils/beats93/files/patch-dev-tools_mage_settings.go b/sysutils/beats93/files/patch-dev-tools_mage_settings.go
new file mode 100644
index 000000000000..4e23ea1aa6f2
--- /dev/null
+++ b/sysutils/beats93/files/patch-dev-tools_mage_settings.go
@@ -0,0 +1,20 @@
+--- dev-tools/mage/settings.go.orig 2026-02-23 21:59:26 UTC
++++ dev-tools/mage/settings.go
+@@ -31,7 +31,6 @@ import (
+ "sync"
+ "time"
+
+- "github.com/magefile/mage/sh"
+ "golang.org/x/text/cases"
+ "golang.org/x/text/language"
+ "gopkg.in/yaml.v3"
+@@ -282,7 +281,8 @@ func CommitHash() (string, error) {
+ func CommitHash() (string, error) {
+ var err error
+ commitHashOnce.Do(func() {
+- commitHash, err = sh.Output("git", "rev-parse", "HEAD")
++ err = nil
++ commitHash = "%%BEATSVERSION%%"
+ })
+ return commitHash, err
+ }
diff --git a/sysutils/beats93/files/patch-filebeat_filebeat.reference.yml b/sysutils/beats93/files/patch-filebeat_filebeat.reference.yml
new file mode 100644
index 000000000000..264dee0be250
--- /dev/null
+++ b/sysutils/beats93/files/patch-filebeat_filebeat.reference.yml
@@ -0,0 +1,26 @@
+--- filebeat/filebeat.reference.yml.orig 2026-02-23 21:59:26 UTC
++++ filebeat/filebeat.reference.yml
+@@ -1384,12 +1384,12 @@ - type: filestream
+ #filebeat.config:
+ #inputs:
+ #enabled: false
+- #path: inputs.d/*.yml
++ #path: filebeat.inputs.d/*.yml
+ #reload.enabled: true
+ #reload.period: 10s
+ #modules:
+ #enabled: true
+- #path: modules.d/*.yml
++ #path: filebeat.modules.d/*.yml
+ #reload.enabled: true
+ #reload.period: 10s
+
+@@ -2463,7 +2463,7 @@ output.elasticsearch:
+
+ # The directory from where to read the dashboards. The default is the `kibana`
+ # folder in the home path.
+-#setup.dashboards.directory: ${path.home}/kibana
++#setup.dashboards.directory: %%DATADIR%%/filebeat/kibana
+
+ # The URL from where to download the dashboard archive. It is used instead of
+ # the directory if it has a value.
diff --git a/sysutils/beats93/files/patch-filebeat_filebeat.yml b/sysutils/beats93/files/patch-filebeat_filebeat.yml
new file mode 100644
index 000000000000..8da25911b8d9
--- /dev/null
+++ b/sysutils/beats93/files/patch-filebeat_filebeat.yml
@@ -0,0 +1,33 @@
+--- filebeat/filebeat.yml.orig 2026-02-23 21:59:26 UTC
++++ filebeat/filebeat.yml
+@@ -81,7 +81,7 @@ filebeat.config.modules:
+
+ filebeat.config.modules:
+ # Glob pattern for configuration loading
+- path: ${path.config}/modules.d/*.yml
++ path: ${path.config}/filebeat.modules.d/*.yml
+
+ # Set to true to enable config reloading
+ reload.enabled: false
+@@ -124,6 +124,10 @@ setup.template.settings:
+ # website.
+ #setup.dashboards.url:
+
++# The directory from where to read the dashboards. The default is the `kibana`
++# folder in the home path.
++#setup.dashboards.directory: %%DATADIR%%/filebeat/kibana
++
+ # =================================== Kibana ===================================
+
+ # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
+@@ -195,8 +199,8 @@ processors:
+ - add_host_metadata:
+ when.not.contains.tags: forwarded
+ - add_cloud_metadata: ~
+- - add_docker_metadata: ~
+- - add_kubernetes_metadata: ~
++# - add_docker_metadata: ~
++# - add_kubernetes_metadata: ~
+
+ # ================================== Logging ===================================
+
diff --git a/sysutils/beats93/files/patch-go-sysinfo b/sysutils/beats93/files/patch-go-sysinfo
new file mode 100644
index 000000000000..0f4774b4989a
--- /dev/null
+++ b/sysutils/beats93/files/patch-go-sysinfo
@@ -0,0 +1,1314 @@
+--- vendor/github.com/elastic/go-sysinfo/internal/cgo/disabled.go.orig 2026-04-30 16:18:17 UTC
++++ vendor/github.com/elastic/go-sysinfo/internal/cgo/disabled.go
+@@ -0,0 +1,23 @@
++// Licensed to Elasticsearch B.V. under one or more contributor
++// license agreements. See the NOTICE file distributed with
++// this work for additional information regarding copyright
++// ownership. Elasticsearch B.V. 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.
++
++//go:build !cgo
++
++package cgo
++
++// Enabled is true if cgo was enabled at compile-time.
++const Enabled = false
+--- vendor/github.com/elastic/go-sysinfo/internal/cgo/enabled.go.orig 2026-04-30 16:18:17 UTC
++++ vendor/github.com/elastic/go-sysinfo/internal/cgo/enabled.go
+@@ -0,0 +1,23 @@
++// Licensed to Elasticsearch B.V. under one or more contributor
++// license agreements. See the NOTICE file distributed with
++// this work for additional information regarding copyright
++// ownership. Elasticsearch B.V. 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.
++
++//go:build cgo
++
++package cgo
++
++// Enabled is true if cgo was enabled at compile-time.
++const Enabled = true
+--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/defs_freebsd.go.orig 2026-04-30 16:18:17 UTC
++++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/defs_freebsd.go
+@@ -0,0 +1,33 @@
++// Licensed to Elasticsearch B.V. under one or more contributor
++// license agreements. See the NOTICE file distributed with
++// this work for additional information regarding copyright
++// ownership. Elasticsearch B.V. 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.
++
++//go:build ignore
++// +build ignore
++
++package freebsd
++
++/*
++#include <sys/types.h>
++#include <sys/vmmeter.h>
++#include <sys/time.h>
++#include <kvm.h>
++*/
++import "C"
++
++type kvmSwap C.struct_kvm_swap
++
++type clockInfo C.struct_clockinfo
+--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/doc.go.orig 2026-04-30 16:18:17 UTC
++++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/doc.go
+@@ -0,0 +1,22 @@
++// Licensed to Elasticsearch B.V. under one or more contributor
++// license agreements. See the NOTICE file distributed with
++// this work for additional information regarding copyright
++// ownership. Elasticsearch B.V. 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.
++
++// Package freebsd implements the HostProvider and ProcessProvider interfaces
++// for providing information about FreeBSD.
++package freebsd
++
++//go:generate sh -c "go tool cgo -godefs defs_freebsd.go > ztypes_freebsd.go"
+--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo.go.orig 2026-04-30 16:18:17 UTC
++++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo.go
+@@ -0,0 +1,238 @@
++// Licensed to Elasticsearch B.V. under one or more contributor
++// license agreements. See the NOTICE file distributed with
++// this work for additional information regarding copyright
++// ownership. Elasticsearch B.V. 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.
++
++//go:build freebsd && cgo
++
++package freebsd
++
++import (
++ "context"
++ "errors"
++ "os"
++ "path/filepath"
++ "time"
++
++ "github.com/prometheus/procfs"
++
++ "github.com/elastic/go-sysinfo/internal/registry"
++ "github.com/elastic/go-sysinfo/providers/shared"
++ "github.com/elastic/go-sysinfo/types"
++)
++
++func init() {
++ registry.Register(newFreeBSDSystem())
++}
++
++type freebsdSystem struct{}
++
++func newFreeBSDSystem() freebsdSystem {
++ return freebsdSystem{}
++}
++
++func (s freebsdSystem) Host() (types.Host, error) {
++ return newHost()
++}
++
++type host struct {
++ procFS procFS
++ info types.HostInfo
++}
++
++func (h *host) Info() types.HostInfo {
++ return h.info
++}
++
++func (h *host) CPUTime() (types.CPUTimes, error) {
++ cpu := types.CPUTimes{}
++ r := &reader{}
++ r.cpuTime(&cpu)
++ return cpu, r.Err()
++}
++
++func (h *host) Memory() (*types.HostMemoryInfo, error) {
++ m := &types.HostMemoryInfo{}
++ r := &reader{}
++ r.memInfo(m)
++ return m, r.Err()
++}
++
++func (h *host) FQDNWithContext(ctx context.Context) (string, error) {
++ return shared.FQDNWithContext(ctx)
++}
++
++func (h *host) FQDN() (string, error) {
++ return h.FQDNWithContext(context.Background())
++}
++
++func newHost() (*host, error) {
++ h := &host{}
++ r := &reader{}
++ r.architecture(h)
++ r.bootTime(h)
++ r.hostname(h)
++ r.network(h)
++ r.kernelVersion(h)
++ r.os(h)
++ r.time(h)
++ r.uniqueID(h)
++ return h, r.Err()
++}
++
++type reader struct {
++ errs []error
++}
++
++func (r *reader) addErr(err error) bool {
++ if err != nil {
++ if !errors.Is(err, types.ErrNotImplemented) {
++ r.errs = append(r.errs, err)
++ }
++ return true
++ }
++ return false
++}
++
++func (r *reader) Err() error {
++ return errors.Join(r.errs...)
++}
++
++func (r *reader) cpuTime(cpu *types.CPUTimes) {
++ times, err := cpuStateTimes()
++ if r.addErr(err) {
++ return
++ }
++ *cpu = *times
++}
++
++func (r *reader) memInfo(m *types.HostMemoryInfo) {
++ // Memory counter calculations:
++ // total = physical memory
++ // used = active + wired
++ // free = free
++ // available = buffers + inactive + cache + free
++
++ pageSize, err := pageSizeBytes()
++ if r.addErr(err) {
++ return
++ }
++
++ m.Total = totalPhysicalMem(r)
++ activePages := activePageCount(r)
++
++ m.Metrics = make(map[string]uint64, 6)
++ m.Metrics["active_bytes"] = activePages * pageSize
++
++ wirePages := wirePageCount(r)
++ m.Metrics["wired_bytes"] = wirePages * pageSize
++
++ inactivePages := inactivePageCount(r)
++ m.Metrics["inactive_bytes"] = inactivePages * pageSize
++
++ cachePages := cachePageCount(r)
++ m.Metrics["cache_bytes"] = cachePages * pageSize
++
++ freePages := freePageCount(r)
++ m.Metrics["free_bytes"] = freePages * pageSize
++
++ buffers := buffersUsedBytes(r)
++ m.Metrics["buffer_bytes"] = buffers
++
++ m.Used = (activePages + wirePages) * pageSize
++ m.Free = freePages * pageSize
++ m.Available = (inactivePages+cachePages+freePages)*pageSize + buffers
++
++ // Virtual (swap) Memory
++ swap, err := kvmGetSwapInfo()
++ if r.addErr(err) {
++ return
++ }
++
++ m.VirtualTotal = uint64(swap.Total) * pageSize
++ m.VirtualUsed = uint64(swap.Used) * pageSize
++ m.VirtualFree = m.VirtualTotal - m.VirtualUsed
++}
++
++func (r *reader) architecture(h *host) {
++ v, err := architecture()
++ if r.addErr(err) {
++ return
++ }
++ h.info.Architecture = v
++}
++
++func (r *reader) bootTime(h *host) {
++ v, err := bootTime()
++ if r.addErr(err) {
++ return
++ }
++ h.info.BootTime = v
++}
++
++func (r *reader) hostname(h *host) {
++ v, err := os.Hostname()
++ if r.addErr(err) {
++ return
++ }
++ h.info.Hostname = v
++}
++
++func (r *reader) network(h *host) {
++ ips, macs, err := shared.Network()
++ if r.addErr(err) {
++ return
++ }
++ h.info.IPs = ips
++ h.info.MACs = macs
++}
++
++func (r *reader) kernelVersion(h *host) {
++ v, err := kernelVersion()
++ if r.addErr(err) {
++ return
++ }
++ h.info.KernelVersion = v
++}
++
++func (r *reader) os(h *host) {
++ v, err := operatingSystem()
++ if r.addErr(err) {
++ return
++ }
++ h.info.OS = v
++}
++
++func (r *reader) time(h *host) {
++ h.info.Timezone, h.info.TimezoneOffsetSec = time.Now().Zone()
++}
++
++func (r *reader) uniqueID(h *host) {
++ v, err := machineID()
++ if r.addErr(err) {
++ return
++ }
++ h.info.UniqueID = v
++}
++
++type procFS struct {
++ procfs.FS
++ mountPoint string
++}
++
++func (fs *procFS) path(p ...string) string {
++ elem := append([]string{fs.mountPoint}, p...)
++ return filepath.Join(elem...)
++}
+--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo_test.go.orig 2026-04-30 16:18:17 UTC
++++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo_test.go
+@@ -0,0 +1,53 @@
++// Licensed to Elasticsearch B.V. under one or more contributor
++// license agreements. See the NOTICE file distributed with
++// this work for additional information regarding copyright
++// ownership. Elasticsearch B.V. 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.
++
++//go:build freebsd && cgo
++
++package freebsd
++
++import (
++ "encoding/json"
++ "testing"
++
++ "github.com/elastic/go-sysinfo/internal/registry"
++)
++
++var _ registry.HostProvider = freebsdSystem{}
++
++func TestHost(t *testing.T) {
++ host, err := newFreeBSDSystem().Host()
++ if err != nil {
++ t.Fatal(err)
++ }
++
++ t.Run("Info", func(t *testing.T) {
++ info := host.Info()
++
++ data, _ := json.MarshalIndent(info, "", " ")
++ t.Log(string(data))
++ })
++
++ t.Run("Memory", func(t *testing.T) {
++ mem, err := host.Memory()
++ if err != nil {
++ t.Fatal(err)
++ }
++
++ data, _ := json.MarshalIndent(mem, "", " ")
++ t.Log(string(data))
++ })
++}
+--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/kvm_freebsd_cgo.go.orig 2026-04-30 16:18:17 UTC
++++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/kvm_freebsd_cgo.go
+@@ -0,0 +1,58 @@
++// Licensed to Elasticsearch B.V. under one or more contributor
++// license agreements. See the NOTICE file distributed with
++// this work for additional information regarding copyright
++// ownership. Elasticsearch B.V. 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.
++
++//go:build freebsd && cgo
++
++package freebsd
++
++/*
++#cgo LDFLAGS: -lkvm
++#include <sys/cdefs.h>
++#include <sys/types.h>
++#include <sys/sysctl.h>
++
++#include <paths.h>
++#include <kvm.h>
++#include <stdlib.h>
++*/
++import "C"
++
++import (
++ "fmt"
++ "unsafe"
++
++ "golang.org/x/sys/unix"
++)
++
++// kvmGetSwapInfo returns swap summary statistics for the system. It accesses
++// the kernel virtual memory (kvm) images by using libkvm.
++func kvmGetSwapInfo() (*kvmSwap, error) {
++ // Obtain a KVM file descriptor.
++ var errstr *C.char
++ kd := C.kvm_open(nil, nil, nil, unix.O_RDONLY, errstr)
++ if errstr != nil {
++ return nil, fmt.Errorf("failed calling kvm_open: %s", C.GoString(errstr))
++ }
++ defer C.kvm_close(kd)
++
++ var swap kvmSwap
++ if n, err := C.kvm_getswapinfo(kd, (*C.struct_kvm_swap)(unsafe.Pointer(&swap)), 1, 0); n != 0 {
++ return nil, fmt.Errorf("failed to get kvm_getswapinfo: %w", err)
++ }
++
++ return &swap, nil
++}
+--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/process_freebsd_cgo.go.orig 2026-04-30 16:18:17 UTC
++++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/process_freebsd_cgo.go
+@@ -0,0 +1,386 @@
++// Licensed to Elasticsearch B.V. under one or more contributor
++// license agreements. See the NOTICE file distributed with
++// this work for additional information regarding copyright
++// ownership. Elasticsearch B.V. 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.
++
++//go:build freebsd && cgo
++
++package freebsd
++
++import "C"
++
++/*
++#cgo LDFLAGS: -lprocstat
++#include <sys/types.h>
++#include <sys/sysctl.h>
++#include <sys/time.h>
++#include <sys/param.h>
++#include <sys/queue.h>
++#include <sys/socket.h>
++#include <sys/user.h>
++
++#include <libprocstat.h>
++#include <string.h>
++
++struct kinfo_proc getProcInfoAt(struct kinfo_proc *procs, unsigned int index) {
++ return procs[index];
++}
++
++unsigned int countArrayItems(char **items) {
++ unsigned int i = 0;
++ for (i = 0; items[i] != NULL; ++i);
++ return i;
++}
++
++char * itemAtIndex(char **items, unsigned int index) {
++ return items[index];
++}
++
++unsigned int countFileStats(struct filestat_list *head) {
++ unsigned int count = 0;
++ struct filestat *fst;
++ STAILQ_FOREACH(fst, head, next) {
++ ++count;
++ }
++
++ return count;
++}
++
++void copyFileStats(struct filestat_list *head, struct filestat *out, unsigned int size) {
++ unsigned int index = 0;
++ struct filestat *fst;
++ if (size == 0) {
++ return;
++ }
++ STAILQ_FOREACH(fst, head, next) {
++ memcpy(out, fst, sizeof(*fst));
++ ++out;
++ --size;
++ }
++}
++*/
++import "C"
++
++import (
++ "errors"
++ "fmt"
++ "os"
++ "strconv"
++ "strings"
++ "time"
++
++ "github.com/elastic/go-sysinfo/types"
++)
++
++func getProcInfo(op, arg int) ([]process, error) {
++ procstat, err := C.procstat_open_sysctl()
++ if procstat == nil {
++ return nil, fmt.Errorf("failed to open procstat sysctl: %w", err)
++ }
++ defer C.procstat_close(procstat)
++
++ var count C.uint = 0
++ kprocs, err := C.procstat_getprocs(procstat, C.int(op), C.int(arg), &count)
++ if kprocs == nil {
++ return nil, fmt.Errorf("getprocs failed: %w", err)
++ }
++ defer C.procstat_freeprocs(procstat, kprocs)
++
++ procs := make([]process, count)
++ var index C.uint
++ for index = 0; index < count; index++ {
++ proc := C.getProcInfoAt(kprocs, index)
++ procs[index].kinfo = proc
++ procs[index].pid = int(proc.ki_pid)
++ }
++
++ return procs, nil
++}
++
++func copyArray(from **C.char) []string {
++ if from == nil {
++ return nil
++ }
++
++ count := C.countArrayItems(from)
++ out := make([]string, count)
++
++ for index := C.uint(0); index < count; index++ {
++ out[index] = C.GoString(C.itemAtIndex(from, index))
++ }
++
++ return out
++}
++
++func makeMap(from []string) map[string]string {
++ out := make(map[string]string, len(from))
++
++ for _, env := range from {
++ parts := strings.Split(env, "=")
++ if len(parts) > 1 {
++ out[parts[0]] = parts[1]
++ }
++ }
++
++ return out
++}
++
++func getProcEnv(p *process) (map[string]string, error) {
++ procstat, err := C.procstat_open_sysctl()
++
++ if procstat == nil {
++ return nil, fmt.Errorf("failed to open procstat sysctl: %w", err)
++ }
++ defer C.procstat_close(procstat)
++
++ env, err := C.procstat_getenvv(procstat, &p.kinfo, 0)
++ defer C.procstat_freeenvv(procstat)
++
++ return makeMap(copyArray(env)), err
++}
++
++func getProcArgs(p *process) ([]string, error) {
++ procstat, err := C.procstat_open_sysctl()
++
++ if procstat == nil {
++ return nil, fmt.Errorf("failed to open procstat sysctl: %w", err)
++ }
++ defer C.procstat_close(procstat)
++
++ args, err := C.procstat_getargv(procstat, &p.kinfo, 0)
++ defer C.procstat_freeargv(procstat)
++
++ return copyArray(args), err
++}
++
++func getProcPathname(p *process) (string, error) {
++ procstat, err := C.procstat_open_sysctl()
++
++ if procstat == nil {
++ return "", fmt.Errorf("failed to open procstat sysctl: %w", err)
++ }
++ defer C.procstat_close(procstat)
++
++ const maxlen = uint(1024)
++ out := make([]C.char, maxlen)
++ if res, err := C.procstat_getpathname(procstat, &p.kinfo, &out[0], C.size_t(maxlen)); res != 0 {
++ return "", err
++ }
++ return C.GoString(&out[0]), nil
++}
++
++func getFileStats(fileStats *C.struct_filestat_list) []C.struct_filestat {
++ count := C.countFileStats(fileStats)
++
++ if count < 1 {
++ return nil
++ }
++
++ out := make([]C.struct_filestat, count)
++
++ C.copyFileStats(fileStats, &out[0], count)
++ return out
++}
++
++func getProcCWD(p *process) (string, error) {
++ procstat, err := C.procstat_open_sysctl()
++
++ if procstat == nil {
++ return "", fmt.Errorf("failed to open procstat sysctl: %w", err)
++ }
++ defer C.procstat_close(procstat)
++
++ fs, err := C.procstat_getfiles(procstat, &p.kinfo, 0)
++ if fs == nil {
++ return "", fmt.Errorf("failed to get files: %w", err)
++ }
++
++ defer C.procstat_freefiles(procstat, fs)
++
++ files := getFileStats(fs)
++ for _, f := range files {
++ if f.fs_uflags == C.PS_FST_UFLAG_CDIR {
++ return C.GoString(f.fs_path), nil
++ }
++ }
++
++ return "", nil
++}
++
++type process struct {
++ pid int
++ kinfo C.struct_kinfo_proc
++}
++
++func timevalToDuration(tm C.struct_timeval) time.Duration {
++ return time.Duration(tm.tv_sec)*time.Second +
++ time.Duration(tm.tv_usec)*time.Microsecond
++}
++
++func (p *process) CPUTime() (types.CPUTimes, error) {
++ procs, err := getProcInfo(C.KERN_PROC_PID, p.PID())
++ if err != nil {
++ return types.CPUTimes{}, err
++ }
++ p.kinfo = procs[0].kinfo
++
++ return types.CPUTimes{
++ User: timevalToDuration(p.kinfo.ki_rusage.ru_utime),
++ System: timevalToDuration(p.kinfo.ki_rusage.ru_stime),
++ }, nil
++}
++
++func (p *process) Info() (types.ProcessInfo, error) {
++ procs, err := getProcInfo(C.KERN_PROC_PID, p.PID())
++ if err != nil {
++ return types.ProcessInfo{}, err
++ }
++ p.kinfo = procs[0].kinfo
++
++ cwd, err := getProcCWD(p)
++ if err != nil {
++ return types.ProcessInfo{}, err
++ }
++
++ args, err := getProcArgs(p)
++ if err != nil {
++ return types.ProcessInfo{}, err
++ }
++
++ exe, _ := getProcPathname(p)
++
++ return types.ProcessInfo{
++ Name: C.GoString(&p.kinfo.ki_comm[0]),
++ PID: int(p.kinfo.ki_pid),
++ PPID: int(p.kinfo.ki_ppid),
++ CWD: cwd,
++ Exe: exe,
++ Args: args,
++ StartTime: time.Unix(int64(p.kinfo.ki_start.tv_sec), int64(p.kinfo.ki_start.tv_usec)*1000),
++ }, nil
++}
++
++func (p *process) Memory() (types.MemoryInfo, error) {
++ pageSize, err := pageSizeBytes()
++ if err != nil {
++ return types.MemoryInfo{}, err
++ }
++
++ procs, err := getProcInfo(C.KERN_PROC_PID, p.PID())
++ if err != nil {
++ return types.MemoryInfo{}, err
++ }
++ p.kinfo = procs[0].kinfo
++
++ return types.MemoryInfo{
++ Resident: uint64(p.kinfo.ki_rssize) * pageSize,
++ Virtual: uint64(p.kinfo.ki_size),
++ }, nil
++}
++
++func (p *process) User() (types.UserInfo, error) {
++ procs, err := getProcInfo(C.KERN_PROC_PID, p.PID())
++ if err != nil {
++ return types.UserInfo{}, err
++ }
++
++ p.kinfo = procs[0].kinfo
++
++ return types.UserInfo{
++ UID: strconv.FormatUint(uint64(p.kinfo.ki_ruid), 10),
++ EUID: strconv.FormatUint(uint64(p.kinfo.ki_uid), 10),
++ SUID: strconv.FormatUint(uint64(p.kinfo.ki_svuid), 10),
++ GID: strconv.FormatUint(uint64(p.kinfo.ki_rgid), 10),
++ EGID: strconv.FormatUint(uint64(p.kinfo.ki_groups[0]), 10),
++ SGID: strconv.FormatUint(uint64(p.kinfo.ki_svgid), 10),
++ }, nil
++}
++
++func (p *process) PID() int {
++ return p.pid
++}
++
++func (p *process) OpenHandles() ([]string, error) {
++ procstat := C.procstat_open_sysctl()
++ if procstat == nil {
++ return nil, errors.New("failed to open procstat sysctl")
++ }
++ defer C.procstat_close(procstat)
++
++ fs := C.procstat_getfiles(procstat, &p.kinfo, 0)
++ defer C.procstat_freefiles(procstat, fs)
++
++ files := getFileStats(fs)
++ names := make([]string, 0, len(files))
++
++ for _, file := range files {
++ if file.fs_type == 1 {
++ if path := C.GoString(file.fs_path); path != "" {
++ names = append(names, path)
++ }
++ }
++ }
++
++ return names, nil
++}
++
++func (p *process) OpenHandleCount() (int, error) {
++ procstat := C.procstat_open_sysctl()
++ if procstat == nil {
++ return 0, errors.New("failed to open procstat sysctl")
++ }
++ defer C.procstat_close(procstat)
++
++ fs := C.procstat_getfiles(procstat, &p.kinfo, 0)
++ defer C.procstat_freefiles(procstat, fs)
++ return int(C.countFileStats(fs)), nil
++}
++
++func (p *process) Environment() (map[string]string, error) {
++ return getProcEnv(p)
++}
++
++func (s freebsdSystem) Processes() ([]types.Process, error) {
++ procs, err := getProcInfo(C.KERN_PROC_PROC, 0)
++ out := make([]types.Process, 0, len(procs))
++
++ for _, proc := range procs {
++ out = append(out, &process{
++ pid: proc.pid,
++ kinfo: proc.kinfo,
++ })
++ }
++
++ return out, err
++}
++
++func (s freebsdSystem) Process(pid int) (types.Process, error) {
++ return &process{pid: pid}, nil
++}
++
++func (s freebsdSystem) Self() (types.Process, error) {
++ return s.Process(os.Getpid())
++}
++
++func (p *process) Parent() (types.Process, error) {
++ info, err := p.Info()
++ if err != nil {
++ return nil, err
++ }
++
++ proc := process{pid: info.PPID}
++
++ return &proc, nil
++}
+--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd.go.orig 2026-04-30 16:18:17 UTC
++++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd.go
+@@ -0,0 +1,248 @@
++// Licensed to Elasticsearch B.V. under one or more contributor
++// license agreements. See the NOTICE file distributed with
++// this work for additional information regarding copyright
++// ownership. Elasticsearch B.V. 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.
++
++//go:build freebsd
++
++package freebsd
++
++import (
++ "fmt"
++ "strconv"
++ "strings"
++ "sync"
++ "time"
++ "unsafe"
++
++ "github.com/elastic/go-sysinfo/types"
++
++ "golang.org/x/sys/unix"
++)
++
++var tickDuration = sync.OnceValues(func() (time.Duration, error) {
++ const mib = "kern.clockrate"
++
++ c, err := unix.SysctlClockinfo(mib)
++ if err != nil {
++ return 0, fmt.Errorf("failed to get %s: %w", mib, err)
++ }
++ return time.Duration(c.Tick) * time.Microsecond, nil
++})
++
++var pageSizeBytes = sync.OnceValues(func() (uint64, error) {
++ const mib = "vm.stats.vm.v_page_size"
++
++ v, err := unix.SysctlUint32(mib)
++ if err != nil {
++ return 0, fmt.Errorf("failed to get %s: %w", mib, err)
++ }
++
++ return uint64(v), nil
++})
++
++func activePageCount(r *reader) uint64 {
++ const mib = "vm.stats.vm.v_active_count"
++
++ v, err := unix.SysctlUint32(mib)
++ if r.addErr(err) {
++ return 0
++ }
++ return uint64(v)
++}
++
++func architecture() (string, error) {
++ const mib = "hw.machine"
++
++ arch, err := unix.Sysctl(mib)
++ if err != nil {
++ return "", fmt.Errorf("failed to get architecture: %w", err)
++ }
++
++ return arch, nil
++}
++
++func bootTime() (time.Time, error) {
++ const mib = "kern.boottime"
++
++ tv, err := unix.SysctlTimeval(mib)
++ if err != nil {
++ return time.Time{}, fmt.Errorf("failed to get host uptime: %w", err)
++ }
++
++ bootTime := time.Unix(int64(tv.Sec), 1000*int64(tv.Usec))
++ return bootTime, nil
++}
++
++// buffersUsedBytes returns the number memory bytes used as disk cache.
++func buffersUsedBytes(r *reader) uint64 {
++ const mib = "vfs.bufspace"
++
++ v, err := unix.SysctlUint64(mib)
++ if r.addErr(err) {
++ return 0
++ }
++
++ return v
++}
++
++func cachePageCount(r *reader) uint64 {
++ const mib = "vm.stats.vm.v_cache_count"
++
++ v, err := unix.SysctlUint32(mib)
++ if r.addErr(err) {
++ return 0
++ }
++
++ return uint64(v)
++}
++
++const sizeOfUint64 = int(unsafe.Sizeof(uint64(0)))
++
++// cpuStateTimes uses sysctl kern.cp_time to get the amount of time spent in
++// different CPU states.
++func cpuStateTimes() (*types.CPUTimes, error) {
++ tickDuration, err := tickDuration()
++ if err != nil {
++ return nil, err
++ }
++
++ const mib = "kern.cp_time"
++ buf, err := unix.SysctlRaw(mib)
++ if err != nil {
++ return nil, fmt.Errorf("failed to get %s: %w", mib, err)
++ }
++
++ var clockTicks [unix.CPUSTATES]uint64
++ if len(buf) < len(clockTicks)*sizeOfUint64 {
++ return nil, fmt.Errorf("kern.cp_time data is too short (got %d bytes)", len(buf))
++ }
++ for i := range clockTicks {
++ val := *(*uint64)(unsafe.Pointer(&buf[sizeOfUint64*i]))
++ clockTicks[i] = val
++ }
++
++ return &types.CPUTimes{
++ User: time.Duration(clockTicks[unix.CP_USER]) * tickDuration,
++ System: time.Duration(clockTicks[unix.CP_SYS]) * tickDuration,
++ Idle: time.Duration(clockTicks[unix.CP_IDLE]) * tickDuration,
++ IRQ: time.Duration(clockTicks[unix.CP_INTR]) * tickDuration,
++ Nice: time.Duration(clockTicks[unix.CP_NICE]) * tickDuration,
++ }, nil
++}
++
++func freePageCount(r *reader) uint64 {
++ const mib = "vm.stats.vm.v_free_count"
++
++ v, err := unix.SysctlUint32(mib)
++ if r.addErr(err) {
++ return 0
++ }
++
++ return uint64(v)
++}
++
++func inactivePageCount(r *reader) uint64 {
++ const mib = "vm.stats.vm.v_inactive_count"
++
++ v, err := unix.SysctlUint32(mib)
++ if r.addErr(err) {
++ return 0
++ }
++
++ return uint64(v)
++}
++
++func kernelVersion() (string, error) {
++ const mib = "kern.osrelease"
++
++ version, err := unix.Sysctl(mib)
++ if err != nil {
++ return "", fmt.Errorf("failed to get kernel version: %w", err)
++ }
++
++ return version, nil
++}
++
++func machineID() (string, error) {
++ const mib = "kern.hostuuid"
++
++ uuid, err := unix.Sysctl(mib)
++ if err != nil {
++ return "", fmt.Errorf("failed to get machine id: %w", err)
++ }
++
++ return uuid, nil
++}
++
++func operatingSystem() (*types.OSInfo, error) {
++ info := &types.OSInfo{
++ Type: "freebsd",
++ Family: "freebsd",
++ Platform: "freebsd",
++ }
++
++ osType, err := unix.Sysctl("kern.ostype")
++ if err != nil {
++ return info, err
++ }
++ info.Name = osType
++
++ // Example: 13.0-RELEASE-p11
++ osRelease, err := unix.Sysctl("kern.osrelease")
++ if err != nil {
++ return info, err
++ }
++ info.Version = osRelease
++
++ releaseParts := strings.Split(osRelease, "-")
++
++ majorMinor := strings.Split(releaseParts[0], ".")
++ if len(majorMinor) > 0 {
++ info.Major, _ = strconv.Atoi(majorMinor[0])
++ }
++ if len(majorMinor) > 1 {
++ info.Minor, _ = strconv.Atoi(majorMinor[1])
++ }
++
++ if len(releaseParts) > 1 {
++ info.Build = releaseParts[1]
++ }
++ if len(releaseParts) > 2 {
++ info.Patch, _ = strconv.Atoi(strings.TrimPrefix(releaseParts[2], "p"))
++ }
++
++ return info, nil
++}
++
++func totalPhysicalMem(r *reader) uint64 {
++ const mib = "hw.physmem"
++
++ v, err := unix.SysctlUint64(mib)
++ if r.addErr(err) {
++ return 0
++ }
++ return v
++}
++
++func wirePageCount(r *reader) uint64 {
++ const mib = "vm.stats.vm.v_wire_count"
++
++ v, err := unix.SysctlUint32(mib)
++ if r.addErr(err) {
++ return 0
++ }
++ return uint64(v)
++}
+--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd_test.go.orig 2026-04-30 16:18:17 UTC
++++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd_test.go
+@@ -0,0 +1,137 @@
++// Licensed to Elasticsearch B.V. under one or more contributor
++// license agreements. See the NOTICE file distributed with
++// this work for additional information regarding copyright
++// ownership. Elasticsearch B.V. 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.
++
++//go:build freebsd
++
++package freebsd
++
++import (
++ "encoding/json"
++ "github.com/stretchr/testify/assert"
++ "github.com/stretchr/testify/require"
++ "os/exec"
++ "strings"
++ "testing"
++ "time"
++)
++
++func TestArchitecture(t *testing.T) {
++ arch, err := architecture()
++ if err != nil {
++ t.Fatal(err)
++ }
++
++ assert.NotEmpty(t, arch)
++ assert.Regexp(t, `(amd64|i386|powerpc|arm(64)?|riscv|mips|sparc64|pc98)`, arch)
++}
++
++func TestBootTime(t *testing.T) {
++ bootTime, err := bootTime()
++ if err != nil {
++ t.Fatal(err)
++ }
++
++ bootDiff := time.Since(bootTime)
++ // t.Logf("bootTime in seconds: %#v", int64(bootDiff.Seconds()))
++
++ cmd := exec.Command("/usr/bin/uptime", "--libxo=json")
++ upcmd, err := cmd.Output()
++
++ if err != nil {
++ t.Fatal(err)
++ }
++
++ t.Logf(string(upcmd))
++
++ type UptimeOutput struct {
++ UptimeInformation struct {
++ Uptime int64 `json:"uptime"`
++ } `json:"uptime-information"`
++ }
++
++ var upInfo UptimeOutput
++ err = json.Unmarshal(upcmd, &upInfo)
++
++ if err != nil {
++ t.Fatal(err)
++ }
++
++ upsec := upInfo.UptimeInformation.Uptime
++ uptime := time.Duration(upsec * int64(time.Second))
++ // t.Logf("uptime in seconds: %#v", int64(uptime.Seconds()))
++
++ assert.InDelta(t, uptime, bootDiff, float64(5*time.Second))
++}
++
++func TestCPUStateTimes(t *testing.T) {
++ times, err := cpuStateTimes()
++ if err != nil {
++ t.Fatal(err)
++ }
++
++ require.NotNil(t, times)
++ assert.NotZero(t, *times)
++}
++
++func TestKernelVersion(t *testing.T) {
++ kernel, err := kernelVersion()
++ if err != nil {
++ t.Fatal(err)
++ }
++
++ // Retrieve currently running kernel version
++ cmd := exec.Command("/bin/freebsd-version", "-r")
++ fbsdout, err := cmd.Output()
++
++ if err != nil {
++ t.Fatal(err)
++ }
++
++ fbsdver := strings.TrimSuffix(string(fbsdout), "\n")
++
++ assert.NotEmpty(t, kernel)
++ assert.EqualValues(t, kernel, fbsdver)
++}
++
++func TestMachineID(t *testing.T) {
++ machineID, err := machineID()
++ if err != nil {
++ t.Fatal(err)
++ }
++
++ assert.NotEmpty(t, machineID)
++ assert.Regexp(t, "^[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}$", machineID)
++}
++
++func TestOperatingSystem(t *testing.T) {
++ t.Run("freebsd", func(t *testing.T) {
++ os, err := operatingSystem()
++ if err != nil {
++ t.Fatal(err)
++ }
++ assert.Equal(t, "freebsd", os.Type)
++ assert.Equal(t, "freebsd", os.Family)
++ assert.Equal(t, "freebsd", os.Platform)
++ assert.Equal(t, "FreeBSD", os.Name)
++ assert.Regexp(t, `\d{1,2}\.\d{1,2}-(RELEASE|STABLE|CURRENT|RC[0-9]|ALPHA(\d{0,2})|BETA(\d{0,2}))(-p\d)?`, os.Version)
++ assert.Regexp(t, `\d{1,2}`, os.Major)
++ assert.Regexp(t, `\d{1,2}`, os.Minor)
++ assert.Regexp(t, `\d{1,2}`, os.Patch)
++ assert.Regexp(t, `(RELEASE|STABLE|CURRENT|RC[0-9]|ALPHA([0-9]{0,2})|BETA([0-9]{0,2}))`, os.Build)
++ t.Logf("%#v", os)
++ })
++}
+--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/ztypes_freebsd.go.orig 2026-04-30 16:18:17 UTC
++++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/ztypes_freebsd.go
+@@ -0,0 +1,39 @@
++// Licensed to Elasticsearch B.V. under one or more contributor
++// license agreements. See the NOTICE file distributed with
++// this work for additional information regarding copyright
++// ownership. Elasticsearch B.V. 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.
++
++// Code generated by cmd/cgo -godefs; and then patched up to fix
++// an alignment issue
++// cgo -godefs defs_freebsd.go
++
++package freebsd
++
++type kvmSwap struct {
++ Devname [32]int8
++ Used uint32
++ Total uint32
++ Flags int32
++ Reserved1 uint32
++ Reserved2 uint32
++}
++
++type clockInfo struct {
++ Hz int32
++ Tick int32
++ Spare int32
++ Stathz int32
++ Profhz int32
++}
+--- vendor/github.com/elastic/go-sysinfo/providers/shared/fqdn.go.orig 2026-04-30 16:18:09 UTC
++++ vendor/github.com/elastic/go-sysinfo/providers/shared/fqdn.go
+@@ -15,7 +15,7 @@
+ // specific language governing permissions and limitations
+ // under the License.
+
+-//go:build linux || darwin || aix
++//go:build linux || darwin || aix || freebsd
+
+ package shared
+
+--- vendor/github.com/elastic/go-sysinfo/system.go.orig 2026-04-30 16:18:09 UTC
++++ vendor/github.com/elastic/go-sysinfo/system.go
+@@ -26,6 +26,7 @@ import (
+ // Register host and process providers.
+ _ "github.com/elastic/go-sysinfo/providers/aix"
+ _ "github.com/elastic/go-sysinfo/providers/darwin"
++ _ "github.com/elastic/go-sysinfo/providers/freebsd"
+ _ "github.com/elastic/go-sysinfo/providers/linux"
+ _ "github.com/elastic/go-sysinfo/providers/windows"
+ )
diff --git a/sysutils/beats93/files/patch-heartbeat_heartbeat.yml b/sysutils/beats93/files/patch-heartbeat_heartbeat.yml
new file mode 100644
index 000000000000..78bab8dc4f9a
--- /dev/null
+++ b/sysutils/beats93/files/patch-heartbeat_heartbeat.yml
@@ -0,0 +1,11 @@
+--- heartbeat/heartbeat.yml.orig 2026-02-23 21:59:26 UTC
++++ heartbeat/heartbeat.yml
+@@ -13,7 +13,7 @@ heartbeat.config.monitors:
+ # of individual yaml files.
+ heartbeat.config.monitors:
+ # Directory + glob pattern to search for configuration files
+- path: ${path.config}/monitors.d/*.yml
++ path: ${path.config}/heartbeat.monitors.d/*.yml
+ # If enabled, heartbeat will periodically check the config.monitors path for changes
+ reload.enabled: false
+ # How often to check for changes
diff --git a/sysutils/beats93/files/patch-libbeat_autodiscover_providers_docker_config.go b/sysutils/beats93/files/patch-libbeat_autodiscover_providers_docker_config.go
new file mode 100644
index 000000000000..ebd3c6ae0942
--- /dev/null
+++ b/sysutils/beats93/files/patch-libbeat_autodiscover_providers_docker_config.go
@@ -0,0 +1,11 @@
+--- libbeat/autodiscover/providers/docker/config.go.orig 2026-02-23 21:59:26 UTC
++++ libbeat/autodiscover/providers/docker/config.go
+@@ -15,7 +15,7 @@
+ // specific language governing permissions and limitations
+ // under the License.
+
+-//go:build linux || darwin || windows
++//go:build linux || darwin || windows || freebsd
+
+ package docker
+
diff --git a/sysutils/beats93/files/patch-libbeat_autodiscover_providers_docker_docker.go b/sysutils/beats93/files/patch-libbeat_autodiscover_providers_docker_docker.go
new file mode 100644
index 000000000000..742bfc1be1c7
--- /dev/null
+++ b/sysutils/beats93/files/patch-libbeat_autodiscover_providers_docker_docker.go
@@ -0,0 +1,20 @@
+--- libbeat/autodiscover/providers/docker/docker.go.orig 2026-02-23 21:59:26 UTC
++++ libbeat/autodiscover/providers/docker/docker.go
+@@ -15,7 +15,7 @@
+ // specific language governing permissions and limitations
+ // under the License.
+
+-//go:build linux || darwin || windows
++//go:build linux || darwin || windows || freebsd
+
+ package docker
+
+@@ -32,7 +32,7 @@ import (
+ "github.com/elastic/beats/v7/libbeat/common"
+
+ "github.com/elastic/elastic-agent-autodiscover/bus"
+- "github.com/elastic/elastic-agent-autodiscover/docker"
++ docker "github.com/elastic/elastic-agent-autodiscover/docker"
+ "github.com/elastic/elastic-agent-autodiscover/utils"
+ "github.com/elastic/elastic-agent-libs/config"
+ "github.com/elastic/elastic-agent-libs/keystore"
diff --git a/sysutils/beats93/files/patch-libbeat_autodiscover_providers_kubernetes_config.go b/sysutils/beats93/files/patch-libbeat_autodiscover_providers_kubernetes_config.go
new file mode 100644
index 000000000000..8c19d9aa2fec
--- /dev/null
+++ b/sysutils/beats93/files/patch-libbeat_autodiscover_providers_kubernetes_config.go
@@ -0,0 +1,11 @@
+--- libbeat/autodiscover/providers/kubernetes/config.go.orig 2026-02-23 21:59:26 UTC
++++ libbeat/autodiscover/providers/kubernetes/config.go
+@@ -15,7 +15,7 @@
+ // specific language governing permissions and limitations
+ // under the License.
+
+-//go:build linux || darwin || windows
++//go:build linux || darwin || windows || freebsd
+
+ package kubernetes
+
diff --git a/sysutils/beats93/files/patch-libbeat_autodiscover_providers_kubernetes_kubernetes.go b/sysutils/beats93/files/patch-libbeat_autodiscover_providers_kubernetes_kubernetes.go
new file mode 100644
index 000000000000..6b7c90fc4e73
--- /dev/null
+++ b/sysutils/beats93/files/patch-libbeat_autodiscover_providers_kubernetes_kubernetes.go
@@ -0,0 +1,11 @@
+--- libbeat/autodiscover/providers/kubernetes/kubernetes.go.orig 2026-02-23 21:59:26 UTC
++++ libbeat/autodiscover/providers/kubernetes/kubernetes.go
+@@ -15,7 +15,7 @@
+ // specific language governing permissions and limitations
+ // under the License.
+
+-//go:build linux || darwin || windows
++//go:build linux || darwin || windows || freebsd
+
+ package kubernetes
+
diff --git a/sysutils/beats93/files/patch-libbeat_scripts_Makefile b/sysutils/beats93/files/patch-libbeat_scripts_Makefile
new file mode 100644
index 000000000000..a84103ea085d
--- /dev/null
+++ b/sysutils/beats93/files/patch-libbeat_scripts_Makefile
@@ -0,0 +1,26 @@
+--- libbeat/scripts/Makefile.orig 2026-02-23 21:59:26 UTC
++++ libbeat/scripts/Makefile
+@@ -47,7 +47,7 @@ GOPACKAGES_STRESSTESTS=$(shell find . -type d \( -name
+ GOFILES_NOVENDOR = $(shell find . -type f -name '*.go' -not -path "*/vendor/*" 2>/dev/null)
+ GOFILES_ALL = $(GOFILES) $(shell find $(ES_BEATS) -type f -name '*.go' 2>/dev/null)
+ GOPACKAGES_STRESSTESTS=$(shell find . -type d \( -name "stress" \) 2>/dev/null)
+-SHELL=bash
++SHELL=sh
+ ES_HOST?=elasticsearch
+ ES_PORT?=9200
+ ES_USER?=beats
+@@ -336,12 +336,12 @@ update: python-env fields collect config ## @build Upd
+ update: python-env fields collect config ## @build Update expects the most recent version of libbeat in the GOPATH
+ @echo "Updating generated files for ${BEAT_NAME}"
+
+-ifneq ($(shell [[ $(BEAT_NAME) == libbeat || $(BEAT_NAME) == metricbeat ]] && echo true ),true)
++ifneq ($(shell [[ $(BEAT_NAME) = libbeat || $(BEAT_NAME) = metricbeat ]] && echo true ),true)
+ mkdir -p include
+ go run ${INSTALL_FLAG} ${ES_BEATS}/dev-tools/cmd/asset/asset.go -license $(LICENSE) -pkg include -in fields.yml -out include/fields.go $(BEAT_NAME)
+ endif
+
+-ifneq ($(shell [[ $(BEAT_NAME) == libbeat || $(BEAT_NAME) == metricbeat ]] && echo true ),true)
++ifneq ($(shell [[ $(BEAT_NAME) = libbeat || $(BEAT_NAME) = metricbeat ]] && echo true ),true)
+ @# Update docs
+ @mkdir -p docs
+ @${PYTHON_ENV_EXE} ${ES_BEATS}/libbeat/scripts/generate_fields_docs.py $(PWD)/fields.yml ${BEAT_NAME} ${ES_BEATS} --output_path $(ES_BEATS)/docs/reference/${BEAT_NAME}
diff --git a/sysutils/beats93/files/patch-metricbeat_metricbeat.reference.yml b/sysutils/beats93/files/patch-metricbeat_metricbeat.reference.yml
new file mode 100644
index 000000000000..c1313fe019b0
--- /dev/null
+++ b/sysutils/beats93/files/patch-metricbeat_metricbeat.reference.yml
@@ -0,0 +1,20 @@
+--- metricbeat/metricbeat.reference.yml.orig 2026-02-23 21:59:26 UTC
++++ metricbeat/metricbeat.reference.yml
+@@ -14,7 +14,7 @@ metricbeat.config.modules:
+ metricbeat.config.modules:
+
+ # Glob pattern for configuration reloading
+- path: ${path.config}/modules.d/*.yml
++ path: ${path.config}/metricbeat.modules.d/*.yml
+
+ # Period on which files under path should be checked for changes
+ reload.period: 10s
+@@ -2218,7 +2218,7 @@ output.elasticsearch:
+
+ # The directory from where to read the dashboards. The default is the `kibana`
+ # folder in the home path.
+-#setup.dashboards.directory: ${path.home}/kibana
++#setup.dashboards.directory: %%DATADIR%%/metricbeat/kibana
+
+ # The URL from where to download the dashboard archive. It is used instead of
+ # the directory if it has a value.
diff --git a/sysutils/beats93/files/patch-metricbeat_metricbeat.yml b/sysutils/beats93/files/patch-metricbeat_metricbeat.yml
new file mode 100644
index 000000000000..7c86bbed406e
--- /dev/null
+++ b/sysutils/beats93/files/patch-metricbeat_metricbeat.yml
@@ -0,0 +1,33 @@
+--- metricbeat/metricbeat.yml.orig 2026-02-23 21:59:26 UTC
++++ metricbeat/metricbeat.yml
+@@ -11,7 +11,7 @@ metricbeat.config.modules:
+
+ metricbeat.config.modules:
+ # Glob pattern for configuration loading
+- path: ${path.config}/modules.d/*.yml
++ path: ${path.config}/metricbeat.modules.d/*.yml
+
+ # Set to true to enable config reloading
+ reload.enabled: false
+@@ -54,6 +54,10 @@ setup.template.settings:
+ # website.
+ #setup.dashboards.url:
+
++# The directory from where to read the dashboards. The default is the `kibana`
++# folder in the home path.
++#setup.dashboards.directory: %%DATADIR%%/metricbeat/kibana
++
+ # =================================== Kibana ===================================
+
+ # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
+@@ -127,8 +131,8 @@ processors:
+ processors:
+ - add_host_metadata: ~
+ - add_cloud_metadata: ~
+- - add_docker_metadata: ~
+- - add_kubernetes_metadata: ~
++# - add_docker_metadata: ~
++# - add_kubernetes_metadata: ~
+
+
+ # ================================== Logging ===================================
diff --git a/sysutils/beats93/files/patch-packetbeat_packetbeat.reference.yml b/sysutils/beats93/files/patch-packetbeat_packetbeat.reference.yml
new file mode 100644
index 000000000000..c4e04917c7c1
--- /dev/null
+++ b/sysutils/beats93/files/patch-packetbeat_packetbeat.reference.yml
@@ -0,0 +1,11 @@
+--- packetbeat/packetbeat.reference.yml.orig 2026-02-23 21:59:26 UTC
++++ packetbeat/packetbeat.reference.yml
+@@ -1718,7 +1718,7 @@ output.elasticsearch:
+
+ # The directory from where to read the dashboards. The default is the `kibana`
+ # folder in the home path.
+-#setup.dashboards.directory: ${path.home}/kibana
++#setup.dashboards.directory: %%DATADIR%%/packetbeat/kibana
+
+ # The URL from where to download the dashboard archive. It is used instead of
+ # the directory if it has a value.
diff --git a/sysutils/beats93/files/patch-packetbeat_packetbeat.yml b/sysutils/beats93/files/patch-packetbeat_packetbeat.yml
new file mode 100644
index 000000000000..2490eefacc00
--- /dev/null
+++ b/sysutils/beats93/files/patch-packetbeat_packetbeat.yml
@@ -0,0 +1,23 @@
+--- packetbeat/packetbeat.yml.orig 2026-02-23 21:59:26 UTC
++++ packetbeat/packetbeat.yml
+@@ -25,7 +25,8 @@
+ # internal_networks:
+ # - private
+ #
+-packetbeat.interfaces.device: any
++# On FreeBSD, you must specify particular interface to sniff on
++packetbeat.interfaces.device: em0
+
+ # Specify the amount of time between polling for changes in the default
+ # route. This option is only used when one of the default route devices
+@@ -173,6 +174,10 @@ setup.template.settings:
+ # versions, this URL points to the dashboard archive on the artifacts.elastic.co
+ # website.
+ #setup.dashboards.url:
++
++# The directory from where to read the dashboards. The default is the `kibana`
++# folder in the home path.
++#setup.dashboards.directory: %%DATADIR%%/packetbeat/kibana
+
+ # =================================== Kibana ===================================
+
diff --git a/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-autodiscover_docker_client.go b/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-autodiscover_docker_client.go
new file mode 100644
index 000000000000..c2e25aab9f45
--- /dev/null
+++ b/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-autodiscover_docker_client.go
@@ -0,0 +1,13 @@
+--- vendor/github.com/elastic/elastic-agent-autodiscover/docker/client.go.orig 2026-03-16 23:39:27 UTC
++++ vendor/github.com/elastic/elastic-agent-autodiscover/docker/client.go
+@@ -15,8 +15,8 @@
+ // specific language governing permissions and limitations
+ // under the License.
+
+-//go:build linux || darwin || windows
+-// +build linux darwin windows
++//go:build linux || darwin || windows || freebsd
++// +build linux darwin windows freebsd
+
+ package docker
+
diff --git a/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-autodiscover_docker_watcher.go b/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-autodiscover_docker_watcher.go
new file mode 100644
index 000000000000..6797930ceb36
--- /dev/null
+++ b/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-autodiscover_docker_watcher.go
@@ -0,0 +1,13 @@
+--- vendor/github.com/elastic/elastic-agent-autodiscover/docker/watcher.go.orig 2026-03-16 23:39:27 UTC
++++ vendor/github.com/elastic/elastic-agent-autodiscover/docker/watcher.go
+@@ -15,8 +15,8 @@
+ // specific language governing permissions and limitations
+ // under the License.
+
+-//go:build linux || darwin || windows
+-// +build linux darwin windows
++//go:build linux || darwin || windows || freebsd
++// +build linux darwin windows freebsd
+
+ package docker
+
diff --git a/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__freebsd.go b/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__freebsd.go
new file mode 100644
index 000000000000..90f331ec5129
--- /dev/null
+++ b/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__freebsd.go
@@ -0,0 +1,10 @@
+--- vendor/github.com/elastic/elastic-agent-system-metrics/metric/cpu/metrics_freebsd.go.orig 2026-03-16 23:39:28 UTC
++++ vendor/github.com/elastic/elastic-agent-system-metrics/metric/cpu/metrics_freebsd.go
+@@ -56,3 +56,7 @@ func parseCPULine(line string) (CPU, error) {
+
+ return cpuData, errors.Join(errs...)
+ }
++
++func scanCPUInfoFile(scanner *bufio.Scanner) ([]CPUInfo, error) {
++ return cpuinfoScanner(scanner)
++}
diff --git a/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__procfs__common.go b/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__procfs__common.go
new file mode 100644
index 000000000000..983ab9dbac05
--- /dev/null
+++ b/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__procfs__common.go
@@ -0,0 +1,20 @@
+--- vendor/github.com/elastic/elastic-agent-system-metrics/metric/cpu/metrics_procfs_common.go.orig 2026-03-16 23:39:28 UTC
++++ vendor/github.com/elastic/elastic-agent-system-metrics/metric/cpu/metrics_procfs_common.go
+@@ -31,7 +31,7 @@ func Get(m *Monitor) (CPUMetrics, error) {
+ func Get(m *Monitor) (CPUMetrics, error) {
+ procfs := m.Hostfs
+
+- path := procfs.ResolveHostFS("/proc/stat")
++ path := procfs.ResolveHostFS("/compat/linux/proc/stat")
+ fd, err := os.Open(path)
+ defer func() {
+ _ = fd.Close()
+@@ -45,7 +45,7 @@ func Get(m *Monitor) (CPUMetrics, error) {
+ return CPUMetrics{}, fmt.Errorf("scanning stat file: %w", err)
+ }
+
+- cpuInfoPath := procfs.ResolveHostFS("/proc/cpuinfo")
++ cpuInfoPath := procfs.ResolveHostFS("/compat/linux/proc/cpuinfo")
+ cpuInfoFd, err := os.Open(cpuInfoPath)
+ if err != nil {
+ return CPUMetrics{}, fmt.Errorf("opening '%s': %w", cpuInfoPath, err)
diff --git a/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_system_filesystem_filesystem__unix.go b/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_system_filesystem_filesystem__unix.go
new file mode 100644
index 000000000000..0ca0296af848
--- /dev/null
+++ b/sysutils/beats93/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_system_filesystem_filesystem__unix.go
@@ -0,0 +1,14 @@
+--- vendor/github.com/elastic/elastic-agent-system-metrics/metric/system/filesystem/filesystem_unix.go.orig 2026-03-16 23:39:28 UTC
++++ vendor/github.com/elastic/elastic-agent-system-metrics/metric/system/filesystem/filesystem_unix.go
+@@ -36,9 +36,9 @@ func (fs *FSStat) GetUsage() error {
+
+ fs.Total = opt.UintWith(stat.Blocks).MultUint64OrNone(uint64(stat.Bsize))
+ fs.Free = opt.UintWith(stat.Bfree).MultUint64OrNone(uint64(stat.Bsize))
+- fs.Avail = opt.UintWith(stat.Bavail).MultUint64OrNone(uint64(stat.Bsize))
++ fs.Avail = opt.UintWith(uint64(stat.Bavail)).MultUint64OrNone(uint64(stat.Bsize))
+ fs.Files = opt.UintWith(stat.Files)
+- fs.FreeFiles = opt.UintWith(stat.Ffree)
++ fs.FreeFiles = opt.UintWith(uint64(stat.Ffree))
+
+ fs.fillMetrics()
+
diff --git a/sysutils/beats93/files/patch-vendor_modules.txt b/sysutils/beats93/files/patch-vendor_modules.txt
new file mode 100644
index 000000000000..cb10374bf864
--- /dev/null
+++ b/sysutils/beats93/files/patch-vendor_modules.txt
@@ -0,0 +1,10 @@
+--- vendor/modules.txt.orig 2026-03-16 00:00:00 UTC
++++ vendor/modules.txt
+@@ -2021,6 +2021,7 @@ github.com/elastic/go-sysinfo/providers/darwin
+ github.com/elastic/go-sysinfo/internal/registry
+ github.com/elastic/go-sysinfo/providers/aix
+ github.com/elastic/go-sysinfo/providers/darwin
++github.com/elastic/go-sysinfo/providers/freebsd
+ github.com/elastic/go-sysinfo/providers/linux
+ github.com/elastic/go-sysinfo/providers/shared
+ github.com/elastic/go-sysinfo/providers/windows
diff --git a/sysutils/beats93/files/pkg-message.in b/sysutils/beats93/files/pkg-message.in
new file mode 100644
index 000000000000..8f59c61118ca
--- /dev/null
+++ b/sysutils/beats93/files/pkg-message.in
@@ -0,0 +1,10 @@
+[
+{ type: install
+ message: <<EOM
+The modules.d and monitors.d files are now installed into
+%%EXAMPLESDIR%%
+
+See UPDATING file in ports top level directory for list of breaking changes.
+EOM
+}
+]
diff --git a/sysutils/beats93/pkg-descr b/sysutils/beats93/pkg-descr
new file mode 100644
index 000000000000..d370eec713ed
--- /dev/null
+++ b/sysutils/beats93/pkg-descr
@@ -0,0 +1,18 @@
+Beats is the platform for building lightweight, open source data
+shippers for many types of operational data you want to enrich with
+Logstash, search and analyze in Elasticsearch, and visualize in Kibana.
+Whether you're interested in log files, infrastructure metrics, network
+packets, or any other type of data, Beats serves as the foundation for
+keeping a beat on your data.
+
+Filebeat is a lightweight, open source shipper for log file data. As the
+next-generation Logstash Forwarder, Filebeat tails logs and quickly
+sends this information to Logstash for further parsing and enrichment or
+to Elasticsearch for centralized storage and analysis.
+
+Metricbeat Collect metrics from your systems and services. From CPU to memory,
+Redis to Nginx, and much more, Metricbeat is a lightweight way to send system
+and service statistics.
+
+Packetbeat is a lightweight network packet analyzer that sends data to Logstash
+or Elasticsearch.
diff --git a/sysutils/beats93/pkg-plist b/sysutils/beats93/pkg-plist
new file mode 100644
index 000000000000..5710ac7d1364
--- /dev/null
+++ b/sysutils/beats93/pkg-plist
@@ -0,0 +1,21 @@
+%%AUDITBEAT%%sbin/auditbeat
+%%AUDITBEAT%%%%ETCDIR%%/auditbeat.yml.reference
+%%AUDITBEAT%%@sample %%ETCDIR%%/auditbeat.yml.sample
+%%AUDITBEAT%%@dir /var/db/beats/auditbeat
+%%FILEBEAT%%sbin/filebeat
+%%FILEBEAT%%%%ETCDIR%%/filebeat.yml.reference
+%%FILEBEAT%%@sample %%ETCDIR%%/filebeat.yml.sample
+%%FILEBEAT%%@dir /var/db/beats/filebeat
+%%HEARTBEAT%%sbin/heartbeat
+%%HEARTBEAT%%%%ETCDIR%%/heartbeat.yml.reference
+%%HEARTBEAT%%@sample %%ETCDIR%%/heartbeat.yml.sample
+%%HEARTBEAT%%@dir /var/db/beats/heartbeat
+%%METRICBEAT%%%%ETCDIR%%/metricbeat.yml.reference
+%%METRICBEAT%%@sample %%ETCDIR%%/metricbeat.yml.sample
+%%METRICBEAT%%sbin/metricbeat
+%%METRICBEAT%%@dir /var/db/beats/metricbeat
+%%PACKETBEAT%%sbin/packetbeat
+%%PACKETBEAT%%%%ETCDIR%%/packetbeat.yml.reference
+%%PACKETBEAT%%@sample %%ETCDIR%%/packetbeat.yml.sample
+%%PACKETBEAT%%@dir /var/db/beats/packetbeat
+@dir /var/db/beats