removed some raw EAP debug output
[strongswan.git] / src / manager / controller / control_controller.c
index 9d0789d..fdf66bf 100644 (file)
@@ -1,10 +1,3 @@
-/**
- * @file control_controller.c
- *
- * @brief Implementation of control_controller_t.
- *
- */
-
 /*
  * Copyright (C) 2007 Martin Willi
  * Hochschule fuer Technik Rapperswil
@@ -40,7 +33,7 @@ struct private_control_controller_t {
         * public functions
         */
        control_controller_t public;
-       
+
        /**
         * manager instance
         */
@@ -48,17 +41,46 @@ struct private_control_controller_t {
 };
 
 /**
- * terminate a IKE or CHILD SA
+ * handle the result of a control operation
  */
-static void terminate(private_control_controller_t *this, request_t *r,
-                                         bool ike, u_int32_t id)
+static void handle_result(private_control_controller_t *this, request_t *r,
+                                                 enumerator_t *e)
 {
-       gateway_t *gateway;
+       enumerator_t *e1;
+       xml_t *xml;
+       char *name, *value;
+       int num = 0;
 
-       gateway = this->manager->select_gateway(this->manager, 0);
-       if (gateway->terminate(gateway, ike, id))
+       if (e)
        {
-               r->redirect(r, "status/ikesalist");
+               while (e->enumerate(e, &xml, &name, &value))
+               {
+                       if (streq(name, "status"))
+                       {
+                               if (value && atoi(value) == 0)
+                               {
+                                       r->set(r, "result", "Operation executed successfully:");
+                               }
+                               else
+                               {
+                                       r->set(r, "result", "Operation failed:");
+                               }
+                       }
+                       else if (streq(name, "log"))
+                       {
+                               e1 = xml->children(xml);
+                               while (e1->enumerate(e1, &xml, &name, &value))
+                               {
+                                       if (streq(name, "item"))
+                                       {
+                                               r->setf(r, "log.%d=%s", ++num, value);
+                                       }
+                               }
+                               e1->destroy(e1);
+                       }
+               }
+               e->destroy(e);
+               r->render(r, "templates/control/result.cs");
        }
        else
        {
@@ -69,6 +91,36 @@ static void terminate(private_control_controller_t *this, request_t *r,
 }
 
 /**
+ * initiate an IKE or CHILD SA
+ */
+static void initiate(private_control_controller_t *this, request_t *r,
+                                        bool ike, char *config)
+{
+       gateway_t *gateway;
+       enumerator_t *e;
+
+       r->setf(r, "title=Establishing %s SA %s", ike ? "IKE" : "CHILD", config);
+       gateway = this->manager->select_gateway(this->manager, 0);
+       e = gateway->initiate(gateway, ike, config);
+       handle_result(this, r, e);
+}
+
+/**
+ * terminate an IKE or CHILD SA
+ */
+static void terminate(private_control_controller_t *this, request_t *r,
+                                         bool ike, u_int32_t id)
+{
+       gateway_t *gateway;
+       enumerator_t *e;
+
+       r->setf(r, "title=Terminate %s SA %d", ike ? "IKE" : "CHILD", id);
+       gateway = this->manager->select_gateway(this->manager, 0);
+       e = gateway->terminate(gateway, ike, id);
+       handle_result(this, r, e);
+}
+
+/**
  * Implementation of controller_t.get_name
  */
 static char* get_name(private_control_controller_t *this)
@@ -80,7 +132,7 @@ static char* get_name(private_control_controller_t *this)
  * Implementation of controller_t.handle
  */
 static void handle(private_control_controller_t *this,
-                                  request_t *request, char *action, char *strid)
+                                  request_t *request, char *action, char *str)
 {
        if (!this->manager->logged_in(this->manager))
        {
@@ -93,23 +145,37 @@ static void handle(private_control_controller_t *this,
        if (action)
        {
                u_int32_t id;
-       
+
                if (streq(action, "terminateike"))
                {
-                       if (strid && (id = atoi(strid)))
+                       if (str && (id = atoi(str)))
                        {
                                return terminate(this, request, TRUE, id);
                        }
                }
                if (streq(action, "terminatechild"))
                {
-                       if (strid && (id = atoi(strid)))
+                       if (str && (id = atoi(str)))
                        {
                                return terminate(this, request, FALSE, id);
                        }
                }
+               if (streq(action, "initiateike"))
+               {
+                       if (str)
+                       {
+                               return initiate(this, request, TRUE, str);
+                       }
+               }
+               if (streq(action, "initiatechild"))
+               {
+                       if (str)
+                       {
+                               return initiate(this, request, FALSE, str);
+                       }
+               }
        }
-       return request->redirect(request, "status/ikesalist");
+       return request->redirect(request, "ikesa/list");
 }
 
 /**
@@ -130,9 +196,9 @@ controller_t *control_controller_create(context_t *context, void *param)
        this->public.controller.get_name = (char*(*)(controller_t*))get_name;
        this->public.controller.handle = (void(*)(controller_t*,request_t*,char*,char*,char*,char*,char*))handle;
        this->public.controller.destroy = (void(*)(controller_t*))destroy;
-       
+
        this->manager = (manager_t*)context;
-       
+
        return &this->public.controller;
 }