Alter debugging levels through control socket
authorScott Lamb <slamb@slamb.org>
Wed, 7 Nov 2007 02:50:27 +0000 (02:50 +0000)
committerScott Lamb <slamb@slamb.org>
Wed, 7 Nov 2007 02:50:27 +0000 (02:50 +0000)
doc/tinc.texi
doc/tincctl.8.in
doc/tincd.8.in
src/control.c
src/control_common.h
src/net.c
src/tincctl.c

index e953472..b3f570c 100644 (file)
@@ -1565,10 +1565,6 @@ Partially rereads configuration files.
 Connections to hosts whose host config file are removed are closed.
 New outgoing connections specified in @file{tinc.conf} will be made.
 
 Connections to hosts whose host config file are removed are closed.
 New outgoing connections specified in @file{tinc.conf} will be made.
 
-@item INT
-Temporarily increases debug level to 5.
-Send this signal again to revert to the original level.
-
 @end table
 
 @c ==================================================================
 @end table
 
 @c ==================================================================
@@ -1854,6 +1850,9 @@ Dump a graph of the VPN in dotty format.
 @item purge
 Purges all information remembered about unreachable nodes.
 
 @item purge
 Purges all information remembered about unreachable nodes.
 
+@item debug @var{level}
+Sets debug level to @var{level}.
+
 @end table
 
 
 @end table
 
 
index 40bd136..623c908 100644 (file)
@@ -78,6 +78,9 @@ Dump a graph of the VPN in
 format.
 .It purge
 Purges all information remembered about unreachable nodes.
 format.
 .It purge
 Purges all information remembered about unreachable nodes.
+.It debug Ar N
+Sets debug level to
+.Ar N .
 .El
 .Sh BUGS
 The "start", "restart", and "reload" commands are not yet implemented.
 .El
 .Sh BUGS
 The "start", "restart", and "reload" commands are not yet implemented.
index 96c773f..b3142e8 100644 (file)
@@ -95,9 +95,6 @@ Connections to hosts whose host config file are removed are closed.
 New outgoing connections specified in
 .Pa tinc.conf
 will be made.
 New outgoing connections specified in
 .Pa tinc.conf
 will be made.
-.It INT
-Temporarily increases debug level to 5.
-Send this signal again to revert to the original level.
 .El
 .Sh DEBUG LEVELS
 The tinc daemon can send a lot of messages to the syslog.
 .El
 .Sh DEBUG LEVELS
 The tinc daemon can send a lot of messages to the syslog.
index 2c5d4be..3e57f55 100644 (file)
@@ -38,6 +38,7 @@ static void handle_control_data(struct bufferevent *event, void *data) {
        size_t size;
        tinc_ctl_request_t res;
        struct evbuffer *res_data = NULL;
        size_t size;
        tinc_ctl_request_t res;
        struct evbuffer *res_data = NULL;
+       void *req_data;
 
        if(EVBUFFER_LENGTH(event->input) < sizeof(tinc_ctl_request_t))
                return;
 
        if(EVBUFFER_LENGTH(event->input) < sizeof(tinc_ctl_request_t))
                return;
@@ -47,6 +48,7 @@ static void handle_control_data(struct bufferevent *event, void *data) {
 
        if(EVBUFFER_LENGTH(event->input) < req.length)
                return;
 
        if(EVBUFFER_LENGTH(event->input) < req.length)
                return;
+       req_data = EVBUFFER_DATA(event->input) + sizeof(tinc_ctl_request_t);
 
        if(req.length < sizeof(tinc_ctl_request_t))
                goto failure;
 
        if(req.length < sizeof(tinc_ctl_request_t))
                goto failure;
@@ -103,6 +105,25 @@ static void handle_control_data(struct bufferevent *event, void *data) {
                goto respond;
        }
 
                goto respond;
        }
 
+       if(req.type == REQ_SET_DEBUG) {
+               debug_t new_debug_level;
+
+               logger(LOG_NOTICE, _("Got '%s' command"), "debug");
+               if(req.length != sizeof(req) + sizeof debug_level)
+                       res.res_errno = EINVAL;
+               else {
+                       memcpy(&new_debug_level, req_data, sizeof(debug_t));
+                       logger(LOG_NOTICE, _("Changing debug level from %d to %d"),
+                                  debug_level, new_debug_level);
+                       if(evbuffer_add_printf(res_data,
+                                                                  _("Changing debug level from %d to %d\n"),
+                                                                  debug_level, new_debug_level) == -1)
+                               res.res_errno = errno;
+                       debug_level = new_debug_level;
+               }
+               goto respond;
+       }
+
        logger(LOG_DEBUG, _("Malformed control command received"));
        res.res_errno = EINVAL;
 
        logger(LOG_DEBUG, _("Malformed control command received"));
        res.res_errno = EINVAL;
 
index bceaa71..2b77955 100644 (file)
@@ -32,6 +32,7 @@ enum request_type {
        REQ_DUMP_CONNECTIONS,
        REQ_DUMP_GRAPH,
        REQ_PURGE,
        REQ_DUMP_CONNECTIONS,
        REQ_DUMP_GRAPH,
        REQ_PURGE,
+       REQ_SET_DEBUG,
 };
 
 #define TINC_CTL_VERSION_CURRENT 0
 };
 
 #define TINC_CTL_VERSION_CURRENT 0
index 9d4a0a2..aaa035f 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -233,25 +233,6 @@ static void sigterm_handler(int signal, short events, void *data) {
        event_loopexit(NULL);
 }
 
        event_loopexit(NULL);
 }
 
-static void sigint_handler(int signal, short events, void *data) {
-       static int saved_debug_level = -1;
-
-       logger(LOG_NOTICE, _("Got %s signal"), strsignal(signal));
-
-       if(saved_debug_level != -1) {
-               logger(LOG_NOTICE, _("Reverting to old debug level (%d)"),
-                       saved_debug_level);
-               debug_level = saved_debug_level;
-               saved_debug_level = -1;
-       } else {
-               logger(LOG_NOTICE,
-                       _("Temporarily setting debug level to 5.  Kill me with SIGINT again to go back to level %d."),
-                       debug_level);
-               saved_debug_level = debug_level;
-               debug_level = 5;
-       }
-}
-
 static void sighup_handler(int signal, short events, void *data) {
        connection_t *c;
        splay_node_t *node, *next;
 static void sighup_handler(int signal, short events, void *data) {
        connection_t *c;
        splay_node_t *node, *next;
@@ -325,7 +306,6 @@ static void sigalrm_handler(int signal, short events, void *data) {
 int main_loop(void) {
        struct event timeout_event;
        struct event sighup_event;
 int main_loop(void) {
        struct event timeout_event;
        struct event sighup_event;
-       struct event sigint_event;
        struct event sigterm_event;
        struct event sigquit_event;
        struct event sigalrm_event;
        struct event sigterm_event;
        struct event sigquit_event;
        struct event sigalrm_event;
@@ -336,8 +316,6 @@ int main_loop(void) {
        event_add(&timeout_event, &(struct timeval){pingtimeout, 0});
        signal_set(&sighup_event, SIGHUP, sighup_handler, NULL);
        signal_add(&sighup_event, NULL);
        event_add(&timeout_event, &(struct timeval){pingtimeout, 0});
        signal_set(&sighup_event, SIGHUP, sighup_handler, NULL);
        signal_add(&sighup_event, NULL);
-       signal_set(&sigint_event, SIGINT, sigint_handler, NULL);
-       signal_add(&sigint_event, NULL);
        signal_set(&sigterm_event, SIGTERM, sigterm_handler, NULL);
        signal_add(&sigterm_event, NULL);
        signal_set(&sigquit_event, SIGQUIT, sigterm_handler, NULL);
        signal_set(&sigterm_event, SIGTERM, sigterm_handler, NULL);
        signal_add(&sigterm_event, NULL);
        signal_set(&sigquit_event, SIGQUIT, sigterm_handler, NULL);
@@ -351,7 +329,6 @@ int main_loop(void) {
        }
 
        signal_del(&sighup_event);
        }
 
        signal_del(&sighup_event);
-       signal_del(&sigint_event);
        signal_del(&sigterm_event);
        signal_del(&sigquit_event);
        signal_del(&sigalrm_event);
        signal_del(&sigterm_event);
        signal_del(&sigquit_event);
        signal_del(&sigalrm_event);
index 56179c6..bff122b 100644 (file)
@@ -90,6 +90,7 @@ static void usage(bool status) {
                                "    connections              - all meta connections with ourself\n"
                                "    graph                    - graph of the VPN in dotty format\n"
                                "  purge                      Purge unreachable nodes\n"
                                "    connections              - all meta connections with ourself\n"
                                "    graph                    - graph of the VPN in dotty format\n"
                                "  purge                      Purge unreachable nodes\n"
+                               "  debug N                    Set debug level\n"
                                "\n"));
                printf(_("Report bugs to tinc@tinc-vpn.org.\n"));
        }
                                "\n"));
                printf(_("Report bugs to tinc@tinc-vpn.org.\n"));
        }
@@ -583,6 +584,18 @@ int main(int argc, char *argv[], char *envp[]) {
                return send_ctl_request_cooked(fd, REQ_PURGE, NULL, 0) != -1;
        }
 
                return send_ctl_request_cooked(fd, REQ_PURGE, NULL, 0) != -1;
        }
 
+       if(!strcasecmp(argv[optind], "debug")) {
+               int debuglevel;
+
+               if(argc != optind + 2) {
+                       fprintf(stderr, "Invalid arguments.\n");
+                       return 1;
+               }
+               debuglevel = atoi(argv[optind+1]);
+               return send_ctl_request_cooked(fd, REQ_SET_DEBUG, &debuglevel,
+                                                                          sizeof(debuglevel)) != -1;
+       }
+
        fprintf(stderr, _("Unknown command `%s'.\n"), argv[optind]);
        usage(true);
        
        fprintf(stderr, _("Unknown command `%s'.\n"), argv[optind]);
        usage(true);