Annotation of embedaddon/strongswan/src/manager/controller/control_controller.c, revision 1.1.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>