--- /dev/null
+#
+# Copyright (C) 2006-2014 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=muninlite
+PKG_VERSION:=1.0.4
+PKG_RELEASE:=10
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=@SF/$(PKG_NAME)
+PKG_HASH:=736482dd6d6849d014d975b1f5794f20dda6e123dbba2d8c2f169c8e787e6f7e
+PKG_LICENSE:=GPL-2.0-or-later
+PKG_LICENSE_FILES:=LICENSE
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/muninlite
+ SECTION:=admin
+ CATEGORY:=Administration
+ DEPENDS:=+xinetd
+ TITLE:=Munin node implemented in shell
+ URL:=http://sourceforge.net/projects/muninlite/
+ PKG_MAINTAINER:=Jonathan McCrohan <jmccrohan@gmail.com>
+endef
+
+define Package/muninlite/Default/description
+ Munin node implemented in shell.
+ Munin is a monitoring system for Unix networks.
+endef
+
+define Package/muninlite/install
+ $(INSTALL_DIR) $(1)/usr/sbin/
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/munin-node $(1)/usr/sbin/
+ $(INSTALL_DIR) $(1)/etc/xinetd.d
+ $(INSTALL_DATA) ./files/etc/xinetd.d/munin $(1)/etc/xinetd.d/
+endef
+
+define Package/muninlite/conffiles
+/etc/xinetd.d/munin
+endef
+
+define Build/Configure
+endef
+
+define Build/Compile
+ $(MAKE) -C $(PKG_BUILD_DIR)
+endef
+
+$(eval $(call BuildPackage,muninlite))
--- /dev/null
+service munin
+{
+ socket_type = stream
+ protocol = tcp
+ wait = no
+ user = root
+ group = root
+ server = /usr/sbin/munin-node
+ disable = no
+}
--- /dev/null
+--- a/plugins/df
++++ b/plugins/df
+@@ -19,6 +19,6 @@ fetch_df() {
+ do
+ PINFO=$(df -P $PART | tail -1);
+ PNAME=$(echo $PINFO | cut -d\ -f1 | sed 's/[\/.-]/_/g')
+- echo "$PNAME.value" $(echo $PINFO | cut -f5 -d\ | sed -e 's/\%//g')
++ echo "$PNAME.value" $(echo $PINFO | sed -e 's/\%//g' -e 's/ */ /g' | cut -f5 -d' ')
+ done
+ }
--- /dev/null
+--- a/munin-node.in
++++ b/munin-node.in
+@@ -113,7 +113,7 @@ PLUGINS=$RES
+
+ # ===== MAIN LOOP =====
+ FUNCTIONS="list nodes config fetch version quit"
+-HOSTNAME=$(hostname -f 2>/dev/null || hostname)
++HOSTNAME=$(/sbin/uci get "system.@system[0].hostname" 2>/dev/null || cat /proc/sys/kernel/hostname)
+ echo "# munin node at $HOSTNAME"
+ while read arg0 arg1
+ do
--- /dev/null
+--- a/plugins/if_
++++ b/plugins/if_
+@@ -15,10 +15,14 @@ config_if() {
+ echo "up.min 0"
+ echo "up.negative down"
+ echo "up.cdef up,8,*"
+- if ethtool $1 | grep -q Speed; then
+- MAX=$(($(ethtool $1 | grep Speed | sed -e 's/[[:space:]]\{1,\}/ /g' -e 's/^ //' -e 's/M.*//' | cut -d\ -f2) * 1000000))
+- echo "up.max $MAX"
+- echo "down.max $MAX"
++ if [ -n "$(which ethtool)" ]; then
++ if [ -x "$(which ethtool)" ]; then
++ if ethtool $1 | grep -q Speed; then
++ MAX=$(($(ethtool $1 | grep Speed | sed -e 's/[[:space:]]\{1,\}/ /g' -e 's/^ //' -e 's/M.*//' | cut -d\ -f2) * 1000000))
++ echo "up.max $MAX"
++ echo "down.max $MAX"
++ fi
++ fi
+ fi
+ }
+ fetch_if() {
--- /dev/null
+--- a/plugins/uptime
++++ b/plugins/uptime
+@@ -4,8 +4,7 @@ config_uptime() {
+ echo "graph_vlabel uptime in days"
+ echo "uptime.label uptime"
+ echo "uptime.draw AREA"
+- echo "uptime.cdef uptime,86400,/"
+ }
+ fetch_uptime() {
+- echo "uptime.value" $(cut -d\ -f1 /proc/uptime)
++ awk '{printf "uptime.value %.2f",$1/86400; print ""}' /proc/uptime
+ }
--- /dev/null
+--- a/munin-node.in
++++ b/munin-node.in
+@@ -72,7 +72,7 @@ RES=""
+ for PLUG in $PLUGINS
+ do
+ if [ "$PLUG" = "if_" ]; then
+- for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
++ for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
+ do
+ INTERRES=$(echo $INTER | sed 's/\./VLAN/')
+ RES="$RES if_$INTERRES"
+@@ -80,7 +80,7 @@ do
+ eval "config_if_${INTERRES}() { config_if $INTER $@; };"
+ done
+ elif [ "$PLUG" = "if_err_" ]; then
+- for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
++ for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
+ do
+ INTERRES=$(echo $INTER | sed 's/\./VLAN/')
+ RES="$RES if_err_$INTERRES"
--- /dev/null
+--- a/munin-node.in
++++ b/munin-node.in
+@@ -72,17 +72,17 @@ RES=""
+ for PLUG in $PLUGINS
+ do
+ if [ "$PLUG" = "if_" ]; then
+- for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
++ for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\|br-\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
+ do
+- INTERRES=$(echo $INTER | sed 's/\./VLAN/')
++ INTERRES=$(echo $INTER | sed -e 's/\./VLAN/' -e 's/\-/_/')
+ RES="$RES if_$INTERRES"
+ eval "fetch_if_${INTERRES}() { fetch_if $INTER $@; };"
+ eval "config_if_${INTERRES}() { config_if $INTER $@; };"
+ done
+ elif [ "$PLUG" = "if_err_" ]; then
+- for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
++ for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\|br-\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
+ do
+- INTERRES=$(echo $INTER | sed 's/\./VLAN/')
++ INTERRES=$(echo $INTER | sed -e 's/\./VLAN/' -e 's/\-/_/')
+ RES="$RES if_err_$INTERRES"
+ eval "fetch_if_err_${INTERRES}() { fetch_if_err $INTER $@; };"
+ eval "config_if_err_${INTERRES}() { config_if_err $INTER $@; };"
--- /dev/null
+--- a/plugins/if_
++++ b/plugins/if_
+@@ -26,7 +26,7 @@ config_if() {
+ fi
+ }
+ fetch_if() {
+- IINFO=$(grep "$1:" /proc/net/dev | cut -d: -f2 | sed -e 's/ / /g')
++ IINFO=$(grep "$1:" /proc/net/dev | cut -d: -f2 | sed -e 's/ */ /g' -e 's/^[ \t]*//')
+ echo "down.value" $(echo $IINFO | cut -d\ -f1)
+ echo "up.value" $(echo $IINFO | cut -d\ -f9)
+ }
+--- a/plugins/if_err_
++++ b/plugins/if_err_
+@@ -15,7 +15,7 @@ config_if_err() {
+ echo "trans.warning 1"
+ }
+ fetch_if_err() {
+- IINFO=$(grep "$1:" /proc/net/dev | cut -d: -f2 | sed -e 's/ / /g')
++ IINFO=$(grep "$1:" /proc/net/dev | cut -d: -f2 | sed -e 's/ */ /g' -e 's/^[ \t]*//')
+ echo "rcvd.value" $(echo $IINFO | cut -d\ -f3)
+ echo "trans.value" $(echo $IINFO | cut -d\ -f11)
+ }
--- /dev/null
+--- a/munin-node.in
++++ b/munin-node.in
+@@ -72,7 +72,7 @@ RES=""
+ for PLUG in $PLUGINS
+ do
+ if [ "$PLUG" = "if_" ]; then
+- for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\|br-\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
++ for INTER in $(grep -E '^ *(ppp|eth|wlan|ath|ra|ipsec|tap|br-)[^:]{1,}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
+ do
+ INTERRES=$(echo $INTER | sed -e 's/\./VLAN/' -e 's/\-/_/')
+ RES="$RES if_$INTERRES"
+@@ -80,7 +80,7 @@ do
+ eval "config_if_${INTERRES}() { config_if $INTER $@; };"
+ done
+ elif [ "$PLUG" = "if_err_" ]; then
+- for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\|br-\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
++ for INTER in $(grep -E '^ *(ppp|eth|wlan|ath|ra|ipsec|tap|br-)[^:]{1,}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
+ do
+ INTERRES=$(echo $INTER | sed -e 's/\./VLAN/' -e 's/\-/_/')
+ RES="$RES if_err_$INTERRES"
--- /dev/null
+--- a/plugins/irqstats 2007-11-30 11:39:08.000000000 +0100
++++ b/plugins/irqstats 2018-08-29 08:20:50.809468406 +0200
+@@ -1,6 +1,6 @@
+ config_irqstats() {
+ echo "graph_title Individual interrupts
+-graph_args --base 1000 -l 0;
++graph_args --base 1000 -l 0
+ graph_vlabel interrupts / \${graph_period}
+ graph_category system"
+ CPUS=$(grep 'CPU[0-9]' /proc/interrupts | wc -w)
--- /dev/null
+#
+# Copyright (C) 2006-2015 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=xinetd
+PKG_VERSION:=2.3.15
+PKG_RELEASE:=5
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://github.com/xinetd-org/xinetd/archive
+PKG_HASH:=bf4e060411c75605e4dcbdf2ac57c6bd9e1904470a2f91e01ba31b50a80a5be3
+PKG_LICENSE:=xinetd
+PKG_LICENSE_FILES:=COPYRIGHT
+PKG_CPE_ID:=cpe:/a:xinetd:xinetd
+
+PKG_INSTALL:=1
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/xinetd
+ SECTION:=net
+ CATEGORY:=Network
+ TITLE:=A powerful and secure super-server
+ URL:=https://github.com/xinetd-org
+ PKG_MAINTAINER:=Jonathan McCrohan <jmccrohan@gmail.com>
+endef
+
+define Package/xinetd/description
+ xinetd has access control mechanisms, extensive logging capabilities,
+ the ability to make services available based on time, can place limits
+ on the number of servers that can be started, and has deployable
+ defence mechanisms to protect against port scanners, among other
+ things.
+endef
+
+define Package/xinetd/conffiles
+/etc/xinetd.conf
+/etc/xinetd.d/
+endef
+
+TARGET_CFLAGS += -DNO_RPC
+TARGET_CPPFLAGS += -DHAVE_RLIM_T
+
+CONFIGURE_ARGS += \
+ --without-libwrap \
+ --with-loadavg
+
+CONFIGURE_VARS += \
+ ac_cv_header_rpc_pmap_clnt_h=no \
+ ac_cv_header_rpc_rpc_h=no \
+ ac_cv_header_rpc_rpcent_h=no
+
+define Package/xinetd/install
+ $(INSTALL_DIR) $(1)/usr/sbin
+ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/xinetd $(1)/usr/sbin/
+ $(INSTALL_DIR) $(1)/etc
+ $(INSTALL_DATA) ./files/xinetd.conf $(1)/etc/xinetd.conf
+ $(INSTALL_DIR) $(1)/etc/xinetd.d
+ $(INSTALL_DIR) $(1)/etc/init.d
+ $(INSTALL_BIN) ./files/xinetd.init $(1)/etc/init.d/xinetd
+endef
+
+$(eval $(call BuildPackage,xinetd))
--- /dev/null
+defaults
+{
+
+}
+
+includedir /etc/xinetd.d
--- /dev/null
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006-2011 OpenWrt.org
+
+START=50
+
+SERVICE_USE_PID=1
+
+start() {
+ service_start /usr/sbin/xinetd -pidfile /var/run/xinetd.pid
+}
+
+stop() {
+ service_stop /usr/sbin/xinetd
+}
+
--- /dev/null
+--- a/libs/src/misc/Makefile.in
++++ b/libs/src/misc/Makefile.in
+@@ -62,7 +62,7 @@ libopt: clean
+
+
+ $(LIBNAME): $(OBJECTS)
+- ar r $@ $?
++ $(AR) r $@ $?
+ $(RANLIB) $@
+
+ install: $(LIBNAME)
+--- a/libs/src/portable/Makefile.in
++++ b/libs/src/portable/Makefile.in
+@@ -57,7 +57,7 @@ libopt: clean
+
+
+ $(LIBNAME): $(OBJECTS)
+- ar r $@ $?
++ $(AR) r $@ $?
+ $(RANLIB) $@
+
+ install: $(LIBNAME)
+--- a/libs/src/pset/Makefile.in
++++ b/libs/src/pset/Makefile.in
+@@ -53,7 +53,7 @@ libopt: clean
+ mv $(LIBNAME) $(LIBDIR)/optimized
+
+ $(LIBNAME): $(OBJECTS)
+- ar r $@ $?
++ $(AR) r $@ $?
+ $(RANLIB) $@
+
+ install: $(LIBNAME)
+--- a/libs/src/sio/Makefile.in
++++ b/libs/src/sio/Makefile.in
+@@ -52,7 +52,7 @@ libopt: clean
+ $(INSTALL) $(FMODE) $(LIBNAME) $(LIBDIR)/optimized
+
+ $(LIBNAME): $(OBJECTS)
+- ar r $@ $?
++ $(AR) r $@ $?
+ $(RANLIB) $@
+
+ install: $(LIBNAME)
+--- a/libs/src/str/Makefile.in
++++ b/libs/src/str/Makefile.in
+@@ -63,7 +63,7 @@ libopt: clean
+ $(INSTALL) $(FMODE) $(LIBNAME) $(LIBDIR)-O
+
+ $(LIBNAME): $(OBJECTS)
+- ar r $@ $?
++ $(AR) r $@ $?
+ $(RANLIB) $@
+
+ LINT_IGNORE=possible pointer alignment|RCSid unused
+--- a/libs/src/xlog/Makefile.in
++++ b/libs/src/xlog/Makefile.in
+@@ -58,7 +58,7 @@ libopt: clean
+ $(INSTALL) $(FMODE) $(LIBNAME) $(LIBDIR)/optimized
+
+ $(LIBNAME): $(OBJECTS)
+- ar r $@ $?
++ $(AR) r $@ $?
+ $(RANLIB) $@
+
+ install: $(LIBNAME)
--- /dev/null
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -75,15 +75,15 @@ dlibxlog: dlibsio dlibstr
+
+ install: build
+ for i in $(DAEMONDIR) $(BINDIR) $(MANDIR)/man5 $(MANDIR)/man8 ; do \
+- test -d $$i || mkdir -p $$i ; done
+- $(INSTALL_CMD) -m 755 xinetd/xinetd $(DAEMONDIR)
+- $(INSTALL_CMD) -m 755 xinetd/itox $(DAEMONDIR)
+- $(INSTALL_CMD) -m 755 $(SRCDIR)/xinetd/xconv.pl $(DAEMONDIR)
+- $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xinetd.conf.man $(MANDIR)/man5/xinetd.conf.5
+- $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xinetd.log.man $(MANDIR)/man8/xinetd.log.8
+- $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xinetd.man $(MANDIR)/man8/xinetd.8
+- $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/itox.8 $(MANDIR)/man8/itox.8
+- $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xconv.pl.8 $(MANDIR)/man8/xconv.pl.8
++ test -d $(DESTDIR)$$i || mkdir -p $(DESTDIR)$$i ; done
++ $(INSTALL_CMD) -m 755 xinetd/xinetd $(DESTDIR)$(DAEMONDIR)
++ $(INSTALL_CMD) -m 755 xinetd/itox $(DESTDIR)$(DAEMONDIR)
++ $(INSTALL_CMD) -m 755 $(SRCDIR)/xinetd/xconv.pl $(DESTDIR)$(DAEMONDIR)
++ $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xinetd.conf.man $(DESTDIR)$(MANDIR)/man5/xinetd.conf.5
++ $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xinetd.log.man $(DESTDIR)$(MANDIR)/man8/xinetd.log.8
++ $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xinetd.man $(DESTDIR)$(MANDIR)/man8/xinetd.8
++ $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/itox.8 $(DESTDIR)$(MANDIR)/man8/itox.8
++ $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xconv.pl.8 $(DESTDIR)$(MANDIR)/man8/xconv.pl.8
+ @echo "You must put your xinetd.conf in /etc/xinetd.conf"
+ @echo "There is a sample config file in xinetd/sample.conf and you can"
+ @echo "use xconv.pl to convert your old inetd.conf file to an xinetd format"
--- /dev/null
+--- a/xinetd/confparse.c
++++ b/xinetd/confparse.c
+@@ -745,7 +745,7 @@ static status_e check_entry( struct serv
+ }
+ }
+
+-/* #ifndef NO_RPC */
++#ifndef NO_RPC
+ #if defined(HAVE_RPC_RPCENT_H) || defined(HAVE_NETDB_H)
+ if ( SC_IS_RPC( scp ) && !SC_IS_UNLISTED( scp ) )
+ {
+@@ -759,6 +759,7 @@ static status_e check_entry( struct serv
+ SC_RPCDATA( scp )->rd_program_number = rep->r_number ;
+ }
+ else
++#endif
+ #endif /* ! NO_RPC */
+ {
+ if ( !SC_IS_UNLISTED( scp ) )
--- /dev/null
+xinetd: socket bind: Invalid argument (errno = 22) when using USERID on ipv6
+
+Use right size of addresses in bind() call. Also use getpeername addresses when
+connecting to ident service to prevent address family mismatch between socket(),
+bind() and connect() calls.
+
+Author: Jan Safranek <jsafrane@redhat.com>
+Reviewed-By: Adam Tkac <atkac@redhat.com>
+
+#diff -up xinetd-2.3.14/xinetd/ident.c.orig xinetd-2.3.14/xinetd/ident.c
+--- a/xinetd/ident.c
++++ b/xinetd/ident.c
+@@ -97,7 +97,13 @@ idresult_e log_remote_user( const struct
+ }
+
+ CLEAR( sin_contact );
+- sin_remote = *CONN_XADDRESS( SERVER_CONNECTION( serp ) ) ;
++
++ sin_len = sizeof( sin_remote );
++ if ( getpeername( SERVER_FD( serp ), &sin_remote.sa, &sin_len ) == -1 )
++ {
++ msg( LOG_ERR, func, "(%d) getpeername: %m", getpid() ) ;
++ return( IDR_ERROR ) ;
++ }
+ sin_contact = sin_remote;
+ memcpy( &sin_bind, &sin_local, sizeof(sin_bind) ) ;
+ local_port = 0;
+@@ -127,7 +133,13 @@ idresult_e log_remote_user( const struct
+ msg( LOG_ERR, func, "socket creation: %m" ) ;
+ return( IDR_ERROR ) ;
+ }
+- if ( bind(sd, &sin_bind.sa, sizeof(sin_bind.sa)) == -1 )
++
++ if ( sin_bind.sa.sa_family == AF_INET )
++ sin_len = sizeof( sin_bind.sa_in ) ;
++ else
++ sin_len = sizeof( sin_bind.sa_in6 ) ;
++
++ if ( bind(sd, &sin_bind.sa, sin_len) == -1 )
+ {
+ msg( LOG_ERR, func, "socket bind: %m" ) ;
+ (void) Sclose( sd ) ;