diff --git a/sysutils/beats8/Makefile b/sysutils/beats8/Makefile index 5adb4b4a34b3..704dd04b6ded 100644 --- a/sysutils/beats8/Makefile +++ b/sysutils/beats8/Makefile @@ -1,133 +1,143 @@ PORTNAME= beats DISTVERSIONPREFIX= v -DISTVERSION= 8.14.3 -PORTREVISION= 17 +DISTVERSION= 8.19.12 CATEGORIES= sysutils MASTER_SITES= https://raw.githubusercontent.com/${GH_ACCOUNT}/${GH_PROJECT}/${DISTVERSIONFULL}/:gomod -PKGNAMESUFFIX?= 8 +PKGNAMESUFFIX= 8 DISTFILES= go.mod:gomod MAINTAINER= elastic@FreeBSD.org -COMMENT= Send logs, network, metrics and heartbeat to elasticsearch or logstash +COMMENT= Send logs, network, metrics and heartbeat to Elasticsearch or Logstash (${DISTVERSION:R: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:C,\./,,g} +USE_RC_SUBR= ${GO_TARGET:S,./,,g} -GO_MODULE= github.com/elastic/beats/v8 +GO_MODULE= github.com/elastic/beats/v7 CGO_CFLAGS= -I. CGO_LDFLAGS= -L. -MAKE_ENV+= GOBUILD_FLAGS="-mod=vendor" +MAKE_ENV= GOBUILD_FLAGS="-mod=vendor" -CONFLICTS= beats6 beats7 beats9 +CONFLICTS= ${PORTNAME}9* PORTSCOUT= limit:^8 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 +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 +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 +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 +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 +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 post-patch: - ${REINPLACE_CMD} -e "s|%%BEATSVERSION%%|v${PORTVERSION}|g" ${WRKSRC}/dev-tools/mage/settings.go -.for BEATMOD in ${GO_TARGET:C,\./,,g} + ${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:C,^\./,,g} - ${MKDIR} ${STAGEDIR}/var/db/beats/${BEATMOD} && \ +.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 + ${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 diff --git a/sysutils/beats8/distinfo b/sysutils/beats8/distinfo index 35b506baf697..6580ddda9af5 100644 --- a/sysutils/beats8/distinfo +++ b/sysutils/beats8/distinfo @@ -1,15 +1,15 @@ -TIMESTAMP = 1721561711 -SHA256 (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/go.mod) = 5ac53d72ec047685257e305055a61c0fe58dd64fa4809401bca4e9cd820765d1 -SIZE (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/go.mod) = 22285 -SHA256 (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/auditbeat-8.14.3-darwin-x86_64.tar.gz) = ab2ed29e547dcac6f85d73738a29d3133288d25057c4b16e96ea0c8d2df1e179 -SIZE (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/auditbeat-8.14.3-darwin-x86_64.tar.gz) = 29504818 -SHA256 (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/filebeat-8.14.3-darwin-x86_64.tar.gz) = 40f1b913eaede43afcf73cb669b4db57f98f1147f52fda7bfee0752eb0325651 -SIZE (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/filebeat-8.14.3-darwin-x86_64.tar.gz) = 44226004 -SHA256 (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/heartbeat-8.14.3-darwin-x86_64.tar.gz) = 5b9adf542af50dfc3f0766cd79bca0379c9c7675e81c451d910d27b5fe6d0a53 -SIZE (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/heartbeat-8.14.3-darwin-x86_64.tar.gz) = 29600533 -SHA256 (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/metricbeat-8.14.3-darwin-x86_64.tar.gz) = f79e4bc722b1e97025dfca427923c975539efe268686d7b53af75b758f573b87 -SIZE (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/metricbeat-8.14.3-darwin-x86_64.tar.gz) = 47395194 -SHA256 (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/packetbeat-8.14.3-darwin-x86_64.tar.gz) = 88fca4b5c955a6bba3a4fa28bff5faeda1676c7e5354679e4ce6be8dc4d87265 -SIZE (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/packetbeat-8.14.3-darwin-x86_64.tar.gz) = 30766046 -SHA256 (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/elastic-beats-v8.14.3_GH0.tar.gz) = 146fcd1d7a9ea951e362662c9d43bfd65bbdfad3e58dc315573bd6e62065e8fe -SIZE (go/sysutils_beats8/elastic-beats-v8.14.3_GH0/elastic-beats-v8.14.3_GH0.tar.gz) = 112258023 +TIMESTAMP = 1773063769 +SHA256 (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/go.mod) = 40e40154944293b310ed9171b9de6be9380f0f81127e3a4f20321821d76672b9 +SIZE (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/go.mod) = 28836 +SHA256 (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/auditbeat-8.19.12-darwin-x86_64.tar.gz) = fc7a06722eb8ab4fae9d9954ec4bf59522fa95c9f52f86ad346c8c20009db48b +SIZE (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/auditbeat-8.19.12-darwin-x86_64.tar.gz) = 35814502 +SHA256 (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/filebeat-8.19.12-darwin-x86_64.tar.gz) = bd6caaa9d347b951db0f277c136f49df88c34c978fca31cabbd298d459992cb3 +SIZE (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/filebeat-8.19.12-darwin-x86_64.tar.gz) = 55685672 +SHA256 (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/heartbeat-8.19.12-darwin-x86_64.tar.gz) = 7bc769ce65a62072d70be1dbed0f3932b895b785ce832f49f5fc79a1e291f942 +SIZE (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/heartbeat-8.19.12-darwin-x86_64.tar.gz) = 35784404 +SHA256 (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/metricbeat-8.19.12-darwin-x86_64.tar.gz) = cfd313759ad554b4f518ed6dcb222793c8d21ea67be0616aec270f3f8fc5fe21 +SIZE (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/metricbeat-8.19.12-darwin-x86_64.tar.gz) = 59721874 +SHA256 (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/packetbeat-8.19.12-darwin-x86_64.tar.gz) = 21581ca09c0b9403b2cf3731c449b87c66bb3d87998bbe057b8c312d5ea70973 +SIZE (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/packetbeat-8.19.12-darwin-x86_64.tar.gz) = 36808663 +SHA256 (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/elastic-beats-v8.19.12_GH0.tar.gz) = 8ca35b31098cbac291a88a0086685ba40957d3f1606ba6dc4b60242d2b69243f +SIZE (go/sysutils_beats8/elastic-beats-v8.19.12_GH0/elastic-beats-v8.19.12_GH0.tar.gz) = 104228947 diff --git a/sysutils/beats8/files/auditbeat.in b/sysutils/beats8/files/auditbeat.in index 4091c69b6182..59f2443115cd 100644 --- a/sysutils/beats8/files/auditbeat.in +++ b/sysutils/beats8/files/auditbeat.in @@ -1,50 +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: ${PREFIX}/etc/beats +# Default: %%ETCDIR%% # auditbeat_conffile (str): auditbeat configuration file -# relative to ${auditbeat_conf} +# 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/beats8/files/filebeat.in b/sysutils/beats8/files/filebeat.in index 8ae08af5b398..824c25222d38 100644 --- a/sysutils/beats8/files/filebeat.in +++ b/sysutils/beats8/files/filebeat.in @@ -1,43 +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: ${PREFIX}/etc/beats +# Default: %%ETCDIR%% # filebeat_conffile (str): filebeat configuration file -# relative to ${filebeat_conf} +# 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/beats8/files/heartbeat.in b/sysutils/beats8/files/heartbeat.in index d99374ab011c..d89b13328b28 100644 --- a/sysutils/beats8/files/heartbeat.in +++ b/sysutils/beats8/files/heartbeat.in @@ -1,44 +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: ${PREFIX}/etc/beats +# Default: %%ETCDIR%% # heartbeat_conffile (str): heartbeat configuration file -# relative to ${heartbeat_conf} +# 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/beats8/files/metricbeat.in b/sysutils/beats8/files/metricbeat.in index 270966c4f669..66ba9615d2ec 100644 --- a/sysutils/beats8/files/metricbeat.in +++ b/sysutils/beats8/files/metricbeat.in @@ -1,51 +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: ${PREFIX}/etc/beats +# Default: %%ETCDIR%% # metricbeat_conffile (str): metricbeat configuration file -# relative to ${metricbeat_conf} +# 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/beats8/files/packetbeat.in b/sysutils/beats8/files/packetbeat.in index 4dc21856c49a..2541bdcc9eb7 100644 --- a/sysutils/beats8/files/packetbeat.in +++ b/sysutils/beats8/files/packetbeat.in @@ -1,43 +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: ${PREFIX}/etc/beats +# Default: %%ETCDIR%% # packetbeat_conffile (str): packetbeat configuration file -# relative to ${packetbeat_conf} +# 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/beats8/files/patch-auditbeat_auditbeat.reference.yml b/sysutils/beats8/files/patch-auditbeat_auditbeat.reference.yml index 3761774a00eb..04ef963d9642 100644 --- a/sysutils/beats8/files/patch-auditbeat_auditbeat.reference.yml +++ b/sysutils/beats8/files/patch-auditbeat_auditbeat.reference.yml @@ -1,20 +1,20 @@ ---- auditbeat/auditbeat.reference.yml.orig 2022-10-24 06:49:31 UTC +--- auditbeat/auditbeat.reference.yml.orig 2025-09-15 19:57:17 UTC +++ auditbeat/auditbeat.reference.yml -@@ -14,7 +14,7 @@ +@@ -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 -@@ -1133,7 +1133,7 @@ output.elasticsearch: +@@ -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 dashboards archive. It is used instead of + # 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/beats8/files/patch-auditbeat_auditbeat.yml b/sysutils/beats8/files/patch-auditbeat_auditbeat.yml index 20ee2d0016a5..b9c74affaee6 100644 --- a/sysutils/beats8/files/patch-auditbeat_auditbeat.yml +++ b/sysutils/beats8/files/patch-auditbeat_auditbeat.yml @@ -1,13 +1,13 @@ ---- auditbeat/auditbeat.yml.orig 2022-10-24 06:49:31 UTC +--- auditbeat/auditbeat.yml.orig 2025-09-15 19:57:17 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/beats8/files/patch-dev-tools_mage_settings.go b/sysutils/beats8/files/patch-dev-tools_mage_settings.go index 86e470f90315..fff0c065e200 100644 --- a/sysutils/beats8/files/patch-dev-tools_mage_settings.go +++ b/sysutils/beats8/files/patch-dev-tools_mage_settings.go @@ -1,20 +1,20 @@ ---- dev-tools/mage/settings.go.orig 2024-07-09 00:00:36.000000000 +0200 -+++ dev-tools/mage/settings.go 2024-07-13 21:26:19.383768000 +0200 -@@ -31,7 +31,6 @@ +--- dev-tools/mage/settings.go.orig 2025-09-15 19:57:17 UTC ++++ dev-tools/mage/settings.go +@@ -31,7 +31,6 @@ import ( "sync" "time" - "github.com/magefile/mage/sh" - "golang.org/x/tools/go/vcs" - - "github.com/elastic/beats/v7/dev-tools/mage/gotool" -@@ -251,7 +250,8 @@ + "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 = "v8.14.3" ++ commitHash = "%%BEATSVERSION%%" }) return commitHash, err } diff --git a/sysutils/beats8/files/patch-filebeat_filebeat.reference.yml b/sysutils/beats8/files/patch-filebeat_filebeat.reference.yml index 71410a09ec92..33dc3a22fd11 100644 --- a/sysutils/beats8/files/patch-filebeat_filebeat.reference.yml +++ b/sysutils/beats8/files/patch-filebeat_filebeat.reference.yml @@ -1,26 +1,26 @@ ---- filebeat/filebeat.reference.yml.orig 2022-09-27 13:19:27 UTC +--- filebeat/filebeat.reference.yml.orig 2025-09-15 19:57:17 UTC +++ filebeat/filebeat.reference.yml -@@ -1241,12 +1241,12 @@ filebeat.inputs: +@@ -1329,12 +1329,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 -@@ -2266,7 +2266,7 @@ output.elasticsearch: +@@ -2408,7 +2408,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 dashboards archive. It is used instead of + # 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/beats8/files/patch-filebeat_filebeat.yml b/sysutils/beats8/files/patch-filebeat_filebeat.yml index 6630fa8d04d6..c9a078cc6ffb 100644 --- a/sysutils/beats8/files/patch-filebeat_filebeat.yml +++ b/sysutils/beats8/files/patch-filebeat_filebeat.yml @@ -1,33 +1,33 @@ ---- filebeat/filebeat.yml.orig 2022-09-27 13:19:27 UTC +--- filebeat/filebeat.yml.orig 2025-09-15 19:57:17 UTC +++ filebeat/filebeat.yml -@@ -58,7 +58,7 @@ filebeat.inputs: +@@ -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 -@@ -101,6 +101,10 @@ setup.template.settings: +@@ -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. -@@ -168,8 +172,8 @@ processors: +@@ -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/beats8/files/patch-go-sysinfo b/sysutils/beats8/files/patch-go-sysinfo index 240a59633c38..2ac3e3daee55 100644 --- a/sysutils/beats8/files/patch-go-sysinfo +++ b/sysutils/beats8/files/patch-go-sysinfo @@ -1,1327 +1,1314 @@ -diff -urN vendor.orig/github.com/elastic/go-sysinfo/internal/cgo/disabled.go vendor/github.com/elastic/go-sysinfo/internal/cgo/disabled.go ---- vendor.orig/github.com/elastic/go-sysinfo/internal/cgo/disabled.go 1970-01-01 01:00:00.000000000 +0100 -+++ vendor/github.com/elastic/go-sysinfo/internal/cgo/disabled.go 2024-07-13 20:28:36.060882000 +0200 +--- vendor/github.com/elastic/go-sysinfo/internal/cgo/disabled.go.orig 2025-09-19 18:12: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 -diff -urN vendor.orig/github.com/elastic/go-sysinfo/internal/cgo/enabled.go vendor/github.com/elastic/go-sysinfo/internal/cgo/enabled.go ---- vendor.orig/github.com/elastic/go-sysinfo/internal/cgo/enabled.go 1970-01-01 01:00:00.000000000 +0100 -+++ vendor/github.com/elastic/go-sysinfo/internal/cgo/enabled.go 2024-07-13 20:28:36.060953000 +0200 +--- vendor/github.com/elastic/go-sysinfo/internal/cgo/enabled.go.orig 2025-09-19 18:12: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 -diff -urN vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/defs_freebsd.go vendor/github.com/elastic/go-sysinfo/providers/freebsd/defs_freebsd.go ---- vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/defs_freebsd.go 1970-01-01 01:00:00.000000000 +0100 -+++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/defs_freebsd.go 2024-07-13 20:28:36.065106000 +0200 +--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/defs_freebsd.go.orig 2025-09-19 18:12: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 +#include +#include +#include +*/ +import "C" + +type kvmSwap C.struct_kvm_swap + +type clockInfo C.struct_clockinfo -diff -urN vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/doc.go vendor/github.com/elastic/go-sysinfo/providers/freebsd/doc.go ---- vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/doc.go 1970-01-01 01:00:00.000000000 +0100 -+++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/doc.go 2024-07-13 20:28:36.065203000 +0200 +--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/doc.go.orig 2025-09-19 18:12: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" -diff -urN vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo.go vendor/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo.go ---- vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo.go 1970-01-01 01:00:00.000000000 +0100 -+++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo.go 2024-07-13 20:28:36.065317000 +0200 +--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo.go.orig 2025-09-19 18:12: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...) +} -diff -urN vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo_test.go vendor/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo_test.go ---- vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo_test.go 1970-01-01 01:00:00.000000000 +0100 -+++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo_test.go 2024-07-13 20:28:36.065385000 +0200 +--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/host_freebsd_cgo_test.go.orig 2025-09-19 18:12: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)) + }) +} -diff -urN vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/kvm_freebsd_cgo.go vendor/github.com/elastic/go-sysinfo/providers/freebsd/kvm_freebsd_cgo.go ---- vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/kvm_freebsd_cgo.go 1970-01-01 01:00:00.000000000 +0100 -+++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/kvm_freebsd_cgo.go 2024-07-13 20:28:36.065498000 +0200 +--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/kvm_freebsd_cgo.go.orig 2025-09-19 18:12: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 +#include +#include + +#include +#include +#include +*/ +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 +} -diff -urN vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/process_freebsd_cgo.go vendor/github.com/elastic/go-sysinfo/providers/freebsd/process_freebsd_cgo.go ---- vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/process_freebsd_cgo.go 1970-01-01 01:00:00.000000000 +0100 -+++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/process_freebsd_cgo.go 2024-07-13 20:28:36.065578000 +0200 +--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/process_freebsd_cgo.go.orig 2025-09-19 18:12: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 +#include +#include +#include +#include +#include +#include + +#include +#include + +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.ulong(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 +} -diff -urN vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd.go vendor/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd.go ---- vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd.go 1970-01-01 01:00:00.000000000 +0100 -+++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd.go 2024-07-13 20:28:36.065700000 +0200 +--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd.go.orig 2025-09-19 18:12: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(tv.Sec, tv.Usec*int64(time.Microsecond)) + 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) +} -diff -urN vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd_test.go vendor/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd_test.go ---- vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd_test.go 1970-01-01 01:00:00.000000000 +0100 -+++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd_test.go 2024-07-13 20:28:36.065808000 +0200 +--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/sysctl_freebsd_test.go.orig 2025-09-19 18:12: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) + }) +} -diff -urN vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/ztypes_freebsd.go vendor/github.com/elastic/go-sysinfo/providers/freebsd/ztypes_freebsd.go ---- vendor.orig/github.com/elastic/go-sysinfo/providers/freebsd/ztypes_freebsd.go 1970-01-01 01:00:00.000000000 +0100 -+++ vendor/github.com/elastic/go-sysinfo/providers/freebsd/ztypes_freebsd.go 2024-07-13 20:28:36.065887000 +0200 +--- vendor/github.com/elastic/go-sysinfo/providers/freebsd/ztypes_freebsd.go.orig 2025-09-19 18:12: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 +} -diff -urN vendor.orig/github.com/elastic/go-sysinfo/providers/shared/fqdn.go vendor/github.com/elastic/go-sysinfo/providers/shared/fqdn.go ---- vendor.orig/github.com/elastic/go-sysinfo/providers/shared/fqdn.go 2024-07-13 21:34:29.109657000 +0200 -+++ vendor/github.com/elastic/go-sysinfo/providers/shared/fqdn.go 2024-07-13 20:28:36.077420000 +0200 +--- vendor/github.com/elastic/go-sysinfo/providers/shared/fqdn.go.orig 2025-09-19 18:12:11 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 -diff -urN vendor.orig/github.com/elastic/go-sysinfo/system.go vendor/github.com/elastic/go-sysinfo/system.go ---- vendor.orig/github.com/elastic/go-sysinfo/system.go 2024-07-13 21:34:29.110051000 +0200 -+++ vendor/github.com/elastic/go-sysinfo/system.go 2024-07-13 20:28:36.079545000 +0200 -@@ -26,6 +26,7 @@ +--- vendor/github.com/elastic/go-sysinfo/system.go.orig 2025-09-19 18:12:11 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/beats8/files/patch-libbeat_autodiscover_providers_docker_config.go b/sysutils/beats8/files/patch-libbeat_autodiscover_providers_docker_config.go index f3c07f0ac593..e554c26110a0 100644 --- a/sysutils/beats8/files/patch-libbeat_autodiscover_providers_docker_config.go +++ b/sysutils/beats8/files/patch-libbeat_autodiscover_providers_docker_config.go @@ -1,11 +1,11 @@ ---- libbeat/autodiscover/providers/docker/config.go.orig 2024-07-09 00:00:36.000000000 +0200 -+++ libbeat/autodiscover/providers/docker/config.go 2024-07-13 21:38:12.739090000 +0200 +--- libbeat/autodiscover/providers/docker/config.go.orig 2025-09-15 19:57:17 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/beats8/files/patch-libbeat_autodiscover_providers_docker_docker.go b/sysutils/beats8/files/patch-libbeat_autodiscover_providers_docker_docker.go index 34dc07b07dc5..1ba78ac9207b 100644 --- a/sysutils/beats8/files/patch-libbeat_autodiscover_providers_docker_docker.go +++ b/sysutils/beats8/files/patch-libbeat_autodiscover_providers_docker_docker.go @@ -1,20 +1,20 @@ ---- libbeat/autodiscover/providers/docker/docker.go.orig 2024-07-09 00:00:36.000000000 +0200 -+++ libbeat/autodiscover/providers/docker/docker.go 2024-07-13 21:40:25.908849000 +0200 +--- libbeat/autodiscover/providers/docker/docker.go.orig 2025-09-15 19:57:17 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 @@ +@@ -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/beats8/files/patch-libbeat_autodiscover_providers_kubernetes_config.go b/sysutils/beats8/files/patch-libbeat_autodiscover_providers_kubernetes_config.go index d9a1743bfd87..d61cc99ec22f 100644 --- a/sysutils/beats8/files/patch-libbeat_autodiscover_providers_kubernetes_config.go +++ b/sysutils/beats8/files/patch-libbeat_autodiscover_providers_kubernetes_config.go @@ -1,11 +1,11 @@ ---- libbeat/autodiscover/providers/kubernetes/config.go.orig 2024-07-09 00:00:36.000000000 +0200 -+++ libbeat/autodiscover/providers/kubernetes/config.go 2024-07-13 21:42:32.799000000 +0200 +--- libbeat/autodiscover/providers/kubernetes/config.go.orig 2025-09-15 19:57:17 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/beats8/files/patch-libbeat_autodiscover_providers_kubernetes_kubernetes.go b/sysutils/beats8/files/patch-libbeat_autodiscover_providers_kubernetes_kubernetes.go index 8f446dd0f8eb..de1795f28db2 100644 --- a/sysutils/beats8/files/patch-libbeat_autodiscover_providers_kubernetes_kubernetes.go +++ b/sysutils/beats8/files/patch-libbeat_autodiscover_providers_kubernetes_kubernetes.go @@ -1,11 +1,11 @@ ---- libbeat/autodiscover/providers/kubernetes/kubernetes.go.orig 2024-07-13 21:44:01.984103000 +0200 -+++ libbeat/autodiscover/providers/kubernetes/kubernetes.go 2024-07-13 21:44:07.633470000 +0200 +--- libbeat/autodiscover/providers/kubernetes/kubernetes.go.orig 2025-09-15 19:57:17 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/beats8/files/patch-libbeat_scripts_Makefile b/sysutils/beats8/files/patch-libbeat_scripts_Makefile index f298adc0c9ad..e84469edfa3e 100644 --- a/sysutils/beats8/files/patch-libbeat_scripts_Makefile +++ b/sysutils/beats8/files/patch-libbeat_scripts_Makefile @@ -1,26 +1,26 @@ ---- libbeat/scripts/Makefile.orig 2024-07-09 00:00:36.000000000 +0200 -+++ libbeat/scripts/Makefile 2024-07-13 21:45:40.788621000 +0200 -@@ -47,7 +47,7 @@ +--- libbeat/scripts/Makefile.orig 2025-09-15 19:57:17 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 -@@ -352,12 +352,12 @@ +@@ -346,12 +346,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_TITLE} ${ES_BEATS} diff --git a/sysutils/beats8/files/patch-metricbeat_metricbeat.reference.yml b/sysutils/beats8/files/patch-metricbeat_metricbeat.reference.yml index 54e125f6af50..170a0e8a37f6 100644 --- a/sysutils/beats8/files/patch-metricbeat_metricbeat.reference.yml +++ b/sysutils/beats8/files/patch-metricbeat_metricbeat.reference.yml @@ -1,20 +1,20 @@ ---- metricbeat/metricbeat.reference.yml.orig 2022-09-27 13:19:27 UTC +--- metricbeat/metricbeat.reference.yml.orig 2025-09-15 19:57:17 UTC +++ metricbeat/metricbeat.reference.yml -@@ -14,7 +14,7 @@ +@@ -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 -@@ -2006,7 +2006,7 @@ output.elasticsearch: +@@ -2199,7 +2199,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 dashboards archive. It is used instead of + # 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/beats8/files/patch-metricbeat_metricbeat.yml b/sysutils/beats8/files/patch-metricbeat_metricbeat.yml index 0dcf745f9cfd..7a8524fee677 100644 --- a/sysutils/beats8/files/patch-metricbeat_metricbeat.yml +++ b/sysutils/beats8/files/patch-metricbeat_metricbeat.yml @@ -1,33 +1,33 @@ ---- metricbeat/metricbeat.yml.orig 2021-10-07 17:20:31 UTC +--- metricbeat/metricbeat.yml.orig 2025-09-15 19:57:17 UTC +++ metricbeat/metricbeat.yml -@@ -11,7 +11,7 @@ +@@ -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. -@@ -123,8 +127,8 @@ output.elasticsearch: +@@ -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/beats8/files/patch-packetbeat_packetbeat.reference.yml b/sysutils/beats8/files/patch-packetbeat_packetbeat.reference.yml index de6d99250123..665a35e9137b 100644 --- a/sysutils/beats8/files/patch-packetbeat_packetbeat.reference.yml +++ b/sysutils/beats8/files/patch-packetbeat_packetbeat.reference.yml @@ -1,11 +1,11 @@ ---- packetbeat/packetbeat.reference.yml.orig 2022-09-27 13:19:27 UTC +--- packetbeat/packetbeat.reference.yml.orig 2026-02-24 08:36:24 UTC +++ packetbeat/packetbeat.reference.yml -@@ -1634,7 +1634,7 @@ output.elasticsearch: +@@ -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 dashboards archive. It is used instead of + # 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/beats8/files/patch-packetbeat_packetbeat.yml b/sysutils/beats8/files/patch-packetbeat_packetbeat.yml index 0a3f15dfcbc9..3189a9f70662 100644 --- a/sysutils/beats8/files/patch-packetbeat_packetbeat.yml +++ b/sysutils/beats8/files/patch-packetbeat_packetbeat.yml @@ -1,23 +1,23 @@ ---- packetbeat/packetbeat.yml.orig 2022-10-24 06:49:31 UTC +--- packetbeat/packetbeat.yml.orig 2025-09-15 19:57:17 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/beats8/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__freebsd.go b/sysutils/beats8/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__freebsd.go index f8872e79e492..d9305bc9d551 100644 --- a/sysutils/beats8/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__freebsd.go +++ b/sysutils/beats8/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__freebsd.go @@ -1,10 +1,10 @@ ---- vendor/github.com/elastic/elastic-agent-system-metrics/metric/cpu/metrics_freebsd.go.orig 2022-11-25 21:56:24 UTC +--- vendor/github.com/elastic/elastic-agent-system-metrics/metric/cpu/metrics_freebsd.go.orig 2025-09-19 18:38:09 UTC +++ vendor/github.com/elastic/elastic-agent-system-metrics/metric/cpu/metrics_freebsd.go -@@ -57,3 +57,7 @@ func parseCPULine(line string) (CPU, error) { +@@ -56,3 +56,7 @@ func parseCPULine(line string) (CPU, error) { - return cpuData, errs.Err() + return cpuData, errors.Join(errs...) } + +func scanCPUInfoFile(scanner *bufio.Scanner) ([]CPUInfo, error) { + return cpuinfoScanner(scanner) +} diff --git a/sysutils/beats8/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__procfs__common.go b/sysutils/beats8/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__procfs__common.go index 1756133ba7a0..287667e0d23a 100644 --- a/sysutils/beats8/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__procfs__common.go +++ b/sysutils/beats8/files/patch-vendor_github.com_elastic_elastic-agent-system-metrics_metric_cpu_metrics__procfs__common.go @@ -1,20 +1,20 @@ ---- vendor/github.com/elastic/elastic-agent-system-metrics/metric/cpu/metrics_procfs_common.go.orig 2022-11-25 21:55:11 UTC +--- vendor/github.com/elastic/elastic-agent-system-metrics/metric/cpu/metrics_procfs_common.go.orig 2025-09-19 18:44:04 UTC +++ vendor/github.com/elastic/elastic-agent-system-metrics/metric/cpu/metrics_procfs_common.go -@@ -32,7 +32,7 @@ import ( +@@ -32,7 +32,7 @@ func Get(m *Monitor) (CPUMetrics, error) { + func Get(m *Monitor) (CPUMetrics, error) { + procfs := m.Hostfs - // Get returns a metrics object for CPU data - func Get(procfs resolve.Resolver) (CPUMetrics, error) { - path := procfs.ResolveHostFS("/proc/stat") + path := procfs.ResolveHostFS("/compat/linux/proc/stat") fd, err := os.Open(path) defer func() { _ = fd.Close() -@@ -46,7 +46,7 @@ func Get(procfs resolve.Resolver) (CPUMetrics, error) +@@ -46,7 +46,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/beats8/files/patch-vendor_github.com_godbus_dbus_transport__unixcred__freebsd.go b/sysutils/beats8/files/patch-vendor_github.com_godbus_dbus_transport__unixcred__freebsd.go deleted file mode 100644 index cbd82643efdf..000000000000 --- a/sysutils/beats8/files/patch-vendor_github.com_godbus_dbus_transport__unixcred__freebsd.go +++ /dev/null @@ -1,12 +0,0 @@ ---- vendor/github.com/godbus/dbus/v5/transport_unixcred_freebsd.go.orig 2021-08-05 12:40:38 UTC -+++ vendor/github.com/godbus/dbus/v5/transport_unixcred_freebsd.go -@@ -8,7 +8,8 @@ - package dbus - - /* --const int sizeofPtr = sizeof(void*); -+static const int sizeofPtr = sizeof(void*); -+#include - #define _WANT_UCRED - #include - */ diff --git a/sysutils/beats8/files/patch-vendor_github.com_insomniacslk_dhcp_dhcpv4_bindtodevice__bsd.go b/sysutils/beats8/files/patch-vendor_github.com_insomniacslk_dhcp_dhcpv4_bindtodevice__bsd.go deleted file mode 100644 index 9f3b27a9518c..000000000000 --- a/sysutils/beats8/files/patch-vendor_github.com_insomniacslk_dhcp_dhcpv4_bindtodevice__bsd.go +++ /dev/null @@ -1,22 +0,0 @@ ---- vendor/github.com/insomniacslk/dhcp/dhcpv4/bindtodevice_bsd.go.orig 2021-12-20 11:34:32 UTC -+++ vendor/github.com/insomniacslk/dhcp/dhcpv4/bindtodevice_bsd.go -@@ -0,0 +1,19 @@ -+//go:build freebsd || openbsd || netbsd -+// +build freebsd openbsd netbsd -+ -+package dhcpv4 -+ -+import ( -+ "net" -+ "syscall" -+) -+ -+// BindToInterface emulates linux's SO_BINDTODEVICE option for a socket by using -+// IP_RECVIF. -+func BindToInterface(fd int, ifname string) error { -+ iface, err := net.InterfaceByName(ifname) -+ if err != nil { -+ return err -+ } -+ return syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVIF, iface.Index) -+} diff --git a/sysutils/beats8/files/patch-vendor_modules.txt b/sysutils/beats8/files/patch-vendor_modules.txt new file mode 100644 index 000000000000..b7a9b36c8f7e --- /dev/null +++ b/sysutils/beats8/files/patch-vendor_modules.txt @@ -0,0 +1,10 @@ +--- vendor/modules.txt.orig 2026-03-16 00:00:00 UTC ++++ vendor/modules.txt +@@ -2005,6 +2005,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