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.34 by pcg, Thu Mar 17 23:59:37 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 = 0; // default is 0 == client
128 dns_forw_host = strdup ("127.0.0.1");
129 dns_forw_port = 53;
130#endif
131
132 conf.pidfilename = strdup (LOCALSTATEDIR "/run/gvpe.pid");
129} 133}
130 134
131void configuration::cleanup() 135void configuration::cleanup()
132{ 136{
133 if (rsa_key) 137 if (rsa_key)
134 RSA_free (rsa_key); 138 RSA_free (rsa_key);
135 139
136 rsa_key = 0; 140 rsa_key = 0;
137 141
142 free (pidfilename); pidfilename = 0;
138 free (ifname); ifname = 0; 143 free (ifname); ifname = 0;
139#if ENABLE_HTTP_PROXY 144#if ENABLE_HTTP_PROXY
140 free (proxy_host); proxy_host = 0; 145 free (proxy_host); proxy_host = 0;
141 free (proxy_auth); proxy_auth = 0; 146 free (proxy_auth); proxy_auth = 0;
147#endif
148#if ENABLE_DNS
149 free (dns_forw_host); dns_forw_host = 0;
142#endif 150#endif
143} 151}
144 152
145void 153void
146configuration::clear_config () 154configuration::clear_config ()
171 char *fname; 179 char *fname;
172 FILE *f; 180 FILE *f;
173 181
174 clear_config (); 182 clear_config ();
175 183
176 asprintf (&fname, "%s/vped.conf", confbase); 184 asprintf (&fname, "%s/gvpe.conf", confbase);
177 f = fopen (fname, "r"); 185 f = fopen (fname, "r");
178 186
179 if (f) 187 if (f)
180 { 188 {
181 char line[16384]; 189 char line[16384];
238 else 246 else
239 slog (L_WARN, "'%s': %s, at '%s' line %d", val, UNKNOWN_LOGLEVEL, fname, line); 247 slog (L_WARN, "'%s': %s, at '%s' line %d", val, UNKNOWN_LOGLEVEL, fname, line);
240 } 248 }
241 else if (!strcmp (var, "ip-proto")) 249 else if (!strcmp (var, "ip-proto"))
242 ip_proto = atoi (val); 250 ip_proto = atoi (val);
251 else if (!strcmp (var, "icmp-type"))
252 {
243#if ENABLE_ICMP 253#if ENABLE_ICMP
244 //TODO: error message
245 else if (!strcmp (var, "icmp-type"))
246 icmp_type = atoi (val); 254 icmp_type = atoi (val);
247#endif 255#endif
256 }
248 257
249 // per config 258 // per config
250 else if (!strcmp (var, "node")) 259 else if (!strcmp (var, "node"))
251 { 260 {
252 default_node.id++; 261 default_node.id++;
270 279
271 if (!PEM_read_RSAPublicKey(f, &node->rsa_key, NULL, NULL)) 280 if (!PEM_read_RSAPublicKey(f, &node->rsa_key, NULL, NULL))
272 { 281 {
273 ERR_load_RSA_strings (); ERR_load_PEM_strings (); 282 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)); 283 slog (L_ERR, _("unable to open public rsa key file '%s': %s"), fname, ERR_error_string (ERR_get_error (), 0));
275 exit (1); 284 exit (EXIT_FAILURE);
276 } 285 }
277 286
278 RSA_blinding_on (node->rsa_key, 0); 287 require (RSA_blinding_on (node->rsa_key, 0));
279 288
280 fclose (f); 289 fclose (f);
281 } 290 }
282 else 291 else
283 { 292 {
284 slog (need_keys ? L_ERR : L_NOTICE, _("unable to read public rsa key file '%s': %s"), fname, strerror (errno)); 293 slog (need_keys ? L_ERR : L_NOTICE, _("unable to read public rsa key file '%s': %s"), fname, strerror (errno));
285 294
286 if (need_keys) 295 if (need_keys)
287 exit (1); 296 exit (EXIT_FAILURE);
288 } 297 }
289 298
290 free (fname); 299 free (fname);
291 } 300 }
292 301
293 if (!::thisnode || !strcmp (node->nodename, ::thisnode)) 302 if (::thisnode && !strcmp (node->nodename, ::thisnode))
294 thisnode = node; 303 thisnode = node;
295 } 304 }
296 else if (!strcmp (var, "private-key")) 305 else if (!strcmp (var, "private-key"))
297 prikeyfile = strdup (val); 306 free (prikeyfile), prikeyfile = strdup (val);
298 else if (!strcmp (var, "ifpersist")) 307 else if (!strcmp (var, "ifpersist"))
299 { 308 {
300 parse_bool (ifpersist, "ifpersist", true, false); 309 parse_bool (ifpersist, "ifpersist", true, false);
301 } 310 }
302 else if (!strcmp (var, "ifname")) 311 else if (!strcmp (var, "ifname"))
303 ifname = strdup (val); 312 free (ifname), ifname = strdup (val);
304 else if (!strcmp (var, "rekey")) 313 else if (!strcmp (var, "rekey"))
305 rekey = atoi (val); 314 rekey = atoi (val);
306 else if (!strcmp (var, "keepalive")) 315 else if (!strcmp (var, "keepalive"))
307 keepalive = atoi (val); 316 keepalive = atoi (val);
308 else if (!strcmp (var, "mtu")) 317 else if (!strcmp (var, "mtu"))
309 mtu = atoi (val); 318 mtu = atoi (val);
310 else if (!strcmp (var, "if-up")) 319 else if (!strcmp (var, "if-up"))
311 script_if_up = strdup (val); 320 free (script_if_up), script_if_up = strdup (val);
312 else if (!strcmp (var, "node-up")) 321 else if (!strcmp (var, "node-up"))
313 script_node_up = strdup (val); 322 free (script_node_up), script_node_up = strdup (val);
314 else if (!strcmp (var, "node-down")) 323 else if (!strcmp (var, "node-down"))
315 script_node_down = strdup (val); 324 free (script_node_down), script_node_down = strdup (val);
325 else if (!strcmp (var, "pid-file"))
326 free (pidfilename), pidfilename = strdup (val);
327 else if (!strcmp (var, "dns-forw-host"))
328 {
329#if ENABLE_DNS
330 free (dns_forw_host), dns_forw_host = strdup (val);
331#endif
332 }
333 else if (!strcmp (var, "dns-forw-port"))
334 {
335#if ENABLE_DNS
336 dns_forw_port = atoi (val);
337#endif
338 }
339 else if (!strcmp (var, "http-proxy-host"))
340 {
316#if ENABLE_HTTP_PROXY 341#if ENABLE_HTTP_PROXY
317 else if (!strcmp (var, "http-proxy-host"))
318 proxy_host = strdup (val); 342 free (proxy_host), proxy_host = strdup (val);
343#endif
344 }
319 else if (!strcmp (var, "http-proxy-port")) 345 else if (!strcmp (var, "http-proxy-port"))
346 {
347#if ENABLE_HTTP_PROXY
320 proxy_port = atoi (val); 348 proxy_port = atoi (val);
349#endif
350 }
321 else if (!strcmp (var, "http-proxy-auth")) 351 else if (!strcmp (var, "http-proxy-auth"))
352 {
353#if ENABLE_HTTP_PROXY
322 proxy_auth = (char *)base64_encode ((const u8 *)val, strlen (val)); 354 proxy_auth = (char *)base64_encode ((const u8 *)val, strlen (val));
323#endif 355#endif
356 }
324 357
325 /* node-specific, non-defaultable */ 358 /* node-specific, non-defaultable */
326 else if (node != &default_node && !strcmp (var, "hostname")) 359 else if (node != &default_node && !strcmp (var, "hostname"))
327 {
328 free (node->hostname);
329 node->hostname = strdup (val); 360 free (node->hostname), node->hostname = strdup (val);
330 }
331 361
332 /* node-specific, defaultable */ 362 /* node-specific, defaultable */
333 else if (!strcmp (var, "udp-port")) 363 else if (!strcmp (var, "udp-port"))
334 node->udp_port = atoi (val); 364 node->udp_port = atoi (val);
335 else if (!strcmp (var, "tcp-port")) 365 else if (!strcmp (var, "tcp-port"))
336 node->tcp_port = atoi (val); 366 node->tcp_port = atoi (val);
367 else if (!strcmp (var, "dns-hostname"))
368 {
369#if ENABLE_DNS
370 free (node->dns_hostname), node->dns_hostname = strdup (val);
371#endif
372 }
373 else if (!strcmp (var, "dns-port"))
374 {
375#if ENABLE_DNS
376 node->dns_port = atoi (val);
377#endif
378 }
379 else if (!strcmp (var, "dns-domain"))
380 {
381#if ENABLE_DNS
382 free (node->domain), node->domain = strdup (val);
383#endif
384 }
337 else if (!strcmp (var, "router-priority")) 385 else if (!strcmp (var, "router-priority"))
338 node->routerprio = atoi (val); 386 node->routerprio = atoi (val);
387 else if (!strcmp (var, "max-retry"))
388 node->max_retry = atoi (val);
339 else if (!strcmp (var, "connect")) 389 else if (!strcmp (var, "connect"))
340 { 390 {
341 if (!strcmp (val, "ondemand")) 391 if (!strcmp (val, "ondemand"))
342 node->connectmode = conf_node::C_ONDEMAND; 392 node->connectmode = conf_node::C_ONDEMAND;
343 else if (!strcmp (val, "never")) 393 else if (!strcmp (val, "never"))
346 node->connectmode = conf_node::C_ALWAYS; 396 node->connectmode = conf_node::C_ALWAYS;
347 else if (!strcmp (val, "disabled")) 397 else if (!strcmp (val, "disabled"))
348 node->connectmode = conf_node::C_DISABLED; 398 node->connectmode = conf_node::C_DISABLED;
349 else 399 else
350 slog (L_WARN, 400 slog (L_WARN,
351 _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled', at '%s' line %d"), 401 _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled', at '%s' line %d"),
352 var, fname, lineno); 402 var, fname, lineno);
353 } 403 }
354 else if (!strcmp (var, "inherit-tos")) 404 else if (!strcmp (var, "inherit-tos"))
355 { 405 {
356 parse_bool (node->inherit_tos, "inherit-tos", true, false); 406 parse_bool (node->inherit_tos, "inherit-tos", true, false);
357 } 407 }
368 } 418 }
369 else if (!strcmp (var, "enable-icmp")) 419 else if (!strcmp (var, "enable-icmp"))
370 { 420 {
371#if ENABLE_ICMP 421#if ENABLE_ICMP
372 u8 v; parse_bool (v, "enable-icmp" , PROT_ICMPv4, 0); node->protocols = (node->protocols & ~PROT_ICMPv4) | v; 422 u8 v; parse_bool (v, "enable-icmp" , PROT_ICMPv4, 0); node->protocols = (node->protocols & ~PROT_ICMPv4) | v;
423#endif
424 }
425 else if (!strcmp (var, "enable-dns"))
426 {
427#if ENABLE_DNS
428 u8 v; parse_bool (v, "enable-dns" , PROT_DNSv4, 0); node->protocols = (node->protocols & ~PROT_DNSv4) | v;
373#endif 429#endif
374 } 430 }
375 else if (!strcmp (var, "enable-udp")) 431 else if (!strcmp (var, "enable-udp"))
376 { 432 {
377 u8 v; parse_bool (v, "enable-udp" , PROT_UDPv4, 0); node->protocols = (node->protocols & ~PROT_UDPv4) | v; 433 u8 v; parse_bool (v, "enable-udp" , PROT_UDPv4, 0); node->protocols = (node->protocols & ~PROT_UDPv4) | v;
391 fclose (f); 447 fclose (f);
392 } 448 }
393 else 449 else
394 { 450 {
395 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno)); 451 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno));
396 exit (1); 452 exit (EXIT_FAILURE);
397 } 453 }
398 454
399 free (fname); 455 free (fname);
400 456
401 fname = config_filename (prikeyfile, "hostkey"); 457 fname = config_filename (prikeyfile, "hostkey");
407 463
408 if (!PEM_read_RSAPrivateKey (f, &rsa_key, NULL, NULL)) 464 if (!PEM_read_RSAPrivateKey (f, &rsa_key, NULL, NULL))
409 { 465 {
410 ERR_load_RSA_strings (); ERR_load_PEM_strings (); 466 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)); 467 slog (L_ERR, _("unable to read private rsa key file '%s': %s"), fname, ERR_error_string (ERR_get_error (), 0));
412 exit (1); 468 exit (EXIT_FAILURE);
413 } 469 }
414 470
415 RSA_blinding_on (rsa_key, 0); 471 require (RSA_blinding_on (rsa_key, 0));
416 472
417 fclose (f); 473 fclose (f);
418 } 474 }
419 else 475 else
420 { 476 {
421 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno)); 477 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno));
422 478
423 if (need_keys) 479 if (need_keys)
424 exit (1); 480 exit (EXIT_FAILURE);
425 } 481 }
482
483 if (need_keys && ::thisnode
484 && rsa_key && thisnode && thisnode->rsa_key)
485 if (BN_cmp (rsa_key->n, thisnode->rsa_key->n) != 0
486 || BN_cmp (rsa_key->e, thisnode->rsa_key->e) != 0)
487 {
488 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode);
489 exit (EXIT_FAILURE);
490 }
426 491
427 free (fname); 492 free (fname);
428} 493}
429 494
430char *configuration::config_filename (const char *name, const char *dflt) 495char *configuration::config_filename (const char *name, const char *dflt)
466 printf ("\n"); 531 printf ("\n");
467} 532}
468 533
469configuration::configuration () 534configuration::configuration ()
470{ 535{
536 asprintf (&confbase, "%s/gvpe", CONFDIR);
537
471 init (); 538 init ();
472} 539}
473 540
474configuration::~configuration () 541configuration::~configuration ()
475{ 542{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines