<p>Max has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12710">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add ping probe support<br><br>If liboping is available during ./configure than 'ping XXX' entries will<br>be supported in .cfg file, where XXX can be either IP address or FQDN.<br><br>Sample output:<br>...<br> ping<br> ya.ru<br> IP: 2a02:6b8::2:242<br> dropped: 3/3<br> 8.8.8.8<br> IP: 8.8.8.8<br> dropped: 0/3<br> latency: 20.4 ms<br> TTL: 120<br>...<br><br>N. B: to gather actual ping statistic we have to be able to send ICMP<br>requests (have enough privileges to work with RAW sockets).<br><br>Related: SYS#2655<br><br>Change-Id: Ife32540b532fb54368f63c78fb7837b84d4e8c76<br>---<br>M configure.ac<br>M src/Makefile.am<br>M src/osysmon.h<br>M src/osysmon_main.c<br>A src/osysmon_ping.c<br>5 files changed, 278 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-sysmon refs/changes/10/12710/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index 734ac99..be60a8e 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -111,6 +111,9 @@</span><br><span> AC_SUBST([COVERAGE_LDFLAGS])</span><br><span> fi</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOPING, liboping, found_oping=yes, [AC_DEFINE([NO_OPING], [1], [Don't use liboping])])</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONDITIONAL(HAVE_OPING, test "$found_oping" = yes)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> AC_ARG_ENABLE(profile,</span><br><span> [AS_HELP_STRING([--enable-profile], [Compile with profiling support enabled], )],</span><br><span> [profile=$enableval], [profile="no"])</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index 412337b..2e5f260 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -37,6 +37,12 @@</span><br><span> osysmon_main.c \</span><br><span> $(NULL)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+if HAVE_OPING</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_sysmon_SOURCES += osysmon_ping.c</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_sysmon_LDADD += $(LIBOPING_LIBS)</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_sysmon_CFLAGS = $(AM_CFLAGS) $(LIBOPING_CFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> osmo_ctrl_client_SOURCES = \</span><br><span> simple_ctrl.c \</span><br><span> osmo-ctrl-client.c \</span><br><span>diff --git a/src/osysmon.h b/src/osysmon.h</span><br><span>index 735b11e..8b17972 100644</span><br><span>--- a/src/osysmon.h</span><br><span>+++ b/src/osysmon.h</span><br><span>@@ -6,9 +6,11 @@</span><br><span> </span><br><span> #include <stdbool.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include "config.h"</span><br><span> #include "value_node.h"</span><br><span> </span><br><span> struct rtnl_client_state;</span><br><span style="color: hsl(120, 100%, 40%);">+struct ping_state;</span><br><span> </span><br><span> struct osysmon_state {</span><br><span> struct rtnl_client_state *rcs;</span><br><span>@@ -18,6 +20,7 @@</span><br><span> struct llist_head netdevs;</span><br><span> /* list of 'struct osysmon_file' */</span><br><span> struct llist_head files;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ping_state *pings;</span><br><span> };</span><br><span> </span><br><span> extern struct osysmon_state *g_oss;</span><br><span>@@ -28,6 +31,7 @@</span><br><span> CTRL_CLIENT_NODE = _LAST_OSMOVTY_NODE + 1,</span><br><span> CTRL_CLIENT_GETVAR_NODE,</span><br><span> NETDEV_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+ PING_NODE,</span><br><span> };</span><br><span> </span><br><span> </span><br><span>@@ -42,5 +46,8 @@</span><br><span> int osysmon_sysinfo_init();</span><br><span> int osysmon_sysinfo_poll(struct value_node *parent);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int osysmon_ping_init();</span><br><span style="color: hsl(120, 100%, 40%);">+int osysmon_ping_poll(struct value_node *parent);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int osysmon_file_init();</span><br><span> int osysmon_file_poll(struct value_node *parent);</span><br><span>diff --git a/src/osysmon_main.c b/src/osysmon_main.c</span><br><span>index 82df61f..96dfa69 100644</span><br><span>--- a/src/osysmon_main.c</span><br><span>+++ b/src/osysmon_main.c</span><br><span>@@ -193,7 +193,7 @@</span><br><span> </span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc, ping_init;</span><br><span> </span><br><span> osmo_init_logging2(NULL, &log_info);</span><br><span> </span><br><span>@@ -207,6 +207,9 @@</span><br><span> osysmon_sysinfo_init();</span><br><span> osysmon_ctrl_init();</span><br><span> osysmon_rtnl_init();</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef NO_OPING</span><br><span style="color: hsl(120, 100%, 40%);">+ ping_init = osysmon_ping_init();</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> osysmon_file_init();</span><br><span> </span><br><span> rc = vty_read_config_file(cmdline_opts.config_file, NULL);</span><br><span>@@ -233,6 +236,10 @@</span><br><span> osysmon_sysinfo_poll(root);</span><br><span> osysmon_ctrl_poll(root);</span><br><span> osysmon_rtnl_poll(root);</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef NO_OPING</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ping_init == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ osysmon_ping_poll(root);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> osysmon_file_poll(root);</span><br><span> </span><br><span> display_update(root);</span><br><span>diff --git a/src/osysmon_ping.c b/src/osysmon_ping.c</span><br><span>new file mode 100644</span><br><span>index 0000000..eaa3d1b</span><br><span>--- /dev/null</span><br><span>+++ b/src/osysmon_ping.c</span><br><span>@@ -0,0 +1,254 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Simple Osmocom System Monitor (osysmon): Support for ping probe */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2018 by sysmocom - s.f.m.c. GmbH.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Max Suraev</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0+</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program; if not, write to the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,</span><br><span style="color: hsl(120, 100%, 40%);">+ * MA 02110-1301, USA.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <oping.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/command.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "osysmon.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "value_node.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * Data model</span><br><span style="color: hsl(120, 100%, 40%);">+ ***********************************************************************/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define BUFLEN 128</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ping_state {</span><br><span style="color: hsl(120, 100%, 40%);">+ pingobj_t *ping_handle;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Workaround for liboping issue https://github.com/octo/liboping/issues/43 */</span><br><span style="color: hsl(120, 100%, 40%);">+static int add_host(pingobj_t *pinger, const char *host)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int num_host = ping_iterator_count(pinger),</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = ping_host_add(pinger, host);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (num_host != ping_iterator_count(pinger))</span><br><span style="color: hsl(120, 100%, 40%);">+ ping_host_remove(pinger, host);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static bool add_drop(pingobj_iter_t *iter, struct value_node *vn_host)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ char *s = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t drop, seq;</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t len = sizeof(drop);</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc = ping_iterator_get_info(iter, PING_INFO_DROPPED, &drop, &len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ len = sizeof(seq);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = ping_iterator_get_info(iter, PING_INFO_SEQUENCE, &seq, &len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_talloc_asprintf(vn_host, s, "%u/%u", drop, seq);</span><br><span style="color: hsl(120, 100%, 40%);">+ value_node_add(vn_host, "dropped", s);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static bool add_ttl(pingobj_iter_t *iter, struct value_node *vn_host)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int ttl, rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t len = sizeof(ttl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = ping_iterator_get_info(iter, PING_INFO_RECV_TTL, &ttl, &len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ttl > -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ char *s = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_talloc_asprintf(vn_host, s, "%d", ttl);</span><br><span style="color: hsl(120, 100%, 40%);">+ value_node_add(vn_host, "TTL", s);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static bool add_latency(pingobj_iter_t *iter, struct value_node *vn_host)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ double latency;</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t len = sizeof(latency);</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc = ping_iterator_get_info(iter, PING_INFO_LATENCY, &latency, &len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (latency > -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ char *s = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_talloc_asprintf(vn_host, s, "%.1lf ms", latency);</span><br><span style="color: hsl(120, 100%, 40%);">+ value_node_add(vn_host, "latency", s);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * VTY</span><br><span style="color: hsl(120, 100%, 40%);">+ ***********************************************************************/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct cmd_node ping_node = {</span><br><span style="color: hsl(120, 100%, 40%);">+ PING_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+ "%s(config-ping)# ",</span><br><span style="color: hsl(120, 100%, 40%);">+ 1,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int osysmon_ping_go_parent(struct vty *vty)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (vty->node) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case PING_NODE:</span><br><span style="color: hsl(120, 100%, 40%);">+ vty->node = CONFIG_NODE;</span><br><span style="color: hsl(120, 100%, 40%);">+ vty->index = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return vty->node;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define PING_STR "Configure a host to be monitored/pinged\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_ping, cfg_ping_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "ping HOST",</span><br><span style="color: hsl(120, 100%, 40%);">+ PING_STR "Name of the host to ping\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc = add_host(g_oss->pings->ping_handle, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "[%d] Couldn't add pinger for %s: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ ping_iterator_count(g_oss->pings->ping_handle), argv[0],</span><br><span style="color: hsl(120, 100%, 40%);">+ ping_get_error(g_oss->pings->ping_handle), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_no_ping, cfg_no_ping_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "no ping HOST",</span><br><span style="color: hsl(120, 100%, 40%);">+ NO_STR PING_STR "Name of the host to ping\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc = ping_host_remove(g_oss->pings->ping_handle, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "[%d] Couldn't remove %s pinger: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ ping_iterator_count(g_oss->pings->ping_handle), argv[0],</span><br><span style="color: hsl(120, 100%, 40%);">+ ping_get_error(g_oss->pings->ping_handle), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int config_write_ping(struct vty *vty)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ char buf[BUFLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+ pingobj_iter_t *iter;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (iter = ping_iterator_get(g_oss->pings->ping_handle); iter; iter = ping_iterator_next(iter)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t len = BUFLEN;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* hostname as it was supplied via vty 'ping' entry */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ping_iterator_get_info(iter, PING_INFO_USERNAME, buf, &len))</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "ping %s%s", buf, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * Runtime Code</span><br><span style="color: hsl(120, 100%, 40%);">+ ***********************************************************************/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* called once on startup before config file parsing */</span><br><span style="color: hsl(120, 100%, 40%);">+int osysmon_ping_init()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(CONFIG_NODE, &cfg_ping_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(CONFIG_NODE, &cfg_no_ping_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_node(&ping_node, config_write_ping);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ g_oss->pings = talloc_zero(NULL, struct ping_state);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!g_oss->pings)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ g_oss->pings->ping_handle = ping_construct();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_oss->pings->ping_handle)</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* called periodically */</span><br><span style="color: hsl(120, 100%, 40%);">+int osysmon_ping_poll(struct value_node *parent)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ char buf[BUFLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+ struct value_node *vn_host;</span><br><span style="color: hsl(120, 100%, 40%);">+ int num_host = ping_iterator_count(g_oss->pings->ping_handle);</span><br><span style="color: hsl(120, 100%, 40%);">+ pingobj_iter_t *iter;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct value_node *vn_ping = value_node_add(parent, "ping", NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!vn_ping)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (iter = ping_iterator_get(g_oss->pings->ping_handle); iter; iter = ping_iterator_next(iter)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t len = BUFLEN;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc = ping_iterator_get_info(iter, PING_INFO_USERNAME, buf, &len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ vn_host = value_node_find_or_add(vn_ping, talloc_strdup(vn_ping, buf));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!vn_host)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ len = BUFLEN; /* IP address is looked up on-call, even 40 bytes should be enough */</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = ping_iterator_get_info(iter, PING_INFO_ADDRESS, buf, &len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ value_node_add(vn_host, "IP", buf);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ add_drop(iter, vn_host);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Parameters below might be absent from output depending on the host reachability: */</span><br><span style="color: hsl(120, 100%, 40%);">+ add_latency(iter, vn_host);</span><br><span style="color: hsl(120, 100%, 40%);">+ add_ttl(iter, vn_host);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (num_host)</span><br><span style="color: hsl(120, 100%, 40%);">+ return ping_send(g_oss->pings->ping_handle);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12710">change 12710</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12710"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-sysmon </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ife32540b532fb54368f63c78fb7837b84d4e8c76 </div>
<div style="display:none"> Gerrit-Change-Number: 12710 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>