ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/conf.C
(Generate patch)

Comparing gvpe/src/conf.C (file contents):
Revision 1.12 by pcg, Mon Apr 7 01:12:56 2003 UTC vs.
Revision 1.31 by pcg, Thu Mar 3 16:54:34 2005 UTC

1/* 1/*
2 conf.c -- configuration code 2 conf.c -- configuration code
3 Copyright (C) 1998 Robert van der Meulen 3 Copyright (C) 2003-2005 Marc Lehmann <gvpe@schmorp.de>
4 1998-2002 Ivo Timmermans <ivo@o2w.nl>
5 2000-2002 Guus Sliepen <guus@sliepen.eu.org>
6 2000 Cris van Pelt <tribbel@arise.dhs.org>
7 2003 Marc Lehmann <pcg@goof.com>
8 4
5 This file is part of GVPE.
6
9 This program is free software; you can redistribute it and/or modify 7 GVPE is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by 8 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or 9 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version. 10 (at your option) any later version.
13 11
14 This program is distributed in the hope that it will be useful, 12 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details. 15 GNU General Public License for more details.
18 16
19 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software 18 along with gvpe; if not, write to the Free Software
21 Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22*/ 20*/
23 21
24#include "config.h" 22#include "config.h"
25 23
31#include <netdb.h> 29#include <netdb.h>
32#include <sys/stat.h> 30#include <sys/stat.h>
33#include <sys/types.h> 31#include <sys/types.h>
34#include <unistd.h> 32#include <unistd.h>
35 33
36#include <netinet/in.h> 34#include "netcompat.h"
37 35
38#include <openssl/err.h> 36#include <openssl/err.h>
39#include <openssl/pem.h> 37#include <openssl/pem.h>
40#include <openssl/rsa.h> 38#include <openssl/rsa.h>
41#include <openssl/rand.h> 39#include <openssl/rand.h>
40#include <openssl/bn.h>
42 41
43#include "gettext.h" 42#include "gettext.h"
44 43
45#include "conf.h" 44#include "conf.h"
46#include "slog.h" 45#include "slog.h"
47#include "util.h" 46#include "util.h"
48 47
49char *confbase; 48char *confbase;
50char *thisnode; 49char *thisnode;
51char *identname; 50char *identname;
52char *pidfilename;
53 51
54struct configuration conf; 52struct configuration conf;
55 53
56u8 best_protocol (u8 protset) 54u8 best_protocol (u8 protset)
57{ 55{
58 if (protset & PROT_IPv4 ) return PROT_IPv4; 56 if (protset & PROT_IPv4 ) return PROT_IPv4;
57 if (protset & PROT_ICMPv4) return PROT_ICMPv4;
59 if (protset & PROT_UDPv4) return PROT_UDPv4; 58 if (protset & PROT_UDPv4 ) return PROT_UDPv4;
60 if (protset & PROT_TCPv4) return PROT_TCPv4; 59 if (protset & PROT_TCPv4 ) return PROT_TCPv4;
60 if (protset & PROT_DNSv4 ) return PROT_DNSv4;
61 61
62 return 0; 62 return 0;
63} 63}
64 64
65const char *strprotocol (u8 protocol) 65const char *strprotocol (u8 protocol)
66{ 66{
67 if (protocol & PROT_IPv4 ) return "rawip"; 67 if (protocol & PROT_IPv4 ) return "rawip";
68 if (protocol & PROT_ICMPv4) return "icmp";
68 if (protocol & PROT_UDPv4) return "udp"; 69 if (protocol & PROT_UDPv4 ) return "udp";
69 if (protocol & PROT_TCPv4) return "tcp"; 70 if (protocol & PROT_TCPv4 ) return "tcp";
71 if (protocol & PROT_DNSv4 ) return "dns";
70 72
71 return "<unknown>"; 73 return "<unknown>";
72} 74}
73 75
74void 76void
93 if (rsa_key) 95 if (rsa_key)
94 RSA_free (rsa_key); 96 RSA_free (rsa_key);
95 97
96 free (nodename); 98 free (nodename);
97 free (hostname); 99 free (hostname);
100#if ENABLE_DNS
101 free (domain);
102 free (dns_hostname);
103#endif
98} 104}
99 105
100void configuration::init () 106void configuration::init ()
101{ 107{
102 memset (this, 0, sizeof (*this)); 108 memset (this, 0, sizeof (*this));
103 109
110 mtu = DEFAULT_MTU;
104 rekey = DEFAULT_REKEY; 111 rekey = DEFAULT_REKEY;
105 keepalive = DEFAULT_KEEPALIVE; 112 keepalive = DEFAULT_KEEPALIVE;
106 llevel = L_INFO; 113 llevel = L_INFO;
107 ip_proto = IPPROTO_GRE; 114 ip_proto = IPPROTO_GRE;
115#if ENABLE_ICMP
116 icmp_type = ICMP_ECHOREPLY;
117#endif
108 118
109 default_node.udp_port = DEFAULT_UDPPORT; 119 default_node.udp_port = DEFAULT_UDPPORT;
110 default_node.tcp_port = DEFAULT_UDPPORT; 120 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm
111 default_node.connectmode = conf_node::C_ALWAYS; 121 default_node.connectmode = conf_node::C_ALWAYS;
112 default_node.compress = true; 122 default_node.compress = true;
113 default_node.protocols = PROT_UDPv4; 123 default_node.protocols = 0;
124 default_node.max_retry = DEFAULT_MAX_RETRY;
125
126#if ENABLE_DNS
127 default_node.dns_port = 53;
128 dns_forw_port = 53;
129#endif
130
131 conf.pidfilename = strdup (LOCALSTATEDIR "/run/gvpe.pid");
114} 132}
115 133
116void configuration::cleanup() 134void configuration::cleanup()
117{ 135{
118 if (rsa_key) 136 if (rsa_key)
119 RSA_free (rsa_key); 137 RSA_free (rsa_key);
120 138
121 rsa_key = 0; 139 rsa_key = 0;
122 140
141 free (pidfilename); pidfilename = 0;
123 free (ifname); ifname = 0; 142 free (ifname); ifname = 0;
124#if ENABLE_HTTP_PROXY 143#if ENABLE_HTTP_PROXY
125 free (proxy_host); proxy_host = 0; 144 free (proxy_host); proxy_host = 0;
126 free (proxy_auth); proxy_auth = 0; 145 free (proxy_auth); proxy_auth = 0;
146#endif
147#if ENABLE_DNS
148 free (dns_forw_host); dns_forw_host = 0;
127#endif 149#endif
128} 150}
129 151
130void 152void
131configuration::clear_config () 153configuration::clear_config ()
156 char *fname; 178 char *fname;
157 FILE *f; 179 FILE *f;
158 180
159 clear_config (); 181 clear_config ();
160 182
161 asprintf (&fname, "%s/vped.conf", confbase); 183 asprintf (&fname, "%s/gvpe.conf", confbase);
162 f = fopen (fname, "r"); 184 f = fopen (fname, "r");
163 185
164 if (f) 186 if (f)
165 { 187 {
166 char line[16384]; 188 char line[16384];
223 else 245 else
224 slog (L_WARN, "'%s': %s, at '%s' line %d", val, UNKNOWN_LOGLEVEL, fname, line); 246 slog (L_WARN, "'%s': %s, at '%s' line %d", val, UNKNOWN_LOGLEVEL, fname, line);
225 } 247 }
226 else if (!strcmp (var, "ip-proto")) 248 else if (!strcmp (var, "ip-proto"))
227 ip_proto = atoi (val); 249 ip_proto = atoi (val);
250 else if (!strcmp (var, "icmp-type"))
251 {
252#if ENABLE_ICMP
253 icmp_type = atoi (val);
254#endif
255 }
228 256
229 // per config 257 // per config
230 else if (!strcmp (var, "node")) 258 else if (!strcmp (var, "node"))
231 { 259 {
232 default_node.id++; 260 default_node.id++;
250 278
251 if (!PEM_read_RSAPublicKey(f, &node->rsa_key, NULL, NULL)) 279 if (!PEM_read_RSAPublicKey(f, &node->rsa_key, NULL, NULL))
252 { 280 {
253 ERR_load_RSA_strings (); ERR_load_PEM_strings (); 281 ERR_load_RSA_strings (); ERR_load_PEM_strings ();
254 slog (L_ERR, _("unable to open public rsa key file '%s': %s"), fname, ERR_error_string (ERR_get_error (), 0)); 282 slog (L_ERR, _("unable to open public rsa key file '%s': %s"), fname, ERR_error_string (ERR_get_error (), 0));
255 exit (1); 283 exit (EXIT_FAILURE);
256 } 284 }
257 285
258 RSA_blinding_on (node->rsa_key, 0); 286 require (RSA_blinding_on (node->rsa_key, 0));
259 287
260 fclose (f); 288 fclose (f);
261 } 289 }
262 else 290 else
263 { 291 {
264 slog (need_keys ? L_ERR : L_NOTICE, _("unable to read public rsa key file '%s': %s"), fname, strerror (errno)); 292 slog (need_keys ? L_ERR : L_NOTICE, _("unable to read public rsa key file '%s': %s"), fname, strerror (errno));
265 293
266 if (need_keys) 294 if (need_keys)
267 exit (1); 295 exit (EXIT_FAILURE);
268 } 296 }
269 297
270 free (fname); 298 free (fname);
271 } 299 }
272 300
273 if (!::thisnode || !strcmp (node->nodename, ::thisnode)) 301 if (::thisnode && !strcmp (node->nodename, ::thisnode))
274 thisnode = node; 302 thisnode = node;
275 } 303 }
276 else if (!strcmp (var, "private-key")) 304 else if (!strcmp (var, "private-key"))
277 prikeyfile = strdup (val); 305 free (prikeyfile), prikeyfile = strdup (val);
278 else if (!strcmp (var, "ifpersist")) 306 else if (!strcmp (var, "ifpersist"))
279 { 307 {
280 parse_bool (ifpersist, "ifpersist", true, false); 308 parse_bool (ifpersist, "ifpersist", true, false);
281 } 309 }
282 else if (!strcmp (var, "ifname")) 310 else if (!strcmp (var, "ifname"))
283 ifname = strdup (val); 311 free (ifname), ifname = strdup (val);
284 else if (!strcmp (var, "rekey")) 312 else if (!strcmp (var, "rekey"))
285 rekey = atoi (val); 313 rekey = atoi (val);
286 else if (!strcmp (var, "keepalive")) 314 else if (!strcmp (var, "keepalive"))
287 keepalive = atoi (val); 315 keepalive = atoi (val);
288 else if (!strcmp (var, "mtu")) 316 else if (!strcmp (var, "mtu"))
289 mtu = atoi (val); 317 mtu = atoi (val);
290 else if (!strcmp (var, "if-up")) 318 else if (!strcmp (var, "if-up"))
291 script_if_up = strdup (val); 319 free (script_if_up), script_if_up = strdup (val);
292 else if (!strcmp (var, "node-up")) 320 else if (!strcmp (var, "node-up"))
293 script_node_up = strdup (val); 321 free (script_node_up), script_node_up = strdup (val);
294 else if (!strcmp (var, "node-down")) 322 else if (!strcmp (var, "node-down"))
295 script_node_down = strdup (val); 323 free (script_node_down), script_node_down = strdup (val);
324 else if (!strcmp (var, "pid-file"))
325 free (pidfilename), pidfilename = strdup (val);
326#if ENABLE_DNS
327 else if (!strcmp (var, "dns-forw-host"))
328 free (dns_forw_host), dns_forw_host = strdup (val);
329 else if (!strcmp (var, "dns-forw-port"))
330 dns_forw_port = atoi (val);
331#endif
332 else if (!strcmp (var, "http-proxy-host"))
333 {
296#if ENABLE_HTTP_PROXY 334#if ENABLE_HTTP_PROXY
297 else if (!strcmp (var, "http-proxy-host"))
298 proxy_host = strdup (val); 335 free (proxy_host), proxy_host = strdup (val);
336#endif
337 }
299 else if (!strcmp (var, "http-proxy-port")) 338 else if (!strcmp (var, "http-proxy-port"))
339 {
340#if ENABLE_HTTP_PROXY
300 proxy_port = atoi (val); 341 proxy_port = atoi (val);
342#endif
343 }
301 else if (!strcmp (var, "http-proxy-auth")) 344 else if (!strcmp (var, "http-proxy-auth"))
345 {
346#if ENABLE_HTTP_PROXY
302 proxy_auth = (char *)base64_encode ((const u8 *)val, strlen (val)); 347 proxy_auth = (char *)base64_encode ((const u8 *)val, strlen (val));
303#endif 348#endif
349 }
304 350
305 /* node-specific, non-defaultable */ 351 /* node-specific, non-defaultable */
306 else if (node != &default_node && !strcmp (var, "hostname")) 352 else if (node != &default_node && !strcmp (var, "hostname"))
307 {
308 free (node->hostname);
309 node->hostname = strdup (val); 353 free (node->hostname), node->hostname = strdup (val);
310 }
311 354
312 /* node-specific, defaultable */ 355 /* node-specific, defaultable */
313 else if (!strcmp (var, "udp-port")) 356 else if (!strcmp (var, "udp-port"))
314 node->udp_port = atoi (val); 357 node->udp_port = atoi (val);
315 else if (!strcmp (var, "tcp-port")) 358 else if (!strcmp (var, "tcp-port"))
316 node->tcp_port = atoi (val); 359 node->tcp_port = atoi (val);
360#if ENABLE_DNS
361 else if (!strcmp (var, "dns-hostname"))
362 free (node->dns_hostname), node->dns_hostname = strdup (val);
363 else if (!strcmp (var, "dns-port"))
364 node->dns_port = atoi (val);
365#endif
366 else if (!strcmp (var, "dns-domain"))
367 {
368#if ENABLE_DNS
369 free (node->domain), node->domain = strdup (val);
370#endif
371 }
317 else if (!strcmp (var, "router-priority")) 372 else if (!strcmp (var, "router-priority"))
318 node->routerprio = atoi (val); 373 node->routerprio = atoi (val);
374 else if (!strcmp (var, "max-retry"))
375 node->max_retry = atoi (val);
319 else if (!strcmp (var, "connect")) 376 else if (!strcmp (var, "connect"))
320 { 377 {
321 if (!strcmp (val, "ondemand")) 378 if (!strcmp (val, "ondemand"))
322 node->connectmode = conf_node::C_ONDEMAND; 379 node->connectmode = conf_node::C_ONDEMAND;
323 else if (!strcmp (val, "never")) 380 else if (!strcmp (val, "never"))
326 node->connectmode = conf_node::C_ALWAYS; 383 node->connectmode = conf_node::C_ALWAYS;
327 else if (!strcmp (val, "disabled")) 384 else if (!strcmp (val, "disabled"))
328 node->connectmode = conf_node::C_DISABLED; 385 node->connectmode = conf_node::C_DISABLED;
329 else 386 else
330 slog (L_WARN, 387 slog (L_WARN,
331 _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled', at '%s' line %d"), 388 _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled', at '%s' line %d"),
332 var, fname, lineno); 389 var, fname, lineno);
333 } 390 }
334 else if (!strcmp (var, "inherit-tos")) 391 else if (!strcmp (var, "inherit-tos"))
335 { 392 {
336 parse_bool (node->inherit_tos, "inherit-tos", true, false); 393 parse_bool (node->inherit_tos, "inherit-tos", true, false);
337 } 394 }
342 // all these bool options really really cost a lot of executable size! 399 // all these bool options really really cost a lot of executable size!
343 else if (!strcmp (var, "enable-tcp")) 400 else if (!strcmp (var, "enable-tcp"))
344 { 401 {
345#if ENABLE_TCP 402#if ENABLE_TCP
346 u8 v; parse_bool (v, "enable-tcp" , PROT_TCPv4, 0); node->protocols = (node->protocols & ~PROT_TCPv4) | v; 403 u8 v; parse_bool (v, "enable-tcp" , PROT_TCPv4, 0); node->protocols = (node->protocols & ~PROT_TCPv4) | v;
404#endif
405 }
406 else if (!strcmp (var, "enable-icmp"))
407 {
408#if ENABLE_ICMP
409 u8 v; parse_bool (v, "enable-icmp" , PROT_ICMPv4, 0); node->protocols = (node->protocols & ~PROT_ICMPv4) | v;
410#endif
411 }
412 else if (!strcmp (var, "enable-dns"))
413 {
414#if ENABLE_DNS
415 u8 v; parse_bool (v, "enable-dns" , PROT_DNSv4, 0); node->protocols = (node->protocols & ~PROT_DNSv4) | v;
347#endif 416#endif
348 } 417 }
349 else if (!strcmp (var, "enable-udp")) 418 else if (!strcmp (var, "enable-udp"))
350 { 419 {
351 u8 v; parse_bool (v, "enable-udp" , PROT_UDPv4, 0); node->protocols = (node->protocols & ~PROT_UDPv4) | v; 420 u8 v; parse_bool (v, "enable-udp" , PROT_UDPv4, 0); node->protocols = (node->protocols & ~PROT_UDPv4) | v;
365 fclose (f); 434 fclose (f);
366 } 435 }
367 else 436 else
368 { 437 {
369 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno)); 438 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno));
370 exit (1); 439 exit (EXIT_FAILURE);
371 } 440 }
372 441
373 free (fname); 442 free (fname);
374 443
375 fname = config_filename (prikeyfile, "hostkey"); 444 fname = config_filename (prikeyfile, "hostkey");
381 450
382 if (!PEM_read_RSAPrivateKey (f, &rsa_key, NULL, NULL)) 451 if (!PEM_read_RSAPrivateKey (f, &rsa_key, NULL, NULL))
383 { 452 {
384 ERR_load_RSA_strings (); ERR_load_PEM_strings (); 453 ERR_load_RSA_strings (); ERR_load_PEM_strings ();
385 slog (L_ERR, _("unable to read private rsa key file '%s': %s"), fname, ERR_error_string (ERR_get_error (), 0)); 454 slog (L_ERR, _("unable to read private rsa key file '%s': %s"), fname, ERR_error_string (ERR_get_error (), 0));
386 exit (1); 455 exit (EXIT_FAILURE);
387 } 456 }
388 457
389 RSA_blinding_on (rsa_key, 0); 458 require (RSA_blinding_on (rsa_key, 0));
390 459
391 fclose (f); 460 fclose (f);
392 } 461 }
393 else 462 else
394 { 463 {
395 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno)); 464 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno));
396 465
397 if (need_keys) 466 if (need_keys)
398 exit (1); 467 exit (EXIT_FAILURE);
399 } 468 }
469
470 if (need_keys && ::thisnode
471 && rsa_key && thisnode && thisnode->rsa_key)
472 if (BN_cmp (rsa_key->n, thisnode->rsa_key->n) != 0
473 || BN_cmp (rsa_key->e, thisnode->rsa_key->e) != 0)
474 {
475 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode);
476 exit (EXIT_FAILURE);
477 }
400 478
401 free (fname); 479 free (fname);
402} 480}
403 481
404char *configuration::config_filename (const char *name, const char *dflt) 482char *configuration::config_filename (const char *name, const char *dflt)
426 printf (_("MTU: %d\n"), mtu); 504 printf (_("MTU: %d\n"), mtu);
427 printf (_("rekeying interval: %d\n"), rekey); 505 printf (_("rekeying interval: %d\n"), rekey);
428 printf (_("keepalive interval: %d\n"), keepalive); 506 printf (_("keepalive interval: %d\n"), keepalive);
429 printf (_("interface: %s\n"), ifname); 507 printf (_("interface: %s\n"), ifname);
430 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>"); 508 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>");
431 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) : -1); 509 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) * 8 : -1);
432 printf ("\n"); 510 printf ("\n");
433 511
434 printf ("%4s %-17s %s %-8.8s %-10.10s %s\n", 512 printf ("%4s %-17s %s %-8.8s %-10.10s %s\n",
435 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Host:Port")); 513 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Host:Port"));
436 514
440 printf ("\n"); 518 printf ("\n");
441} 519}
442 520
443configuration::configuration () 521configuration::configuration ()
444{ 522{
523 asprintf (&confbase, "%s/gvpe", CONFDIR);
524
445 init (); 525 init ();
446} 526}
447 527
448configuration::~configuration () 528configuration::~configuration ()
449{ 529{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines