diff options
author | Dave Barach <dave@barachs.net> | 2019-10-14 11:26:15 -0400 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2019-10-14 22:42:49 +0000 |
commit | ef3c11ca93b651611af33ab3e5d64217504d221d (patch) | |
tree | bbfcd40ab4fd6e884b6f9bf2b2deea7038aa52de /src/plugins/mactime/builtins.c | |
parent | 8d829f6c480cdd6536537fc49356baa1878b9570 (diff) |
mactime: add the "mactime.json" builtin URL
If the http static server plugin is enabled, register the name
"mactime.json" with the server. Visiting <web-root>/mactime.json
produces a json brain-dump of the mactime table.
Type: feature
Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: Ie39b0c776675864a85251b8c07fbf719d399f6de
Diffstat (limited to 'src/plugins/mactime/builtins.c')
-rw-r--r-- | src/plugins/mactime/builtins.c | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/src/plugins/mactime/builtins.c b/src/plugins/mactime/builtins.c new file mode 100644 index 00000000000..a0d7b5f731e --- /dev/null +++ b/src/plugins/mactime/builtins.c @@ -0,0 +1,172 @@ +#include <vnet/vnet.h> +#include <builtinurl/builtinurl.h> +#include <http_static/http_static.h> +#include <mactime/mactime.h> +#include <vlib/unix/plugin.h> + +static int +handle_get_mactime (u8 * request, http_session_t * hs) +{ + mactime_main_t *mm = &mactime_main; + mactime_device_t *dp; + u8 *macstring = 0; + char *status_string; + u32 *pool_indices = 0; + int current_status = 99; + int i, j; + f64 now; + vlib_counter_t allow, drop; + ethernet_arp_ip4_entry_t *n, *pool; + char *q = "\""; + u8 *s = 0; + int need_comma = 0; + + vec_reset_length (mm->arp_cache_copy); + pool = ip4_neighbors_pool (); + + pool_foreach (n, pool, ( + { + vec_add1 (mm->arp_cache_copy, n[0]);})); + + now = clib_timebase_now (&mm->timebase); + + if (PREDICT_FALSE ((now - mm->sunday_midnight) > 86400.0 * 7.0)) + mm->sunday_midnight = clib_timebase_find_sunday_midnight (now); + + /* *INDENT-OFF* */ + pool_foreach (dp, mm->devices, + ({ + vec_add1 (pool_indices, dp - mm->devices); + })); + /* *INDENT-ON* */ + + s = format (s, "{%smactime%s: [\n", q, q); + + for (i = 0; i < vec_len (pool_indices); i++) + { + dp = pool_elt_at_index (mm->devices, pool_indices[i]); + + /* Check dynamic ranges */ + for (j = 0; j < vec_len (dp->ranges); j++) + { + clib_timebase_range_t *r = dp->ranges + j; + f64 start0, end0; + + start0 = r->start + mm->sunday_midnight; + end0 = r->end + mm->sunday_midnight; + + if (now >= start0 && now <= end0) + { + if (dp->flags & MACTIME_DEVICE_FLAG_DYNAMIC_ALLOW) + current_status = 3; + else if (dp->flags & MACTIME_DEVICE_FLAG_DYNAMIC_ALLOW_QUOTA) + current_status = 5; + else + current_status = 2; + goto print; + } + } + if (dp->flags & MACTIME_DEVICE_FLAG_STATIC_DROP) + current_status = 0; + if (dp->flags & MACTIME_DEVICE_FLAG_STATIC_ALLOW) + current_status = 1; + if (dp->flags & MACTIME_DEVICE_FLAG_DYNAMIC_ALLOW) + current_status = 2; + if (dp->flags & MACTIME_DEVICE_FLAG_DYNAMIC_DROP) + current_status = 3; + if (dp->flags & MACTIME_DEVICE_FLAG_DYNAMIC_ALLOW_QUOTA) + current_status = 4; + + print: + vec_reset_length (macstring); + + macstring = format (0, "%U", format_mac_address, dp->mac_address); + + if (need_comma) + s = format (s, "},\n"); + + need_comma = 1; + s = format (s, "{%smac_address%s: %s%s%s, ", q, q, q, macstring, q); + + switch (current_status) + { + case 0: + status_string = "static drop"; + break; + case 1: + status_string = "static allow"; + break; + case 2: + status_string = "dynamic drop"; + break; + case 3: + status_string = "dynamic allow"; + break; + case 4: + status_string = "d-quota inact"; + break; + case 5: + status_string = "d-quota activ"; + break; + default: + status_string = "code bug!"; + break; + } + vlib_get_combined_counter (&mm->allow_counters, dp - mm->devices, + &allow); + vlib_get_combined_counter (&mm->drop_counters, dp - mm->devices, &drop); + s = format (s, "%sname%s: %s%s%s, %sstatus%s: %s%s%s,", + q, q, q, dp->device_name, q, q, q, q, status_string, q); + s = format (s, "%sallow_pkts%s: %lld,", q, q, allow.packets); + s = format (s, "%sallow_bytes%s: %lld,", q, q, allow.bytes); + s = format (s, "%sdrop_pkts%s: %lld", q, q, drop.packets); + + for (j = 0; j < vec_len (mm->arp_cache_copy); j++) + { + n = mm->arp_cache_copy + j; + if (!memcmp (dp->mac_address, n->mac.bytes, sizeof (n->mac))) + { + s = format (s, ", %sip4_address%s: %s%U%s", q, q, + q, format_ip4_address, &n->ip4_address, q); + break; + } + } + } + if (need_comma) + s = format (s, "}\n"); + s = format (s, "]}\n"); + vec_free (macstring); + vec_free (pool_indices); + + hs->data = s; + hs->data_offset = 0; + hs->cache_pool_index = ~0; + hs->free_data = 1; + return 0; +} + +void +mactime_url_init (vlib_main_t * vm) +{ + void (*fp) (void *, char *, int); + + /* Look up the builtin URL registration handler */ + fp = vlib_get_plugin_symbol ("http_static_plugin.so", + "http_static_server_register_builtin_handler"); + + if (fp == 0) + { + clib_warning ("http_static_plugin.so not loaded..."); + return; + } + + (*fp) (handle_get_mactime, "mactime.json", HTTP_BUILTIN_METHOD_GET); +} + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ |