Drop interface from html_open, use global opt_interface.
[darkstat] / hosts_db.c
index ce465fd..5aee85b 100644 (file)
@@ -15,6 +15,7 @@
 #include "hosts_db.h"
 #include "db.h"
 #include "html.h"
+#include "http.h" /* for http_base_url */
 #include "ncache.h"
 #include "now.h"
 #include "str.h"
@@ -28,9 +29,7 @@
 #include <string.h> /* memset(), strcmp() */
 #include <unistd.h>
 
-extern int want_lastseen;
-int show_mac_addrs = 0;
-extern const char *interface;
+int hosts_db_show_macs = 0;
 
 /* FIXME: specify somewhere more sane/tunable */
 #define MAX_ENTRIES 30 /* in an HTML table rendered from a hashtable */
@@ -296,13 +295,13 @@ format_cols_host(struct str *buf)
       "<tr>\n"
       " <th>IP</th>\n"
       " <th>Hostname</th>\n");
-   if (show_mac_addrs) str_append(buf,
+   if (hosts_db_show_macs) str_append(buf,
       " <th>MAC Address</th>\n");
    str_append(buf,
       " <th><a href=\"?sort=in\">In</a></th>\n"
       " <th><a href=\"?sort=out\">Out</a></th>\n"
       " <th><a href=\"?sort=total\">Total</a></th>\n");
-   if (want_lastseen) str_append(buf,
+   if (opt_want_lastseen) str_append(buf,
       " <th><a href=\"?sort=lastseen\">Last seen</a></th>\n");
    str_append(buf,
       "</tr>\n");
@@ -316,13 +315,13 @@ format_row_host(struct str *buf, const struct bucket *b,
 
    str_appendf(buf,
       "<tr class=\"%s\">\n"
-      " <td><a href=\"/hosts/%s/\">%s</a></td>\n"
+      " <td><a href=\"%shosts/%s/\">%s</a></td>\n"
       " <td>%s</td>\n",
       css_class,
-      ip, ip,
+      http_base_url, ip, ip,
       (b->u.host.dns == NULL) ? "" : b->u.host.dns);
 
-   if (show_mac_addrs)
+   if (hosts_db_show_macs)
       str_appendf(buf,
          " <td><tt>%x:%x:%x:%x:%x:%x</tt></td>\n",
          b->u.host.mac_addr[0],
@@ -338,7 +337,7 @@ format_row_host(struct str *buf, const struct bucket *b,
       " <td class=\"num\">%'qu</td>\n",
       b->in, b->out, b->total);
 
-   if (want_lastseen) {
+   if (opt_want_lastseen) {
       time_t last_t = b->u.host.last_seen;
       struct str *lastseen = NULL;
 
@@ -515,7 +514,7 @@ void
 hosts_db_init(void)
 {
    assert(hosts_db == NULL);
-   hosts_db = hashtable_make(HOST_BITS, hosts_max, hosts_keep,
+   hosts_db = hashtable_make(HOST_BITS, opt_hosts_max, opt_hosts_keep,
       hash_func_host, free_func_host, key_func_host, find_func_host,
       make_func_host, format_cols_host, format_row_host);
 }
@@ -806,7 +805,7 @@ host_get_port_tcp(struct bucket *host, const uint16_t port)
    struct host *h = &host->u.host;
    assert(h != NULL);
    if (h->ports_tcp == NULL)
-      h->ports_tcp = hashtable_make(PORT_BITS, ports_max, ports_keep,
+      h->ports_tcp = hashtable_make(PORT_BITS, opt_ports_max, opt_ports_keep,
          hash_func_short, free_func_simple, key_func_port_tcp,
          find_func_port_tcp, make_func_port_tcp,
          format_cols_port_tcp, format_row_port_tcp);
@@ -822,7 +821,7 @@ host_get_port_udp(struct bucket *host, const uint16_t port)
    struct host *h = &host->u.host;
    assert(h != NULL);
    if (h->ports_udp == NULL)
-      h->ports_udp = hashtable_make(PORT_BITS, ports_max, ports_keep,
+      h->ports_udp = hashtable_make(PORT_BITS, opt_ports_max, opt_ports_keep,
          hash_func_short, free_func_simple, key_func_port_udp,
          find_func_port_udp, make_func_port_udp,
          format_cols_port_udp, format_row_port_udp);
@@ -855,7 +854,7 @@ static struct str *html_hosts_detail(const char *ip);
 struct str *
 html_hosts(const char *uri, const char *query)
 {
-   int i, num_elems;
+   unsigned int i, num_elems;
    char **elem = split('/', uri, &num_elems);
    struct str *buf = NULL;
 
@@ -880,11 +879,11 @@ html_hosts(const char *uri, const char *query)
  * Format hashtable into HTML.
  */
 static void
-format_table(struct str *buf, struct hashtable *ht, int start,
+format_table(struct str *buf, struct hashtable *ht, unsigned int start,
    const enum sort_dir sort, const int full)
 {
    const struct bucket **table;
-   uint32_t i, pos, end;
+   unsigned int i, pos, end;
    int alt = 0;
 
    if ((ht == NULL) || (ht->count == 0)) {
@@ -910,7 +909,7 @@ format_table(struct str *buf, struct hashtable *ht, int start,
    } else
       end = min(ht->count, (uint32_t)start+MAX_ENTRIES);
 
-   str_appendf(buf, "(%u-%u of %u)<br/>\n", start+1, end, ht->count);
+   str_appendf(buf, "(%u-%u of %u)<br>\n", start+1, end, ht->count);
    qsort_buckets(table, ht->count, start, end, sort);
    ht->format_cols_func(buf);
 
@@ -974,17 +973,16 @@ html_hosts_main(const char *qs)
 #define NEXT "next page &gt;&gt;&gt;"
 #define FULL "full table"
 
-   str_append(buf, html_header_1);
-   str_appendf(buf, " <title>darkstat3: Hosts (%s)</title>\n", interface);
-   str_append(buf, html_header_2);
-   str_appendf(buf, "<h2 class=\"pageheader\">Hosts (%s)</h2>\n", interface);
+   html_open(buf, "Hosts", /*want_graph_js=*/0);
    format_table(buf, hosts_db, start, sort, full);
 
    /* <prev | full | stats | next> */
    sortstr = qs_sort;
    if (sortstr == NULL) sortstr = "total";
    if (start > 0) {
-      int prev = max(start - MAX_ENTRIES, 0);
+      int prev = start - MAX_ENTRIES;
+      if (prev < 0)
+         prev = 0;
       str_appendf(buf, "<a href=\"?start=%d&sort=%s\">" PREV "</a>",
          prev, sortstr);
    } else
@@ -1002,8 +1000,9 @@ html_hosts_main(const char *qs)
    else
       str_append(buf, " | " NEXT);
 
-   str_append(buf, "<br/>\n");
-   str_append(buf, html_footer);
+   str_append(buf, "<br>\n");
+
+   html_close(buf);
 done:
    if (qs_start != NULL) free(qs_start);
    if (qs_sort != NULL) free(qs_sort);
@@ -1033,25 +1032,22 @@ html_hosts_detail(const char *ip)
 
    /* Overview. */
    buf = str_make();
-   str_append(buf, html_header_1);
-   str_appendf(buf, " <title>%s</title>\n", ip);
-   str_append(buf, html_header_2);
-   str_appendf(buf, "<h2>%s</h2>\n", ip);
+   html_open(buf, ip, /*want_graph_js=*/0);
    if (strcmp(ip, canonical) != 0)
       str_appendf(buf, "(canonically <b>%s</b>)\n", canonical);
    str_appendf(buf,
       "<p>\n"
-       "<b>Hostname:</b> %s<br/>\n",
+       "<b>Hostname:</b> %s<br>\n",
       (h->u.host.dns == NULL)?"(resolving...)":h->u.host.dns);
 
    /* Resolve host "on demand" */
    if (h->u.host.dns == NULL)
       dns_queue(&(h->u.host.addr));
 
-   if (show_mac_addrs)
+   if (hosts_db_show_macs)
       str_appendf(buf,
          "<b>MAC Address:</b> "
-         "<tt>%x:%x:%x:%x:%x:%x</tt><br/>\n",
+         "<tt>%x:%x:%x:%x:%x:%x</tt><br>\n",
          h->u.host.mac_addr[0],
          h->u.host.mac_addr[1],
          h->u.host.mac_addr[2],
@@ -1082,9 +1078,9 @@ html_hosts_detail(const char *ip)
    str_appendf(buf,
       "</p>\n"
       "<p>\n"
-      " <b>In:</b> %'qu<br/>\n"
-      " <b>Out:</b> %'qu<br/>\n"
-      " <b>Total:</b> %'qu<br/>\n"
+      " <b>In:</b> %'qu<br>\n"
+      " <b>Out:</b> %'qu<br>\n"
+      " <b>Total:</b> %'qu<br>\n"
       "</p>\n",
       h->in, h->out, h->total);
 
@@ -1097,7 +1093,7 @@ html_hosts_detail(const char *ip)
    str_append(buf, "<h3>IP protocols</h3>\n");
    format_table(buf, h->u.host.ip_protos, 0,TOTAL,0);
 
-   str_append(buf, html_footer);
+   html_close(buf);
    return (buf);
 }
 
@@ -1117,7 +1113,8 @@ static const char
 
 static const unsigned char
    export_tag_host_ver1[] = {'H', 'S', 'T', 0x01},
-   export_tag_host_ver2[] = {'H', 'S', 'T', 0x02};
+   export_tag_host_ver2[] = {'H', 'S', 'T', 0x02},
+   export_tag_host_ver3[] = {'H', 'S', 'T', 0x03};
 
 /* ---------------------------------------------------------------------------
  * Load a host's ip_proto table from a file.
@@ -1230,7 +1227,9 @@ hosts_db_import_host(const int fd)
    int ver = 0;
 
    if (!readn(fd, hdr, sizeof(hdr))) return 0;
-   if (memcmp(hdr, export_tag_host_ver2, sizeof(hdr)) == 0)
+   if (memcmp(hdr, export_tag_host_ver3, sizeof(hdr)) == 0)
+      ver = 3;
+   else if (memcmp(hdr, export_tag_host_ver2, sizeof(hdr)) == 0)
       ver = 2;
    else if (memcmp(hdr, export_tag_host_ver1, sizeof(hdr)) == 0)
       ver = 1;
@@ -1240,7 +1239,14 @@ hosts_db_import_host(const int fd)
       return 0;
    }
 
-   if (!readaddr(fd, &a)) return 0;
+   if (ver == 3) {
+      if (!readaddr(fd, &a))
+         return 0;
+   } else {
+      assert((ver == 1) || (ver == 2));
+      if (!readaddr_ipv4(fd, &a))
+         return 0;
+   }
    verbosef("at file pos %u, importing host %s", pos, addr_to_str(&a));
    host = host_get(&a);
    assert(addr_equal(&(host->u.host.addr), &a));
@@ -1318,7 +1324,7 @@ int hosts_db_export(const int fd)
    for (i = 0; i<hosts_db->size; i++)
    for (b = hosts_db->table[i]; b != NULL; b = b->next) {
       /* For each host: */
-      if (!writen(fd, export_tag_host_ver2, sizeof(export_tag_host_ver2)))
+      if (!writen(fd, export_tag_host_ver3, sizeof(export_tag_host_ver3)))
          return 0;
 
       if (!writeaddr(fd, &(b->u.host.addr))) return 0;