Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2003 Pekka Riikonen
+ Copyright (C) 2003 - 2004 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
{
FILE *fp;
char *hostname;
- char filename[256];
+ char filename[256], line[128];
+ int begin;
/* Generate data filename. First configure hostname is the filename */
silc_dlist_start(mapconn->hostnames);
/* Write the HTML page */
- fprintf(fp, "<!-- Automatically generated by silcmap --!>\n");
+ fprintf(fp, "<!-- Automatically generated by silcmap -->\n");
fprintf(fp, "<br /><hr ><br />\n");
/* General stuff */
fprintf(fp, "Algorithm</td><td> :</td><td> %s</td></tr>\n", public_key->name);
if (key_len) {
fprintf(fp, "<tr><td> ");
- fprintf(fp, "Key length (bits)</td><td> :</td><td> %d</td></tr>\n", (unsigned int)key_len);
+ fprintf(fp, "Key length</td><td> :</td><td> %d bits</td></tr>\n", (unsigned int)key_len);
}
if (ident->realname) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "Country</td><td> :</td><td> %s</td></tr>\n", ident->country);
}
fprintf(fp, "<tr><td> ");
- fprintf(fp, "Fingerprint (SHA1)</td><td> :</td><td> %s</td></tr>\n", fingerprint);
+ fprintf(fp, "Fingerprint</td><td> :</td><td> <tt>%s</tt></td></tr>\n", fingerprint);
fprintf(fp, "<tr><td> ");
- fprintf(fp, "Babbleprint (SHA1)</td><td> :</td><td> %s</td></tr>\n", babbleprint);
+ fprintf(fp, "Babbleprint</td><td> :</td><td> <tt>%s</tt></td></tr>\n", babbleprint);
fprintf(fp, "</table>\n");
pd = fopen(mapconn->public_key, "r");
return FALSE;
pk_len = silc_file_size(mapconn->public_key);
- pdd = silc_calloc(pk_len + 1, sizeof(*pdd));
+ pdd = silc_calloc(pk_len + 2, sizeof(*pdd));
if (!pdd)
return FALSE;
fread(pdd, pk_len, 1, pd);
+ pdd[pk_len] = EOF;
- fprintf(fp, "<pre><tt>\n");
- fprintf(fp, "%s", pdd);
- fprintf(fp, "</tt></pre>\n");
+ fprintf(fp, "<br /><tt><small>\n");
+ begin = 0;
+ while ((begin = silc_gets(line, sizeof(line) - 1, pdd, pk_len + 1,
+ begin)) != EOF)
+ fprintf(fp, "%s<br />\n", line);
+ fprintf(fp, "</small></tt><br />\n");
fclose(pd);
silc_free(pdd);
if (mapconn->clients) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "Local clients</td><td> :</td><td> %ld</td></tr>\n",
- mapconn->data.clients);
+ (unsigned long)mapconn->data.clients);
}
if (mapconn->channels) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "Local channels</td><td> :</td><td> %ld</td></tr>\n",
- mapconn->data.channels);
+ (unsigned long)mapconn->data.channels);
}
if (mapconn->server_ops) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "Local server operators</td><td> :</td><td> %ld</td></tr>\n",
- mapconn->data.server_ops);
+ (unsigned long)mapconn->data.server_ops);
}
if (mapconn->router_ops) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "Local router operators</td><td> :</td><td> %ld</td></tr>\n",
- mapconn->data.router_ops);
+ (unsigned long)mapconn->data.router_ops);
}
if (mapconn->cell_clients) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "Cell clients</td><td> :</td><td> %ld</td></tr>\n",
- mapconn->data.cell_clients);
+ (unsigned long)mapconn->data.cell_clients);
}
if (mapconn->cell_channels) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "Cell channels</td><td> :</td><td> %ld</td></tr>\n",
- mapconn->data.cell_channels);
+ (unsigned long)mapconn->data.cell_channels);
}
if (mapconn->cell_servers) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "Cell servers</td><td> :</td><td> %ld</td></tr>\n",
- mapconn->data.cell_servers);
+ (unsigned long)mapconn->data.cell_servers);
}
if (mapconn->all_clients) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "All SILC clients</td><td> :</td><td> %ld</td></tr>\n",
- mapconn->data.all_clients);
+ (unsigned long)mapconn->data.all_clients);
}
if (mapconn->all_channels) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "All SILC channels</td><td> :</td><td> %ld</td></tr>\n",
- mapconn->data.all_channels);
+ (unsigned long)mapconn->data.all_channels);
}
if (mapconn->all_servers) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "All SILC servers</td><td> :</td><td> %ld</td></tr>\n",
- mapconn->data.all_servers);
+ (unsigned long)mapconn->data.all_servers);
}
if (mapconn->all_routers) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "All SILC routers</td><td> :</td><td> %ld</td></tr>\n",
- mapconn->data.all_routers);
+ (unsigned long)mapconn->data.all_routers);
}
if (mapconn->all_server_ops) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "All SILC server operators</td><td> :</td><td> %ld</td></tr>\n",
- mapconn->data.all_server_ops);
+ (unsigned long)mapconn->data.all_server_ops);
}
if (mapconn->all_router_ops) {
fprintf(fp, "<tr><td> ");
fprintf(fp, "All SILC router operators</td><td> :</td><td> %ld</td></tr>\n",
- mapconn->data.all_router_ops);
+ (unsigned long)mapconn->data.all_router_ops);
}
fprintf(fp, "</table>\n");
}
/* motd */
- if (mapconn->motd) {
+ if (mapconn->motd && mapconn->data.motd) {
fprintf(fp, " <br /><hr ><br />\n");
fprintf(fp, "<b>Message of the Day:</b> <br />\n");
- fprintf(fp, "<pre><tt>%s</tt><pre>\n", mapconn->data.motd);
+
+ fprintf(fp, "<br /><tt><small>\n");
+ begin = 0;
+ while ((begin = silc_gets(line, sizeof(line) - 1, mapconn->data.motd,
+ strlen(mapconn->data.motd), begin)) != EOF)
+ fprintf(fp, "%s<br />\n", line);
+ fprintf(fp, "</small></tt>\n");
}
fprintf(fp, "<br />\n");
/* Produce a simple HTML index file of all servers */
class = map->writehtml.text ? map->writehtml.text : "silcmap";
- fprintf(fp, "<!-- Automatically generated by silcmap --!>\n");
+ fprintf(fp, "<!-- Automatically generated by silcmap -->\n");
fprintf(fp, "<br />\n");
fprintf(fp, "<table cellspacing=\"0\" cellpadding=\"0\" "
"class=\"%s\" border=\"0\">\n", class);
silc_dlist_start(mapconn->ips);
ip = silc_dlist_get(mapconn->ips);
+ fprintf(fp, "<tr>\n");
+ if (mapconn->html_url)
+ fprintf(fp,
+ "<td align = \"center\" class=\"%s\"> <a href=\"%s\">%s</a></td>\n", class, mapconn->html_url, hostname);
+ else
+ fprintf(fp,
+ "<td align = \"center\" class=\"%s\"> <a href=\"%s_%d.html\">%s</a></td>\n", class, hostname, mapconn->port, hostname);
fprintf(fp,
- "<tr>\n"
- "<td align = \"center\" class=\"%s\"> <a href=\"%s_%d.html\">%s</a></td>\n"
"<td align = \"center\" class=\"%s\"> %s</td>\n"
"<td align = \"center\" class=\"%s\"> %d</td>\n"
"<td align = \"center\" class=\"%s\"> %s</td>\n"
"<td align = \"center\" class=\"%s\"> %s</td>\n"
- "</tr>\n", class, hostname, mapconn->port,
- hostname, class, ip, class, mapconn->port, class,
+ "</tr>\n",
+ class, ip, class, mapconn->port, class,
mapconn->country, class, mapconn->admin);
}
bool silc_map_writemaphtml(SilcMap map)
{
SilcMapConnection mapconn;
- SilcMapCommand cmd;
+ SilcMapCommand cmd, c;
char *hostname, url[256];
FILE *fp;
- int xx , yy, w, h;
-
- /* Open for writing */
- fp = fopen(map->writemaphtml.filename, "w+");
- if (!fp) {
- fprintf(stderr, "Could not open file '%s'\n", map->writemaphtml.filename);
- return FALSE;
- }
-
- /* The target may be portion of the original map, so we must make the
- new coordinates relative to the new map. */
- xx = map->writemaphtml.x;
- yy = map->writemaphtml.y;
+ int i, xx , yy, w, h;
- memset(url, 0, sizeof(url));
-
- fprintf(fp, "<!-- Automatically generated by silcmap --!>\n");
- fprintf(fp, "<br />\n");
- fprintf(fp, "<img src=\"%s\" usemap=\"#map\" border=\"0\">\n",
- map->writemaphtml.text);
- fprintf(fp, "<map name=\"map\">\n");
-
- memset(url, 0, sizeof(url));
+ for (i = 0; i < map->writemaphtml_count; i++) {
+ c = &map->writemaphtml[i];
+ if (c->alon && c->alat) {
+ c->x = silc_map_lon2x(map, c->alon);
+ c->y = silc_map_lat2y(map, c->alat);
+ }
- silc_dlist_start(map->conns);
- while ((mapconn = silc_dlist_get(map->conns)) != SILC_LIST_END) {
- if (mapconn->writemaphtml_url && mapconn->writemaphtml_url[0]) {
- silc_strncat(url, sizeof(url), mapconn->writemaphtml_url,
- strlen(mapconn->writemaphtml_url));
- } else {
- silc_dlist_start(mapconn->hostnames);
- hostname = silc_dlist_get(mapconn->hostnames);
- snprintf(url, sizeof(url) - 1, "%s_%d.html", hostname, mapconn->port);
+ /* Open for writing */
+ fp = fopen(c->filename, "w+");
+ if (!fp) {
+ fprintf(stderr, "Could not open file '%s'\n", c->filename);
+ return FALSE;
}
- /* Print the positions of various items on the map into the map file */
- silc_dlist_start(mapconn->commands);
- while ((cmd = silc_dlist_get(mapconn->commands)) != SILC_LIST_END) {
- if (cmd->draw_text) {
- w = strlen(cmd->text) * 5;
- h = map->font.height - 2;
- fprintf(fp,
- "<area shape=\"rect\" coords=\"%d,%d,%d,%d\" href=\"%s\">\n",
- (int)(cmd->x - xx), (int)(cmd->y - yy), w, h, url);
+ /* The target may be portion of the original map, so we must make the
+ new coordinates relative to the new map. */
+ xx = c->x;
+ yy = c->y;
+
+ memset(url, 0, sizeof(url));
+
+ fprintf(fp, "<!-- Automatically generated by silcmap -->\n");
+ fprintf(fp, "<img src=\"%s\" usemap=\"#map\" class=\"silcmap\">\n",
+ c->text);
+ fprintf(fp, "<map name=\"map\">\n");
+
+ silc_dlist_start(map->conns);
+ while ((mapconn = silc_dlist_get(map->conns)) != SILC_LIST_END) {
+ memset(url, 0, sizeof(url));
+ if (mapconn->html_url && mapconn->html_url[0]) {
+ silc_strncat(url, sizeof(url), mapconn->html_url,
+ strlen(mapconn->html_url));
+ } else {
+ silc_dlist_start(mapconn->hostnames);
+ hostname = silc_dlist_get(mapconn->hostnames);
+ snprintf(url, sizeof(url) - 1, "%s_%d.html", hostname, mapconn->port);
}
- if (cmd->draw_circle) {
- w = 4;
- fprintf(fp,
- "<area shape=\"circle\" coords=\"%d,%d,%d\" href=\"%s\">\n",
- (int)(cmd->x - xx), (int)(cmd->y - yy), w, url);
- if (cmd->text) {
+ /* Print the positions of various items on the map into the map file */
+ silc_dlist_start(mapconn->commands);
+ while ((cmd = silc_dlist_get(mapconn->commands)) != SILC_LIST_END) {
+ if (cmd->alon && cmd->alat) {
+ cmd->x = silc_map_lon2x(map, cmd->alon);
+ cmd->y = silc_map_lat2y(map, cmd->alat);
+ }
+
+ if (cmd->draw_text) {
w = strlen(cmd->text) * 5;
h = map->font.height - 2;
fprintf(fp,
"<area shape=\"rect\" coords=\"%d,%d,%d,%d\" href=\"%s\">\n",
- (int)(cmd->x - xx + cmd->lposx),
- (int)(cmd->y - yy - cmd->lposy),
- (int)(cmd->x - xx + cmd->lposx + w),
- (int)(cmd->y - yy - cmd->lposy + h), url);
+ (int)(cmd->x - xx), (int)(cmd->y - yy), w, h, url);
}
- }
- if (cmd->draw_rectangle) {
- w = 7;
- h = 6;
- fprintf(fp,
- "<area shape=\"rect\" coords=\"%d,%d,%d,%d\" href=\"%s\">\n",
- (int)(cmd->x - xx), (int)(cmd->y - yy),
- (int)(cmd->x - xx + w), (int)(cmd->y - yy + h), url);
- if (cmd->text) {
- w = strlen(cmd->text) * 5;
- h = map->font.height - 2;
+ if (cmd->draw_circle) {
+ w = 4;
+ fprintf(fp,
+ "<area shape=\"circle\" coords=\"%d,%d,%d\" href=\"%s\">\n",
+ (int)(cmd->x - xx), (int)(cmd->y - yy), w, url);
+ if (cmd->text) {
+ w = strlen(cmd->text) * 5;
+ h = map->font.height - 2;
+ fprintf(fp,
+ "<area shape=\"rect\" coords=\"%d,%d,%d,%d\" href=\"%s\">\n",
+ (int)(cmd->x - xx + cmd->lposx),
+ (int)(cmd->y - yy - cmd->lposy),
+ (int)(cmd->x - xx + cmd->lposx + w),
+ (int)(cmd->y - yy - cmd->lposy + h), url);
+ }
+ }
+
+ if (cmd->draw_rectangle) {
+ w = 7;
+ h = 6;
fprintf(fp,
"<area shape=\"rect\" coords=\"%d,%d,%d,%d\" href=\"%s\">\n",
- (int)(cmd->x - xx + cmd->lposx),
- (int)(cmd->y - yy - cmd->lposy),
- (int)(cmd->x - xx + cmd->lposx + w),
- (int)(cmd->y - yy - cmd->lposy + h), url);
+ (int)(cmd->x - xx), (int)(cmd->y - yy),
+ (int)(cmd->x - xx + w), (int)(cmd->y - yy + h), url);
+ if (cmd->text) {
+ w = strlen(cmd->text) * 5;
+ h = map->font.height - 2;
+ fprintf(fp,
+ "<area shape=\"rect\" coords=\"%d,%d,%d,%d\" href=\"%s\">\n",
+ (int)(cmd->x - xx + cmd->lposx),
+ (int)(cmd->y - yy - cmd->lposy),
+ (int)(cmd->x - xx + cmd->lposx + w),
+ (int)(cmd->y - yy - cmd->lposy + h), url);
+ }
}
}
}
+
+ fprintf(fp, "</map>\n");
+ fclose(fp);
+ }
+
+ return TRUE;
+}
+
+/* Writes the server uptime reliablity data file. */
+
+bool silc_map_writerel(SilcMap map, SilcMapConnection mapconn)
+{
+ FILE *fp;
+ int try = 0, success = 0;
+ char f[256], *hostname;
+
+ /* Generate data filename */
+ memset(f, 0, sizeof(f));
+ silc_dlist_start(mapconn->hostnames);
+ hostname = silc_dlist_get(mapconn->hostnames);
+ snprintf(f, sizeof(f) - 1, "%s_%d.rel", hostname, mapconn->port);
+
+ /* Read the current data */
+ fp = fopen(f, "r");
+ if (fp) {
+ fscanf(fp, "%d:%d", &try, &success);
+ fclose(fp);
+ }
+
+ /* Update the data */
+ try++;
+ success = (mapconn->down == FALSE ? success + 1 : success);
+
+ /* Write the data file */
+ fp = fopen(f, "w+");
+ if (!fp) {
+ fprintf(stderr, "Could not open file '%s'\n", map->writerel.filename);
+ return FALSE;
}
+ fprintf(fp, "%d:%d", try, success);
- fprintf(fp, "</map><br />\n");
fclose(fp);
+ return TRUE;
+}
+
+/* Writes the servers' uptime reliability graph as HTML page. */
+
+bool silc_map_writerelhtml(SilcMap map)
+{
+ SilcMapConnection mapconn;
+ char *hostname, *class;
+ FILE *fp, *dp;
+
+ /* Open for writing */
+ fp = fopen(map->writerel.filename, "w+");
+ if (!fp) {
+ fprintf(stderr, "Could not open file '%s'\n", map->writerel.filename);
+ return FALSE;
+ }
+
+ /* Produce the reliability graph as HTML file. */
+ class = map->writerel.text ? map->writerel.text : "silcmap";
+
+ fprintf(fp, "<!-- Automatically generated by silcmap -->\n");
+ fprintf(fp, "<br />\n");
+ fprintf(fp, "<table cellspacing=\"0\" cellpadding=\"0\" "
+ "class=\"%s\" border=\"0\">\n", class);
+ fprintf(fp,
+ "<tr>\n"
+ "<td align=\"center\" class=\"%s_header\"><b>Server</b></td>\n"
+ "<td colspan=\"2\" align=\"center\" class=\"%s_header\"><b>Reliability</b></td>\n"
+ "</tr>\n", class, class);
+
+ silc_dlist_start(map->conns);
+ while ((mapconn = silc_dlist_get(map->conns)) != SILC_LIST_END) {
+ char f[256];
+ int try = 0, success = 0;
+ double rel = 0;
+
+ silc_dlist_start(mapconn->hostnames);
+ hostname = silc_dlist_get(mapconn->hostnames);
+
+ /* Get the data */
+ memset(f, 0, sizeof(f));
+ snprintf(f, sizeof(f) - 1, "%s_%d.rel", hostname, mapconn->port);
+ dp = fopen(f, "r");
+ if (dp) {
+ fscanf(dp, "%d:%d", &try, &success);
+ fclose(dp);
+ }
+
+ /* Count the reliability */
+ if (try)
+ rel = ((double)success / (double)try) * (double)160.0;
+
+ fprintf(fp, "<tr>\n");
+ if (mapconn->html_url)
+ fprintf(fp,
+ "<td align = \"center\" class=\"%s\"> <a href=\"%s\">%s</a></td>\n", class, mapconn->html_url, hostname);
+ else
+ fprintf(fp,
+ "<td align = \"center\" class=\"%s\"> <a href=\"%s_%d.html\">%s</a></td>\n", class, hostname, mapconn->port, hostname);
+ fprintf(fp,
+ "<td class=\"%s\" width=\"160\">"
+ "<table style=\"border: solid 1px black; width: 160px;\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"%s\"><tr>"
+ "<td style=\"width: %fpx; height: 10px;\" bgcolor=\"gray\"></td>"
+ "<td style=\"width: %fpx; height: 10px;\" bgcolor=\"white\"></td>"
+ "</tr></table></td>\n"
+ "<td class=\"%s\">%.2f%% - score: %d</td>\n"
+ "</tr>\n",
+ class, class, rel, 160 - rel, class,
+ ((double)success / (double)try) * (double)100.0, success);
+ }
+
+ fprintf(fp, "</table><br />\n");
return TRUE;
}