Annotation of embedaddon/strongswan/src/manager/controller/control_controller.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2007 Martin Willi
! 3: * HSR Hochschule fuer Technik Rapperswil
! 4: *
! 5: * This program is free software; you can redistribute it and/or modify it
! 6: * under the terms of the GNU General Public License as published by the
! 7: * Free Software Foundation; either version 2 of the License, or (at your
! 8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 9: *
! 10: * This program is distributed in the hope that it will be useful, but
! 11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 13: * for more details.
! 14: */
! 15:
! 16: #include "control_controller.h"
! 17: #include "../manager.h"
! 18: #include "../gateway.h"
! 19:
! 20: #include <xml.h>
! 21:
! 22: #include <library.h>
! 23:
! 24:
! 25: typedef struct private_control_controller_t private_control_controller_t;
! 26:
! 27: /**
! 28: * private data of the task manager
! 29: */
! 30: struct private_control_controller_t {
! 31:
! 32: /**
! 33: * public functions
! 34: */
! 35: control_controller_t public;
! 36:
! 37: /**
! 38: * manager instance
! 39: */
! 40: manager_t *manager;
! 41: };
! 42:
! 43: /**
! 44: * handle the result of a control operation
! 45: */
! 46: static void handle_result(private_control_controller_t *this, fast_request_t *r,
! 47: enumerator_t *e)
! 48: {
! 49: enumerator_t *e1;
! 50: xml_t *xml;
! 51: char *name, *value;
! 52: int num = 0;
! 53:
! 54: if (e)
! 55: {
! 56: while (e->enumerate(e, &xml, &name, &value))
! 57: {
! 58: if (streq(name, "status"))
! 59: {
! 60: if (value && atoi(value) == 0)
! 61: {
! 62: r->set(r, "result", "Operation executed successfully:");
! 63: }
! 64: else
! 65: {
! 66: r->set(r, "result", "Operation failed:");
! 67: }
! 68: }
! 69: else if (streq(name, "log"))
! 70: {
! 71: e1 = xml->children(xml);
! 72: while (e1->enumerate(e1, &xml, &name, &value))
! 73: {
! 74: if (streq(name, "item"))
! 75: {
! 76: r->setf(r, "log.%d=%s", ++num, value);
! 77: }
! 78: }
! 79: e1->destroy(e1);
! 80: }
! 81: }
! 82: e->destroy(e);
! 83: r->render(r, "templates/control/result.cs");
! 84: }
! 85: else
! 86: {
! 87: r->set(r, "title", "Error");
! 88: r->set(r, "error", "controlling the gateway failed");
! 89: r->render(r, "templates/error.cs");
! 90: }
! 91: }
! 92:
! 93: /**
! 94: * initiate an IKE or CHILD SA
! 95: */
! 96: static void initiate(private_control_controller_t *this, fast_request_t *r,
! 97: bool ike, char *config)
! 98: {
! 99: gateway_t *gateway;
! 100: enumerator_t *e;
! 101:
! 102: r->setf(r, "title=Establishing %s SA %s", ike ? "IKE" : "CHILD", config);
! 103: gateway = this->manager->select_gateway(this->manager, 0);
! 104: e = gateway->initiate(gateway, ike, config);
! 105: handle_result(this, r, e);
! 106: }
! 107:
! 108: /**
! 109: * terminate an IKE or CHILD SA
! 110: */
! 111: static void terminate(private_control_controller_t *this, fast_request_t *r,
! 112: bool ike, uint32_t id)
! 113: {
! 114: gateway_t *gateway;
! 115: enumerator_t *e;
! 116:
! 117: r->setf(r, "title=Terminate %s SA %d", ike ? "IKE" : "CHILD", id);
! 118: gateway = this->manager->select_gateway(this->manager, 0);
! 119: e = gateway->terminate(gateway, ike, id);
! 120: handle_result(this, r, e);
! 121: }
! 122:
! 123: METHOD(fast_controller_t, get_name, char*,
! 124: private_control_controller_t *this)
! 125: {
! 126: return "control";
! 127: }
! 128:
! 129: METHOD(fast_controller_t, handle, void,
! 130: private_control_controller_t *this, fast_request_t *request, char *action,
! 131: char *str, char *p3, char *p4, char *p5)
! 132: {
! 133: if (!this->manager->logged_in(this->manager))
! 134: {
! 135: return request->redirect(request, "auth/login");
! 136: }
! 137: if (this->manager->select_gateway(this->manager, 0) == NULL)
! 138: {
! 139: return request->redirect(request, "gateway/list");
! 140: }
! 141: if (action)
! 142: {
! 143: uint32_t id;
! 144:
! 145: if (streq(action, "terminateike"))
! 146: {
! 147: if (str && (id = atoi(str)))
! 148: {
! 149: return terminate(this, request, TRUE, id);
! 150: }
! 151: }
! 152: if (streq(action, "terminatechild"))
! 153: {
! 154: if (str && (id = atoi(str)))
! 155: {
! 156: return terminate(this, request, FALSE, id);
! 157: }
! 158: }
! 159: if (streq(action, "initiateike"))
! 160: {
! 161: if (str)
! 162: {
! 163: return initiate(this, request, TRUE, str);
! 164: }
! 165: }
! 166: if (streq(action, "initiatechild"))
! 167: {
! 168: if (str)
! 169: {
! 170: return initiate(this, request, FALSE, str);
! 171: }
! 172: }
! 173: }
! 174: return request->redirect(request, "ikesa/list");
! 175: }
! 176:
! 177: METHOD(fast_controller_t, destroy, void,
! 178: private_control_controller_t *this)
! 179: {
! 180: free(this);
! 181: }
! 182:
! 183: /*
! 184: * see header file
! 185: */
! 186: fast_controller_t *control_controller_create(fast_context_t *context,
! 187: void *param)
! 188: {
! 189: private_control_controller_t *this;
! 190:
! 191: INIT(this,
! 192: .public = {
! 193: .controller = {
! 194: .get_name = _get_name,
! 195: .handle = _handle,
! 196: .destroy = _destroy,
! 197: },
! 198: },
! 199: .manager = (manager_t*)context,
! 200: );
! 201:
! 202: return &this->public.controller;
! 203: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>