No that we load MIB files at snmpd start-up chances that the sleep build
authormartijn <martijn@openbsd.org>
Thu, 8 Feb 2024 17:09:51 +0000 (17:09 +0000)
committermartijn <martijn@openbsd.org>
Thu, 8 Feb 2024 17:09:51 +0000 (17:09 +0000)
into the regress test don't suffice anymore for slow regress machines.
(Ab)use the agentx socket (which gets created after all the MIB files
have been parsed) to detect if snmpd is available. For now we poll at
0.1s intervals for a total of 100 tries.

found by and earlier diff tested by and OK anton@

regress/usr.bin/snmp/Makefile
regress/usr.sbin/snmpd/Makefile
regress/usr.sbin/snmpd/snmpd.sh

index a4c0f67..983efc2 100644 (file)
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.6 2023/11/06 09:46:04 martijn Exp $
+# $OpenBSD: Makefile,v 1.7 2024/02/08 17:09:51 martijn Exp $
 
 SNMP?=                 /usr/bin/snmp
 SNMPD?=                        /usr/sbin/snmpd -f ${.OBJDIR}/snmpd.conf
@@ -31,6 +31,7 @@ snmpd.conf: Makefile
        printf 'listen on $$listen6_addr snmpv1 snmpv2c snmpv3\n' >> snmpd.conf
        printf 'listen on tcp $$listen6_addr snmpv1 snmpv2c snmpv3\n' >> snmpd.conf
        printf 'listen on $$listen_addr notify snmpv1 snmpv2c snmpv3\n\n' >> snmpd.conf
+       printf 'agentx path "/tmp/agentx"\n\n' >> snmpd.conf
        printf 'read-only community public\n' >> snmpd.conf
        printf 'read-write community private\n' >> snmpd.conf
        printf 'trap community public\n\n' >> snmpd.conf
@@ -79,7 +80,19 @@ trap_output: Makefile
        chmod a+rw trap_output
 
 start: stop snmpd.conf traphandle.sh trap_output
+       rm -f /tmp/agentx 2>/dev/null
        ${SUDO} ${SNMPD}
+       @(i=0; \
+       while [ ! -S /tmp/agentx ]; do \
+               i=$$((i + 1)); \
+               [ $$i -eq 100 ] && ( \
+                       printf "%s\n" '${SUDO} pkill -xf "${SNMPD}"'; \
+                       printf "Failed to start snmpd\n" >&2; \
+                       ${SUDO} pkill -xf "${SNMPD}"; \
+                       exit 1; \
+               ); \
+               sleep 0.1; \
+       done;)
 
 stop:
        -${SUDO} pkill -xf "${SNMPD}"
index 63b0fc0..22bb422 100644 (file)
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.12 2023/11/20 10:34:21 martijn Exp $
+# $OpenBSD: Makefile,v 1.13 2024/02/08 17:09:51 martijn Exp $
 # Regress tests for snmpd
 
 PROG =                         snmpd_regress
@@ -261,8 +261,21 @@ transport: ${TRANSPORT_TARGETS}
 
 ${REGRESS_TARGETS}: snmpd_regress
 # Always start snmpd if it's not running
-       @pgrep -q snmpd || \
-           (printf "%s\n" "${SNMPD_START}"; ${SNMPD_START} sleep 0.5)
+       @pgrep -q snmpd || ( \
+               printf "%s\n" "${SNMPD_START}"; \
+               rm -f /tmp/agentx 2>/dev/null; \
+               ${SNMPD_START} \
+               i=0; \
+               while [ ! -S /tmp/agentx ]; do \
+                       i=$$((i + 1)); \
+                       [ $$i -eq 100 ] && ( \
+                               printf "Failed to start snmpd\n"; >&2 \
+                               ${SUDO} pkill -f ${SNMPD}; \
+                               exit 1; \
+                       ); \
+                       sleep 0.1; \
+               done \
+       )
        ./snmpd_regress ${SNMPD_REGRESS_FLAGS} $@
 # Make sure that snmpd hasn't crashed in the meantime.
        @sleep 0.01
index 29438e3..137d0f7 100644 (file)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# $OpenBSD: snmpd.sh,v 1.19 2023/11/04 09:42:17 martijn Exp $
+# $OpenBSD: snmpd.sh,v 1.20 2024/02/08 17:09:51 martijn Exp $
 #/*
 # * Copyright (c) Rob Pierce <rob@openbsd.org>
 # *
@@ -26,6 +26,8 @@ SLEEP=1
 PF[0]="disabled"
 PF[1]="enabled"
 
+STARTSOCK="/tmp/agentx"
+
 # This file will be creatred by traphandler.c as user _snmpd
 TMPFILE=$(mktemp -q /tmp/_snmpd_traptest.XXXXXX)
 
@@ -38,7 +40,30 @@ then
        exit 0
 fi
 
