diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2012-03-14 10:08:51 +0100 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2012-03-14 10:08:51 +0100 |
commit | 68e94a0780098e8b5e4772a270f91a60a370b8f6 (patch) | |
tree | 6bf904cfcf271ad9f8aa207d6cf5e171f8761d20 | |
parent | 2f5cbff07d2872f78c92efe854385d083c4dfbca (diff) | |
download | pingu-68e94a0780098e8b5e4772a270f91a60a370b8f6.tar.bz2 pingu-68e94a0780098e8b5e4772a270f91a60a370b8f6.tar.xz |
pingu_adm: new admin command for dumping active pings
-rw-r--r-- | pingu_adm.c | 3 | ||||
-rw-r--r-- | pingu_iface.c | 17 | ||||
-rw-r--r-- | pingu_iface.h | 3 | ||||
-rw-r--r-- | pingu_ping.c | 15 | ||||
-rw-r--r-- | pingu_ping.h | 2 |
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 |