X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/8d14d66b84cc370cefe54b33de1b95bb49c90bf6..3cdd1ba5400b97412d8e69fdcf59284b7cde6e28:/keyd.c diff --git a/keyd.c b/keyd.c index 18d09bf..5d5b7ba 100644 --- a/keyd.c +++ b/keyd.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -16,6 +17,7 @@ #include #include #include +#include #include #include "charfuncs.h" @@ -28,6 +30,9 @@ #include "mem.h" #include "onak-conf.h" #include "parsekey.h" +#include "version.h" + +static struct keyd_stats *stats; void daemonize(void) { @@ -69,7 +74,7 @@ void iteratefunc(void *ctx, struct openpgp_publickey *key) storebuf.buffer = malloc(8192); logthing(LOGTHING_TRACE, - "Iterating over 0x%016llX.", + "Iterating over 0x%016" PRIX64 ".", get_keyid(key)); flatten_publickey(key, @@ -125,7 +130,7 @@ int sock_init(const char *sockname) int sock_do(int fd) { - int cmd = KEYD_CMD_UNKNOWN; + uint32_t cmd = KEYD_CMD_UNKNOWN; ssize_t bytes = 0; ssize_t count = 0; int ret = 0; @@ -148,10 +153,17 @@ int sock_do(int fd) } if (ret == 0) { + if (cmd < KEYD_CMD_LAST) { + stats->command_stats[cmd]++; + } else { + stats->command_stats[KEYD_CMD_UNKNOWN]++; + } switch (cmd) { case KEYD_CMD_VERSION: cmd = KEYD_REPLY_OK; write(fd, &cmd, sizeof(cmd)); + cmd = sizeof(keyd_version); + write(fd, &cmd, sizeof(cmd)); write(fd, &keyd_version, sizeof(keyd_version)); break; case KEYD_CMD_GET: @@ -164,7 +176,8 @@ int sock_do(int fd) storebuf.offset = 0; if (ret == 0) { logthing(LOGTHING_INFO, - "Fetching 0x%llX, result: %d", + "Fetching 0x%" PRIX64 + ", result: %d", keyid, config.dbbackend-> fetch_key(keyid, &key, false)); @@ -294,7 +307,8 @@ int sock_do(int fd) } if (ret == 0) { logthing(LOGTHING_INFO, - "Deleting 0x%llX, result: %d", + "Deleting 0x%" PRIX64 + ", result: %d", keyid, config.dbbackend->delete_key( keyid, false)); @@ -309,6 +323,8 @@ int sock_do(int fd) } if (ret == 0) { keyid = config.dbbackend->getfullkeyid(keyid); + cmd = sizeof(keyid); + write(fd, &cmd, sizeof(cmd)); write(fd, &keyid, sizeof(keyid)); } break; @@ -321,11 +337,26 @@ int sock_do(int fd) write(fd, &bytes, sizeof(bytes)); break; case KEYD_CMD_CLOSE: + cmd = KEYD_REPLY_OK; + write(fd, &cmd, sizeof(cmd)); ret = 1; break; case KEYD_CMD_QUIT: + cmd = KEYD_REPLY_OK; + write(fd, &cmd, sizeof(cmd)); + logthing(LOGTHING_NOTICE, + "Exiting due to quit request."); + ret = 1; trytocleanup(); break; + case KEYD_CMD_STATS: + cmd = KEYD_REPLY_OK; + write(fd, &cmd, sizeof(cmd)); + cmd = sizeof(*stats); + write(fd, &cmd, sizeof(cmd)); + write(fd, stats, + sizeof(*stats)); + break; default: logthing(LOGTHING_ERROR, "Got unknown command: %d", cmd); @@ -357,6 +388,7 @@ int sock_accept(int fd) } if (ret != -1) { + stats->connects++; while (!sock_do(srv)) ; sock_close(srv); } @@ -364,6 +396,19 @@ int sock_accept(int fd) return 1; } +static void usage(void) +{ + puts("keyd " ONAK_VERSION " - backend key serving daemon for the " + "onak PGP keyserver.\n"); + puts("Usage:\n"); + puts("\tkeyd [options]\n"); + puts("\tOptions:\n:"); + puts("-c - use as the config file"); + puts("-f - run in the foreground"); + puts("-h - show this help text"); + exit(EXIT_FAILURE); +} + int main(int argc, char *argv[]) { int fd = -1; @@ -373,7 +418,7 @@ int main(int argc, char *argv[]) bool foreground = false; int optchar; - while ((optchar = getopt(argc, argv, "c:f")) != -1 ) { + while ((optchar = getopt(argc, argv, "c:fh")) != -1 ) { switch (optchar) { case 'c': configfile = strdup(optarg); @@ -381,6 +426,10 @@ int main(int argc, char *argv[]) case 'f': foreground = true; break; + case 'h': + default: + usage(); + break; } } @@ -388,13 +437,24 @@ int main(int argc, char *argv[]) free(configfile); configfile = NULL; initlogthing("keyd", config.logfile); + config.use_keyd = false; if (!foreground) { daemonize(); } catchsignals(); - + signal(SIGPIPE, SIG_IGN); + + + stats = calloc(1, sizeof(*stats)); + if (!stats) { + logthing(LOGTHING_ERROR, + "Couldn't allocate memory for stats structure."); + exit(EXIT_FAILURE); + } + stats->started = time(NULL); + snprintf(sockname, 1023, "%s/%s", config.db_dir, KEYD_SOCKET); fd = sock_init(sockname); @@ -415,6 +475,8 @@ int main(int argc, char *argv[]) unlink(sockname); } + free(stats); + cleanuplogthing(); cleanupconfig();