Added options to whack to query in-memory leases.
authorTobias Brunner <tobias@strongswan.org>
Wed, 31 Mar 2010 11:10:11 +0000 (13:10 +0200)
committerTobias Brunner <tobias@strongswan.org>
Tue, 6 Apr 2010 10:47:39 +0000 (12:47 +0200)
src/pluto/rcv_whack.c
src/starter/starterwhack.c
src/whack/whack.c
src/whack/whack.h

index 826a1aa..aa68881 100644 (file)
@@ -57,6 +57,7 @@
 #include "myid.h"
 #include "kernel_alg.h"
 #include "ike_alg.h"
+#include "whack_attribute.h"
 
 /* helper variables and function to decode strings from whack message */
 
@@ -326,6 +327,8 @@ void whack_handle(int whackctlfd)
                || !unpack_str(&msg.ike)                /* string 24 */
                || !unpack_str(&msg.esp)                /* string 25 */
                || !unpack_str(&msg.sc_data)            /* string 26 */
+               || !unpack_str(&msg.whack_lease_ip)     /* string 27 */
+               || !unpack_str(&msg.whack_lease_id)     /* string 28 */
                || str_roof - next_str != (ptrdiff_t)msg.keyval.len)    /* check chunk */
                {
                        ugh = "message from whack contains bad string";
@@ -469,6 +472,11 @@ void whack_handle(int whackctlfd)
                free_ocsp_cache();
        }
 
+       if (msg.whack_leases)
+       {
+               list_leases(msg.name, msg.whack_lease_ip, msg.whack_lease_id);
+       }
+
    if (msg.whack_list & LIST_PUBKEYS)
        {
                list_public_keys(msg.whack_utc);
index f28d537..527142a 100644 (file)
@@ -91,6 +91,8 @@ static int send_whack_msg (whack_message_t *msg)
        ||  !pack_str(&msg->ike,            &str_next, &str_roof)
        ||  !pack_str(&msg->esp,            &str_next, &str_roof)
        ||  !pack_str(&msg->sc_data,        &str_next, &str_roof)
+       ||  !pack_str(&msg->whack_lease_ip, &str_next, &str_roof)
+       ||  !pack_str(&msg->whack_lease_id, &str_next, &str_roof)
        ||  (str_roof - str_next < msg->keyval.len))
        {
                plog("send_wack_msg(): can't pack strings");
index c458d67..5f98610 100644 (file)
@@ -185,6 +185,10 @@ static void help(void)
                        " [--debug-private]"
                        "\n\n"
 #endif
+               "leases: whack --leases"
+                       " [--name <connection_name>]"
+                       " [--lease-addr <ip-address> | --lease-id <identity>]"
+                       "\n\n"
                "listen: whack"
                        " (--listen | --unlisten)"
                        "\n\n"
@@ -322,6 +326,10 @@ enum {
        OPT_LISTEN,
        OPT_UNLISTEN,
 
+       OPT_LEASES,
+       OPT_LEASEADDR,
+       OPT_LEASEID,
+
        OPT_PURGEOCSP,
 
        OPT_REREADSECRETS,
@@ -519,6 +527,10 @@ static const struct option long_opts[] = {
        { "listen", no_argument, NULL, OPT_LISTEN + OO },
        { "unlisten", no_argument, NULL, OPT_UNLISTEN + OO },
 
+       { "leases", no_argument, NULL, OPT_LEASES + OO },
+       { "lease-addr", required_argument, NULL, OPT_LEASEADDR + OO },
+       { "lease-id", required_argument, NULL, OPT_LEASEID + OO },
+
        { "purgeocsp", no_argument, NULL, OPT_PURGEOCSP + OO },
 
        { "rereadsecrets", no_argument, NULL, OPT_REREADSECRETS + OO },
@@ -1103,6 +1115,18 @@ int main(int argc, char **argv)
                                diagq("0.0.0.0 or 0::0 isn't a valid client address", optarg);
                        continue;
 
+               case OPT_LEASES:        /* --leases */
+                       msg.whack_leases = TRUE;
+                       continue;
+
+               case OPT_LEASEADDR:     /* --lease-addr <ip-address> */
+                       msg.whack_lease_ip = optarg;      /* decoded by Pluto */
+                       continue;
+
+               case OPT_LEASEID:       /* --lease-id <identity> */
+                       msg.whack_lease_id = optarg;      /* decoded by Pluto */
+                       continue;
+
                case OPT_LISTEN:        /* --listen */
                        msg.whack_listen = TRUE;
                        continue;
@@ -1618,6 +1642,12 @@ int main(int argc, char **argv)
                break;
        }
 
+       /* check leases */
+       if (LHAS(opts_seen, OPT_LEASEADDR) && LHAS(opts_seen, OPT_LEASEID))
+       {
+               diag("--lease-addr and --lease-id cannot be used together");
+       }
+
        /* check connection description */
        if (LHAS(opts_seen, OPT_CD))
        {
@@ -1682,7 +1712,7 @@ int main(int argc, char **argv)
                if (!LHAS(opts_seen, OPT_NAME) && !msg.whack_ca)
                        diag("missing --name <connection_name>");
        }
-       else if (!msg.whack_options && !msg.whack_status)
+       else if (!msg.whack_options && !msg.whack_status && !msg.whack_leases)
        {
                if (LHAS(opts_seen, OPT_NAME))
                        diag("no reason for --name");
@@ -1698,9 +1728,10 @@ int main(int argc, char **argv)
        || msg.whack_delete || msg.whack_deletestate
        || msg.whack_initiate || msg.whack_oppo_initiate || msg.whack_terminate
        || msg.whack_route || msg.whack_unroute || msg.whack_listen
-       || msg.whack_unlisten || msg.whack_list || msg.whack_purgeocsp || msg.whack_reread
-       || msg.whack_ca || msg.whack_status || msg.whack_options || msg.whack_shutdown
-       || msg.whack_sc_op))
+       || msg.whack_unlisten || msg.whack_list || msg.whack_purgeocsp
+       || msg.whack_reread || msg.whack_ca || msg.whack_status
+       || msg.whack_options || msg.whack_shutdown || msg.whack_sc_op
+       || msg.whack_leases))
        {
                diag("no action specified; try --help for hints");
        }
@@ -1771,6 +1802,8 @@ int main(int argc, char **argv)
        ||  !pack_str(&msg.ike)              /* string 24 */
        ||  !pack_str(&msg.esp)              /* string 25 */
        ||  !pack_str(&msg.sc_data)          /* string 26 */
+       ||  !pack_str(&msg.whack_lease_ip)   /* string 27 */
+       ||  !pack_str(&msg.whack_lease_id)   /* string 28 */
        ||  str_roof - next_str < (ptrdiff_t)msg.keyval.len)
                diag("too many bytes of strings to fit in message to pluto");
 
index 3f66a7b..b495d34 100644 (file)
@@ -65,7 +65,7 @@ struct whack_end {
        int   sourceip_mask;
        ip_address host_addr;
        ip_address host_nexthop;
-       ip_address host_srcip;  
+       ip_address host_srcip;
        ip_subnet client;
        bool key_from_DNS_on_demand;
        bool has_client;
@@ -177,6 +177,10 @@ struct whack_message {
        bool whack_deletestate;
        so_serial_t whack_deletestateno;
 
+       /* for WHACK_LEASES: */
+       bool whack_leases;
+       char *whack_lease_ip, *whack_lease_id;
+
        /* for WHACK_LISTEN: */
        bool whack_listen, whack_unlisten;