+snmpdstart() {
+       rm "${STARTSOCK}" >/dev/null 2>&1
+       (cd ${OBJDIR} && nohup snmpd -dvf ./snmpd.conf > snmpd.log 2>&1) &
+       i=0
+       # wait max ~10s
+       while [ ! -S "$STARTSOCK" ]; do
+               i=$((i + 1))
+               if [ $i -eq 100 ]; then
+                       echo "Failed to start snmpd" >&2
+                       snmpdstop
+                       fail
+               fi
+               sleep 0.1
+       done
+}
+
+snmpdstop() {
+       pkill snmpd
+       wait
+       rm -f "${STARTSOCK}" >/dev/null 2>&1
+}
+
 cleanup() {
+       rm ${STARTSOCK} >/dev/null 2>&1
        rm ${TMPFILE} >/dev/null 2>&1
        rm ${OBJDIR}/nohup.out >/dev/null 2>&1
        rm ${OBJDIR}/snmpd.log >/dev/null 2>&1
@@ -69,6 +94,8 @@ listen on 127.0.0.1 snmpv2c notify
 listen on ::1 snmpv1 snmpv2c snmpv3
 listen on ::1 snmpv2c notify
 
+agentx path "${STARTSOCK}"
+
 # Specify communities
 read-only community public
 read-write community private
@@ -77,11 +104,7 @@ trap community public
 trap handle 1.2.3.4 "/usr/bin/touch ${TMPFILE}"
 EOF
 
-(cd ${OBJDIR} && nohup snmpd -dvf ./snmpd.conf > snmpd.log 2>&1) &
-
-sleep ${SLEEP}
-
-[ ! -n "$(pgrep snmpd)" ] && echo "Failed to start snmpd." && fail
+snmpdstart
 
 # pf (also checks "oid all" which obtains privileged kernel data
 
@@ -166,8 +189,7 @@ fi
 #      FAILED=1
 #fi
 
-kill $(pgrep snmpd) >/dev/null 2>&1
-wait
+snmpdstop
 
 # # # # # CONFIG TWO # # # # #
 echo "\nConfiguration: seclevel auth\n"
@@ -178,16 +200,14 @@ cat > ${OBJDIR}/snmpd.conf <<EOF
 listen on 127.0.0.1
 listen on ::1
 
+agentx path "${STARTSOCK}"
+
 seclevel auth
 
 user "hans" authkey "password123" auth hmac-sha1
 EOF
 
-(cd ${OBJDIR} && nohup snmpd -dvf ./snmpd.conf > snmpd.log 2>&1) &
-
-sleep ${SLEEP}
-
-[ ! -n "$(pgrep snmpd)" ] && echo "Failed to start snmpd." && fail
+snmpdstart
 
 # make sure we can't get an oid with deault community string
 
@@ -213,8 +233,7 @@ then
        FAILED=1
 fi
 
-kill $(pgrep snmpd) >/dev/null 2>&1
-wait
+snmpdstop
 
 # # # # # CONFIG THREE # # # # #
 echo "\nConfiguration: seclevel enc\n"
@@ -225,16 +244,14 @@ cat > ${OBJDIR}/snmpd.conf <<EOF
 listen on 127.0.0.1
 listen on ::1
 
+agentx path "${STARTSOCK}"
+
 seclevel enc
 
 user "hans" authkey "password123" auth hmac-sha1 enc aes enckey "321drowssap"
 EOF
 
-(cd ${OBJDIR} && nohup snmpd -dvf ./snmpd.conf > snmpd.log 2>&1) &
-
-sleep ${SLEEP}
-
-[ ! -n "$(pgrep snmpd)" ] && echo "Failed to start snmpd." && fail
+snmpdstart
 
 # get with SHA authentication and AES encryption
 
@@ -249,8 +266,7 @@ then
        FAILED=1
 fi
 
-kill $(pgrep snmpd) >/dev/null 2>&1
-wait
+snmpdstop
 
 # # # # # CONFIG FOUR # # # # #
 echo "\nConfiguration: non-default community strings, custom oids\n"
@@ -264,6 +280,8 @@ cat > ${OBJDIR}/snmpd.conf <<EOF
 listen on 127.0.0.1 snmpv1 snmpv2c
 listen on ::1 snmpv1 snmpv2c
 
+agentx path "${STARTSOCK}"
+
 read-only community non-default-ro
 
 read-write community non-default-rw
@@ -273,11 +291,7 @@ oid 1.3.6.1.4.1.30155.42.2 name myStatus read-only integer 1
 # No need to place a full index, we just need the object
 EOF
 
-(cd ${OBJDIR} && nohup snmpd -dvf ./snmpd.conf > snmpd.log 2>&1) &
-
-sleep ${SLEEP}
-
-[ ! -n "$(pgrep snmpd)" ] && echo "Failed to start snmpd." && fail
+snmpdstart
 
 # carp allow with non-default ro community string
 
@@ -343,7 +357,7 @@ fi
 #      FAILED=1
 #fi
 
-kill $(pgrep snmpd) >/dev/null 2>&1
+snmpdstop
 
 case $FAILED in
 0)     echo