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.16 by pcg, Tue Oct 14 03:22:09 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#include <arpa/inet.h>
38#ifdef ENABLE_ICMP
39# ifdef HAVE_NETINET_IN_SYSTM_H
40# include <netinet/in_systm.h>
41# endif
42# ifdef HAVE_NETINET_IP_H
43# include <netinet/ip.h>
44# endif
45# include <netinet/ip_icmp.h>
46#endif
47 35
48#include <openssl/err.h> 36#include <openssl/err.h>
49#include <openssl/pem.h> 37#include <openssl/pem.h>
50#include <openssl/rsa.h> 38#include <openssl/rsa.h>
51#include <openssl/rand.h> 39#include <openssl/rand.h>
40#include <openssl/bn.h>
52 41
53#include "gettext.h" 42#include "gettext.h"
54 43
55#include "conf.h" 44#include "conf.h"
56#include "slog.h" 45#include "slog.h"
57#include "util.h" 46#include "util.h"
58 47
59char *confbase; 48char *confbase;
60char *thisnode; 49char *thisnode;
61char *identname; 50char *identname;
62char *pidfilename;
63 51
64struct configuration conf; 52struct configuration conf;
65 53
66u8 best_protocol (u8 protset) 54u8 best_protocol (u8 protset)
67{ 55{
68 if (protset & PROT_IPv4 ) return PROT_IPv4; 56 if (protset & PROT_IPv4 ) return PROT_IPv4;
69 if (protset & PROT_ICMPv4) return PROT_ICMPv4; 57 if (protset & PROT_ICMPv4) return PROT_ICMPv4;
70 if (protset & PROT_UDPv4 ) return PROT_UDPv4; 58 if (protset & PROT_UDPv4 ) return PROT_UDPv4;
71 if (protset & PROT_TCPv4 ) return PROT_TCPv4; 59 if (protset & PROT_TCPv4 ) return PROT_TCPv4;
60 if (protset & PROT_DNSv4 ) return PROT_DNSv4;
72 61
73 return 0; 62 return 0;
74} 63}
75 64
76const char *strprotocol (u8 protocol) 65const char *strprotocol (u8 protocol)
77{ 66{
78 if (protocol & PROT_IPv4 ) return "rawip"; 67 if (protocol & PROT_IPv4 ) return "rawip";
79 if (protocol & PROT_ICMPv4) return "icmp"; 68 if (protocol & PROT_ICMPv4) return "icmp";
80 if (protocol & PROT_UDPv4 ) return "udp"; 69 if (protocol & PROT_UDPv4 ) return "udp";
81 if (protocol & PROT_TCPv4 ) return "tcp"; 70 if (protocol & PROT_TCPv4 ) return "tcp";
71 if (protocol & PROT_DNSv4 ) return "dns";
82 72
83 return "<unknown>"; 73 return "<unknown>";
84} 74}
85 75
86void 76void
105 if (rsa_key) 95 if (rsa_key)
106 RSA_free (rsa_key); 96 RSA_free (rsa_key);
107 97
108 free (nodename); 98 free (nodename);
109 free (hostname); 99 free (hostname);
100#if ENABLE_DNS
101 free (domain);
102 free (dns_hostname);
103#endif
110} 104}
111 105
112void configuration::init () 106void configuration::init ()
113{ 107{
114 memset (this, 0, sizeof (*this)); 108 memset (this, 0, sizeof (*this));
115 109
110 mtu = DEFAULT_MTU;
116 rekey = DEFAULT_REKEY; 111 rekey = DEFAULT_REKEY;
117 keepalive = DEFAULT_KEEPALIVE; 112 keepalive = DEFAULT_KEEPALIVE;
118 llevel = L_INFO; 113 llevel = L_INFO;
119 ip_proto = IPPROTO_GRE; 114 ip_proto = IPPROTO_GRE;
120#if ENABLE_ICMP 115#if ENABLE_ICMP
121 icmp_type = ICMP_ECHOREPLY; 116 icmp_type = ICMP_ECHOREPLY;
122#endif 117#endif
123 118
124 default_node.udp_port = DEFAULT_UDPPORT; 119 default_node.udp_port = DEFAULT_UDPPORT;
125 default_node.tcp_port = DEFAULT_UDPPORT; 120 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm
126 default_node.connectmode = conf_node::C_ALWAYS; 121 default_node.connectmode = conf_node::C_ALWAYS;
127 default_node.compress = true; 122 default_node.compress = true;
128 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");
129} 132}
130 133
131void configuration::cleanup() 134void configuration::cleanup()
132{ 135{
133 if (rsa_key) 136 if (rsa_key)
134 RSA_free (rsa_key); 137 RSA_free (rsa_key);
135 138
136 rsa_key = 0; 139 rsa_key = 0;
137 140
141 free (pidfilename); pidfilename = 0;
138 free (ifname); ifname = 0; 142 free (ifname); ifname = 0;
139#if ENABLE_HTTP_PROXY 143#if ENABLE_HTTP_PROXY
140 free (proxy_host); proxy_host = 0; 144 free (proxy_host); proxy_host = 0;
141 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;
142#endif 149#endif
143} 150}
144 151
145void 152void
146configuration::clear_config () 153configuration::clear_config ()
171 char *fname; 178 char *fname;
172 FILE *f; 179 FILE *f;
173 180
174 clear_config (); 181 clear_config ();
175 182
176 asprintf (&fname, "%s/vped.conf", confbase); 183 asprintf (&fname, "%s/gvpe.conf", confbase);
177 f = fopen (fname, "r"); 184 f = fopen (fname, "r");
178 185
179 if (f) 186 if (f)
180 { 187 {
181 char line[16384]; 188 char line[16384];
238 else 245 else
239 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);
240 } 247 }
241 else if (!strcmp (var, "ip-proto")) 248 else if (!strcmp (var, "ip-proto"))
242 ip_proto = atoi (val); 249 ip_proto = atoi (val);
250 else if (!strcmp (var, "icmp-type"))
251 {
243#if ENABLE_ICMP 252#if ENABLE_ICMP
244 //TODO: error message
245 else if (!strcmp (var, "icmp-type"))
246 icmp_type = atoi (val); 253 icmp_type = atoi (val);
247#endif 254#endif
255 }
248 256
249 // per config 257 // per config
250 else if (!strcmp (var, "node")) 258 else if (!strcmp (var, "node"))
251 { 259 {
252 default_node.id++; 260 default_node.id++;
270 278
271 if (!PEM_read_RSAPublicKey(f, &node->rsa_key, NULL, NULL)) 279 if (!PEM_read_RSAPublicKey(f, &node->rsa_key, NULL, NULL))
272 { 280 {
273 ERR_load_RSA_strings (); ERR_load_PEM_strings (); 281 ERR_load_RSA_strings (); ERR_load_PEM_strings ();
274 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));
275 exit (1); 283 exit (EXIT_FAILURE);
276 } 284 }
277 285
278 RSA_blinding_on (node->rsa_key, 0); 286 require (RSA_blinding_on (node->rsa_key, 0));
279 287
280 fclose (f); 288 fclose (f);
281 } 289 }
282 else 290 else
283 { 291 {
284 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));
285 293
286 if (need_keys) 294 if (need_keys)
287 exit (1); 295 exit (EXIT_FAILURE);
288 } 296 }
289 297
290 free (fname); 298 free (fname);
291 } 299 }
292 300
293 if (!::thisnode || !strcmp (node->nodename, ::thisnode)) 301 if (::thisnode && !strcmp (node->nodename, ::thisnode))
294 thisnode = node; 302 thisnode = node;
295 } 303 }
296 else if (!strcmp (var, "private-key")) 304 else if (!strcmp (var, "private-key"))
297 prikeyfile = strdup (val); 305 free (prikeyfile), prikeyfile = strdup (val);
298 else if (!strcmp (var, "ifpersist")) 306 else if (!strcmp (var, "ifpersist"))
299 { 307 {
300 parse_bool (ifpersist, "ifpersist", true, false); 308 parse_bool (ifpersist, "ifpersist", true, false);
301 } 309 }
302 else if (!strcmp (var, "ifname")) 310 else if (!strcmp (var, "ifname"))
303 ifname = strdup (val); 311 free (ifname), ifname = strdup (val);
304 else if (!strcmp (var, "rekey")) 312 else if (!strcmp (var, "rekey"))
305 rekey = atoi (val); 313 rekey = atoi (val);
306 else if (!strcmp (var, "keepalive")) 314 else if (!strcmp (var, "keepalive"))
307 keepalive = atoi (val); 315 keepalive = atoi (val);
308 else if (!strcmp (var, "mtu")) 316 else if (!strcmp (var, "mtu"))
309 mtu = atoi (val); 317 mtu = atoi (val);
310 else if (!strcmp (var, "if-up")) 318 else if (!strcmp (var, "if-up"))
311 script_if_up = strdup (val); 319 free (script_if_up), script_if_up = strdup (val);
312 else if (!strcmp (var, "node-up")) 320 else if (!strcmp (var, "node-up"))
313 script_node_up = strdup (val); 321 free (script_node_up), script_node_up = strdup (val);
314 else if (!strcmp (var, "node-down")) 322 else if (!strcmp (var, "node-down"))
315 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 {
316#if ENABLE_HTTP_PROXY 334#if ENABLE_HTTP_PROXY
317 else if (!strcmp (var, "http-proxy-host"))
318 proxy_host = strdup (val); 335 free (proxy_host), proxy_host = strdup (val);
336#endif
337 }
319 else if (!strcmp (var, "http-proxy-port")) 338 else if (!strcmp (var, "http-proxy-port"))
339 {
340#if ENABLE_HTTP_PROXY
320 proxy_port = atoi (val); 341 proxy_port = atoi (val);
342#endif
343 }
321 else if (!strcmp (var, "http-proxy-auth")) 344 else if (!strcmp (var, "http-proxy-auth"))
345 {
346#if ENABLE_HTTP_PROXY
322 proxy_auth = (char *)base64_encode ((const u8 *)val, strlen (val)); 347 proxy_auth = (char *)base64_encode ((const u8 *)val, strlen (val));
323#endif 348#endif
349 }
324 350
325 /* node-specific, non-defaultable */ 351 /* node-specific, non-defaultable */
326 else if (node != &default_node && !strcmp (var, "hostname")) 352 else if (node != &default_node && !strcmp (var, "hostname"))
327 {
328 free (node->hostname);
329 node->hostname = strdup (val); 353 free (node->hostname), node->hostname = strdup (val);
330 }
331 354
332 /* node-specific, defaultable */ 355 /* node-specific, defaultable */
333 else if (!strcmp (var, "udp-port")) 356 else if (!strcmp (var, "udp-port"))
334 node->udp_port = atoi (val); 357 node->udp_port = atoi (val);
335 else if (!strcmp (var, "tcp-port")) 358 else if (!strcmp (var, "tcp-port"))
336 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 }
337 else if (!strcmp (var, "router-priority")) 372 else if (!strcmp (var, "router-priority"))
338 node->routerprio = atoi (val); 373 node->routerprio = atoi (val);
374 else if (!strcmp (var, "max-retry"))
375 node->max_retry = atoi (val);
339 else if (!strcmp (var, "connect")) 376 else if (!strcmp (var, "connect"))
340 { 377 {
341 if (!strcmp (val, "ondemand")) 378 if (!strcmp (val, "ondemand"))
342 node->connectmode = conf_node::C_ONDEMAND; 379 node->connectmode = conf_node::C_ONDEMAND;
343 else if (!strcmp (val, "never")) 380 else if (!strcmp (val, "never"))
346 node->connectmode = conf_node::C_ALWAYS; 383 node->connectmode = conf_node::C_ALWAYS;
347 else if (!strcmp (val, "disabled")) 384 else if (!strcmp (val, "disabled"))
348 node->connectmode = conf_node::C_DISABLED; 385 node->connectmode = conf_node::C_DISABLED;
349 else 386 else
350 slog (L_WARN, 387 slog (L_WARN,
351 _("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"),
352 var, fname, lineno); 389 var, fname, lineno);
353 } 390 }
354 else if (!strcmp (var, "inherit-tos")) 391 else if (!strcmp (var, "inherit-tos"))
355 { 392 {
356 parse_bool (node->inherit_tos, "inherit-tos", true, false); 393 parse_bool (node->inherit_tos, "inherit-tos", true, false);
357 } 394 }
368 } 405 }
369 else if (!strcmp (var, "enable-icmp")) 406 else if (!strcmp (var, "enable-icmp"))
370 { 407 {
371#if ENABLE_ICMP 408#if ENABLE_ICMP
372 u8 v; parse_bool (v, "enable-icmp" , PROT_ICMPv4, 0); node->protocols = (node->protocols & ~PROT_ICMPv4) | v; 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;
373#endif 416#endif
374 } 417 }
375 else if (!strcmp (var, "enable-udp")) 418 else if (!strcmp (var, "enable-udp"))
376 { 419 {
377 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;
391 fclose (f); 434 fclose (f);
392 } 435 }
393 else 436 else
394 { 437 {
395 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));
396 exit (1); 439 exit (EXIT_FAILURE);
397 } 440 }
398 441
399 free (fname); 442 free (fname);
400 443
401 fname = config_filename (prikeyfile, "hostkey"); 444 fname = config_filename (prikeyfile, "hostkey");
407 450
408 if (!PEM_read_RSAPrivateKey (f, &rsa_key, NULL, NULL)) 451 if (!PEM_read_RSAPrivateKey (f, &rsa_key, NULL, NULL))
409 { 452 {
410 ERR_load_RSA_strings (); ERR_load_PEM_strings (); 453 ERR_load_RSA_strings (); ERR_load_PEM_strings ();
411 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));
412 exit (1); 455 exit (EXIT_FAILURE);
413 } 456 }
414 457
415 RSA_blinding_on (rsa_key, 0); 458 require (RSA_blinding_on (rsa_key, 0));
416 459
417 fclose (f); 460 fclose (f);
418 } 461 }
419 else 462 else
420 { 463 {
421 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));
422 465
423 if (need_keys) 466 if (need_keys)
424 exit (1); 467 exit (EXIT_FAILURE);
425 } 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 }
426 478
427 free (fname); 479 free (fname);
428} 480}
429 481
430char *configuration::config_filename (const char *name, const char *dflt) 482char *configuration::config_filename (const char *name, const char *dflt)
466 printf ("\n"); 518 printf ("\n");
467} 519}
468 520
469configuration::configuration () 521configuration::configuration ()
470{ 522{
523 asprintf (&confbase, "%s/gvpe", CONFDIR);
524
471 init (); 525 init ();
472} 526}
473 527
474configuration::~configuration () 528configuration::~configuration ()
475{ 529{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines