Annotation of embedaddon/strongswan/src/conftest/actions.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2010 Martin Willi
3: * Copyright (C) 2010 revosec AG
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 "actions.h"
17: #include "conftest.h"
18:
19: #include <daemon.h>
20: #include <processing/jobs/callback_job.h>
21: #include <processing/jobs/rekey_ike_sa_job.h>
22: #include <processing/jobs/rekey_child_sa_job.h>
23: #include <processing/jobs/send_dpd_job.h>
24:
25: typedef struct private_actions_t private_actions_t;
26:
27: /**
28: * Private data of an actions_t object.
29: */
30: struct private_actions_t {
31:
32: /**
33: * Public actions_t interface.
34: */
35: actions_t public;
36: };
37:
38: /**
39: * Initiate a CHILD_SA
40: */
41: static job_requeue_t initiate(char *config)
42: {
43: peer_cfg_t *peer_cfg;
44: child_cfg_t *child_cfg = NULL, *current;
45: enumerator_t *enumerator;
46:
47: peer_cfg = charon->backends->get_peer_cfg_by_name(charon->backends, config);
48: if (!peer_cfg)
49: {
50: DBG1(DBG_CFG, "initiating '%s' failed, config not found", config);
51: return JOB_REQUEUE_NONE;
52: }
53: enumerator = peer_cfg->create_child_cfg_enumerator(peer_cfg);
54: while (enumerator->enumerate(enumerator, ¤t))
55: {
56: if (streq(current->get_name(current), config))
57: {
58: child_cfg = current;
59: child_cfg->get_ref(child_cfg);
60: break;
61: }
62: }
63: enumerator->destroy(enumerator);
64: if (child_cfg)
65: {
66: DBG1(DBG_CFG, "initiating IKE_SA for CHILD_SA config '%s'", config);
67: charon->controller->initiate(charon->controller, peer_cfg, child_cfg,
68: NULL, NULL, 0, FALSE);
69: }
70: else
71: {
72: DBG1(DBG_CFG, "initiating '%s' failed, CHILD_SA config not found",
73: config);
74: }
75:
76: return JOB_REQUEUE_NONE;
77: }
78:
79: /**
80: * Rekey an IKE_SA
81: */
82: static job_requeue_t rekey_ike(char *config)
83: {
84: enumerator_t *enumerator;
85: job_t *job = NULL;
86: ike_sa_t *ike_sa;
87:
88: enumerator = charon->controller->create_ike_sa_enumerator(
89: charon->controller, TRUE);
90: while (enumerator->enumerate(enumerator, &ike_sa))
91: {
92: if (strcaseeq(config, ike_sa->get_name(ike_sa)))
93: {
94: job = (job_t*)rekey_ike_sa_job_create(ike_sa->get_id(ike_sa), FALSE);
95: break;
96: }
97: }
98: enumerator->destroy(enumerator);
99:
100: if (job)
101: {
102: DBG1(DBG_CFG, "starting rekey of IKE_SA '%s'", config);
103: lib->processor->queue_job(lib->processor, job);
104: }
105: else
106: {
107: DBG1(DBG_CFG, "rekeying '%s' failed, IKE_SA not found", config);
108: }
109: return JOB_REQUEUE_NONE;
110: }
111:
112: /**
113: * Rekey an CHILD_SA
114: */
115: static job_requeue_t rekey_child(char *config)
116: {
117: enumerator_t *enumerator, *children;
118: ike_sa_t *ike_sa;
119: child_sa_t *child_sa;
120: uint32_t spi, proto;
121: host_t *dst = NULL;
122:
123: enumerator = charon->controller->create_ike_sa_enumerator(
124: charon->controller, TRUE);
125: while (enumerator->enumerate(enumerator, &ike_sa))
126: {
127: children = ike_sa->create_child_sa_enumerator(ike_sa);
128: while (children->enumerate(children, &child_sa))
129: {
130: if (streq(config, child_sa->get_name(child_sa)))
131: {
132: dst = ike_sa->get_my_host(ike_sa);
133: dst = dst->clone(dst);
134: proto = child_sa->get_protocol(child_sa);
135: spi = child_sa->get_spi(child_sa, TRUE);
136: break;
137: }
138: }
139: children->destroy(children);
140: }
141: enumerator->destroy(enumerator);
142: if (dst)
143: {
144: DBG1(DBG_CFG, "starting rekey of CHILD_SA '%s'", config);
145: lib->processor->queue_job(lib->processor,
146: (job_t*)rekey_child_sa_job_create(proto, spi, dst));
147: dst->destroy(dst);
148: }
149: else
150: {
151: DBG1(DBG_CFG, "rekeying '%s' failed, CHILD_SA not found", config);
152: }
153: return JOB_REQUEUE_NONE;
154: }
155:
156: /**
157: * Do a liveness check
158: */
159: static job_requeue_t liveness(char *config)
160: {
161: enumerator_t *enumerator;
162: job_t *job = NULL;
163: ike_sa_t *ike_sa;
164:
165: enumerator = charon->controller->create_ike_sa_enumerator(
166: charon->controller, TRUE);
167: while (enumerator->enumerate(enumerator, &ike_sa))
168: {
169: if (strcaseeq(config, ike_sa->get_name(ike_sa)))
170: {
171: job = (job_t*)send_dpd_job_create(ike_sa->get_id(ike_sa));
172: break;
173: }
174: }
175: enumerator->destroy(enumerator);
176:
177: if (job)
178: {
179: DBG1(DBG_CFG, "starting liveness check of IKE_SA '%s'", config);
180: lib->processor->queue_job(lib->processor, job);
181: }
182: else
183: {
184: DBG1(DBG_CFG, "liveness check for '%s' failed, IKE_SA not found", config);
185: }
186: return JOB_REQUEUE_NONE;
187: }
188:
189: /**
190: * Close an IKE_SA with all CHILD_SAs
191: */
192: static job_requeue_t close_ike(char *config)
193: {
194: enumerator_t *enumerator;
195: ike_sa_t *ike_sa;
196: int id = 0;
197:
198: enumerator = charon->controller->create_ike_sa_enumerator(
199: charon->controller, TRUE);
200: while (enumerator->enumerate(enumerator, &ike_sa))
201: {
202: if (strcaseeq(config, ike_sa->get_name(ike_sa)))
203: {
204: id = ike_sa->get_unique_id(ike_sa);
205: break;
206: }
207: }
208: enumerator->destroy(enumerator);
209: if (id)
210: {
211: DBG1(DBG_CFG, "closing IKE_SA '%s'", config);
212: charon->controller->terminate_ike(charon->controller, id, FALSE, NULL,
213: NULL, 0);
214: }
215: else
216: {
217: DBG1(DBG_CFG, "unable to close IKE_SA '%s', not found", config);
218: }
219: return JOB_REQUEUE_NONE;
220: }
221:
222: /**
223: * Close a CHILD_SAs
224: */
225: static job_requeue_t close_child(char *config)
226: {
227: enumerator_t *enumerator, *children;
228: ike_sa_t *ike_sa;
229: child_sa_t *child_sa;
230: int id = 0;
231:
232: enumerator = charon->controller->create_ike_sa_enumerator(
233: charon->controller, TRUE);
234: while (enumerator->enumerate(enumerator, &ike_sa))
235: {
236:
237: children = ike_sa->create_child_sa_enumerator(ike_sa);
238: while (children->enumerate(children, (void**)&child_sa))
239: {
240: if (streq(config, child_sa->get_name(child_sa)))
241: {
242: id = child_sa->get_unique_id(child_sa);
243: break;
244: }
245: }
246: children->destroy(children);
247: }
248: enumerator->destroy(enumerator);
249: if (id)
250: {
251: DBG1(DBG_CFG, "closing CHILD_SA '%s'", config);
252: charon->controller->terminate_child(charon->controller, id,
253: NULL, NULL, 0);
254: }
255: else
256: {
257: DBG1(DBG_CFG, "unable to close CHILD_SA '%s', not found", config);
258: }
259: return JOB_REQUEUE_NONE;
260: }
261:
262: /**
263: * Load a single action
264: */
265: static void load_action(settings_t *settings, char *action)
266: {
267: static struct {
268: char *name;
269: callback_job_cb_t cb;
270: } actions[] = {
271: {"initiate", (void*)initiate},
272: {"rekey_ike", (void*)rekey_ike},
273: {"rekey_child", (void*)rekey_child},
274: {"liveness", (void*)liveness},
275: {"close_ike", (void*)close_ike},
276: {"close_child", (void*)close_child},
277: };
278: bool found = FALSE;
279: int i;
280:
281: for (i = 0; i < countof(actions); i++)
282: {
283: if (strncaseeq(actions[i].name, action, strlen(actions[i].name)))
284: {
285: int delay;
286: char *config;
287:
288: found = TRUE;
289: delay = settings->get_int(settings, "actions.%s.delay", 0, action);
290: config = settings->get_str(settings, "actions.%s.config",
291: NULL, action);
292: if (!config)
293: {
294: DBG1(DBG_CFG, "no config defined for action '%s'", action);
295: break;
296: }
297: lib->scheduler->schedule_job(lib->scheduler,
298: (job_t*)callback_job_create(actions[i].cb, config, NULL, NULL),
299: delay);
300: }
301: }
302: if (!found)
303: {
304: DBG1(DBG_CFG, "unknown action '%s', skipped", action);
305: }
306: }
307:
308: /**
309: * Load configured actions
310: */
311: static void load_actions(settings_t *settings)
312: {
313: enumerator_t *enumerator;
314: char *action;
315:
316: enumerator = settings->create_section_enumerator(settings, "actions");
317: while (enumerator->enumerate(enumerator, &action))
318: {
319: load_action(settings, action);
320: }
321: enumerator->destroy(enumerator);
322: }
323:
324: METHOD(actions_t, destroy, void,
325: private_actions_t *this)
326: {
327: free(this);
328: }
329:
330: /**
331: * See header
332: */
333: actions_t *actions_create()
334: {
335: private_actions_t *this;
336:
337: INIT(this,
338: .public = {
339: .destroy = _destroy,
340: },
341: );
342:
343: load_actions(conftest->test);
344:
345: return &this->public;
346: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>