aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2012-03-14 10:08:51 +0100
committerNatanael Copa <ncopa@alpinelinux.org>2012-03-14 10:08:51 +0100
commit68e94a0780098e8b5e4772a270f91a60a370b8f6 (patch)
tree6bf904cfcf271ad9f8aa207d6cf5e171f8761d20
parent2f5cbff07d2872f78c92efe854385d083c4dfbca (diff)
downloadpingu-68e94a0780098e8b5e4772a270f91a60a370b8f6.tar.bz2
pingu-68e94a0780098e8b5e4772a270f91a60a370b8f6.tar.xz
pingu_adm: new admin command for dumping active pings
-rw-r--r--pingu_adm.c3
-rw-r--r--pingu_iface.c17
-rw-r--r--pingu_iface.h3
-rw-r--r--pingu_ping.c15
-rw-r--r--pingu_ping.h2
5 files changed, 33 insertions, 7 deletions
diff --git a/pingu_adm.c b/pingu_adm.c
index 27f685f..d0ceb49 100644
--- a/pingu_adm.c
+++ b/pingu_adm.c
@@ -41,6 +41,7 @@ static struct {
} adm_handler[] = {
{ "host-status", pingu_host_dump_status },
{ "gateway-status", pingu_iface_dump_status },
+ { "pings", pingu_iface_dump_pings },
{ NULL, NULL }
};
@@ -74,7 +75,7 @@ static void pingu_adm_recv_cb (struct ev_loop *loop, struct ev_io *w,
for (i = 0; adm_handler[i].command != NULL; i++) {
if (strncmp(conn->cmd, adm_handler[i].command, len) != 0)
continue;
- log_debug("Admin command: %s", conn->cmd);
+ log_debug("Admin command: %s (args='%s')", conn->cmd, args ? args : "NULL");
adm_handler[i].handler(conn->io.fd, args);
conn->cmd[0] = '\0';
conn->num_read = 0;
diff --git a/pingu_iface.c b/pingu_iface.c
index e4326d5..fa50de6 100644
--- a/pingu_iface.c
+++ b/pingu_iface.c
@@ -213,8 +213,8 @@ void pingu_iface_adjust_hosts_online(struct pingu_iface *iface, int adjustment)
statusstr = "OFFLINE";
route_action = RTM_DELROUTE;
action = iface->gw_down_action;
- }
-
+ }
+
log_info("%s: went %s", iface->label ? iface->label : iface->name,
statusstr);
pingu_iface_update_routes(iface, route_action);
@@ -255,7 +255,18 @@ void pingu_iface_dump_status(int fd, char *filter)
pingu_iface_gw_is_online(iface));
write(fd, buf, strlen(buf));
}
- write(fd, "\n", 1);
+ write(fd, "\n", 1);
+}
+
+void pingu_iface_dump_pings(int fd, char *filter)
+{
+ struct pingu_iface *iface;
+ list_for_each_entry(iface, &iface_list, iface_list_entry) {
+ if (filter != NULL && strcmp(filter, iface->name) != 0)
+ continue;
+ pingu_ping_dump(fd, &iface->ping_list, iface->name);
+ }
+ write(fd, "\n", 1);
}
int pingu_iface_init(struct ev_loop *loop)
diff --git a/pingu_iface.h b/pingu_iface.h
index 53c5fa8..a87821f 100644
--- a/pingu_iface.h
+++ b/pingu_iface.h
@@ -53,7 +53,8 @@ int pingu_iface_gw_is_online(struct pingu_iface *iface);
void pingu_iface_gw_action(struct pingu_iface *iface,
struct pingu_route *gw, int action);
-void pingu_iface_dump_status(int fd, char *filter);
+void pingu_iface_dump_status(int fd, char *filter);
+void pingu_iface_dump_pings(int fd, char *filter);
void pingu_iface_update_routes(struct pingu_iface *iface, int action);
void pingu_iface_cleanup(struct ev_loop *loop);
#endif
diff --git a/pingu_ping.c b/pingu_ping.c
index 8ef0596..186673e 100644
--- a/pingu_ping.c
+++ b/pingu_ping.c
@@ -1,4 +1,5 @@
#include <arpa/inet.h>
+#include <net/if.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
@@ -7,6 +8,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
#include <ev.h>
@@ -74,7 +76,7 @@ static struct pingu_ping *pingu_ping_find(struct icmphdr *icp,
struct pingu_ping *ping;
if (icp->type != ICMP_ECHOREPLY || icp->un.echo.id != getpid())
return NULL;
-
+
list_for_each_entry(ping, ping_list, ping_list_entry) {
if (sockaddr_cmp(&ping->host->burst.saddr, from) == 0
&& ping->seq == ntohs(icp->un.echo.sequence))
@@ -142,3 +144,14 @@ void pingu_ping_cleanup(struct ev_loop *loop, struct list_head *ping_list)
pingu_ping_free(loop, ping);
}
}
+
+void pingu_ping_dump(int fd, struct list_head *ping_list, const char *prefix)
+{
+ struct pingu_ping *ping;
+ char str[IF_NAMESIZE + 80];
+ list_for_each_entry(ping, ping_list, ping_list_entry) {
+ snprintf(str, sizeof(str), "%s %s %i\n",
+ prefix, ping->host->host, ping->seq);
+ write(fd, str, strlen(str));
+ }
+}
diff --git a/pingu_ping.h b/pingu_ping.h
index 52c977e..e0bda08 100644
--- a/pingu_ping.h
+++ b/pingu_ping.h
@@ -20,5 +20,5 @@ int pingu_ping_send(struct ev_loop *loop, struct pingu_host *host,
int set_status_on_failure);
void pingu_ping_read_reply(struct ev_loop *loop, struct pingu_iface *iface);
void pingu_ping_cleanup(struct ev_loop *loop, struct list_head *ping_list);
-
+void pingu_ping_dump(int fd, struct list_head *ping_list, const char *prefix);
#endif