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.54 by root, Tue Feb 15 13:31:23 2011 UTC vs.
Revision 1.59 by root, Tue Dec 4 10:29:43 2012 UTC

1/* 1/*
2 conf.c -- configuration code 2 conf.C -- configuration code
3 Copyright (C) 2003-2008 Marc Lehmann <gvpe@schmorp.de> 3 Copyright (C) 2003-2008,2011 Marc Lehmann <gvpe@schmorp.de>
4 4
5 This file is part of GVPE. 5 This file is part of GVPE.
6 6
7 GVPE is free software; you can redistribute it and/or modify it 7 GVPE is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the 8 under the terms of the GNU General Public License as published by the
38#include <errno.h> 38#include <errno.h>
39#include <netdb.h> 39#include <netdb.h>
40#include <sys/stat.h> 40#include <sys/stat.h>
41#include <sys/types.h> 41#include <sys/types.h>
42#include <unistd.h> 42#include <unistd.h>
43#include <pwd.h>
43 44
44#include "netcompat.h" 45#include "netcompat.h"
45 46
46#include <openssl/err.h> 47#include <openssl/err.h>
47#include <openssl/pem.h> 48#include <openssl/pem.h>
151 default_node.if_up_data = strdup (""); 152 default_node.if_up_data = strdup ("");
152 153
153#if ENABLE_DNS 154#if ENABLE_DNS
154 default_node.dns_port = 0; // default is 0 == client 155 default_node.dns_port = 0; // default is 0 == client
155 156
157 dns_case_preserving = true;
156 dns_forw_host = strdup ("127.0.0.1"); 158 dns_forw_host = strdup ("127.0.0.1");
157 dns_forw_port = 53; 159 dns_forw_port = 53;
158 dns_timeout_factor = DEFAULT_DNS_TIMEOUT_FACTOR; 160 dns_timeout_factor = DEFAULT_DNS_TIMEOUT_FACTOR;
159 dns_send_interval = DEFAULT_DNS_SEND_INTERVAL; 161 dns_send_interval = DEFAULT_DNS_SEND_INTERVAL;
160 dns_overlap_factor = DEFAULT_DNS_OVERLAP_FACTOR; 162 dns_overlap_factor = DEFAULT_DNS_OVERLAP_FACTOR;
179 free (proxy_auth); proxy_auth = 0; 181 free (proxy_auth); proxy_auth = 0;
180#endif 182#endif
181#if ENABLE_DNS 183#if ENABLE_DNS
182 free (dns_forw_host); dns_forw_host = 0; 184 free (dns_forw_host); dns_forw_host = 0;
183#endif 185#endif
186 free (change_root); change_root = 0;
184 free (script_if_up); script_if_up = 0; 187 free (script_if_up); script_if_up = 0;
185 free (script_node_up); script_node_up = 0; 188 free (script_node_up); script_node_up = 0;
186 free (script_node_change); script_node_change = 0; 189 free (script_node_change); script_node_change = 0;
187 free (script_node_down); script_node_down = 0; 190 free (script_node_down); script_node_down = 0;
188} 191}
196 nodes.clear (); 199 nodes.clear ();
197 200
198 cleanup (); 201 cleanup ();
199 init (); 202 init ();
200} 203}
204
205//static bool
206//is_true (const char *name)
207//{
208 //re
209//}
201 210
202#define parse_bool(target,name,trueval,falseval) do { \ 211#define parse_bool(target,name,trueval,falseval) do { \
203 if (!strcmp (val, "yes")) target = trueval; \ 212 if (!strcmp (val, "yes")) target = trueval; \
204 else if (!strcmp (val, "no")) target = falseval; \ 213 else if (!strcmp (val, "no")) target = falseval; \
205 else if (!strcmp (val, "true")) target = trueval; \ 214 else if (!strcmp (val, "true")) target = trueval; \
206 else if (!strcmp (val, "false")) target = falseval; \ 215 else if (!strcmp (val, "false")) target = falseval; \
207 else if (!strcmp (val, "on")) target = trueval; \ 216 else if (!strcmp (val, "on")) target = trueval; \
208 else if (!strcmp (val, "off")) target = falseval; \ 217 else if (!strcmp (val, "off")) target = falseval; \
209 else \ 218 else \
210 return _("illegal boolean value, only 'yes|true|on' or 'no|false|off' allowed. (ignored)"); \ 219 return _("illegal boolean value, only 'yes|true|on' or 'no|false|off' allowed, ignored"); \
211} while (0) 220} while (0)
212 221
213const char * 222const char *
214configuration_parser::parse_line (char *line) 223configuration_parser::parse_line (char *line)
215{ 224{
233 return 0; /* comment: ignore */ 242 return 0; /* comment: ignore */
234 243
235 char *val = strtok (NULL, "\t\n\r ="); 244 char *val = strtok (NULL, "\t\n\r =");
236 245
237 if (!val || val[0] == '#') 246 if (!val || val[0] == '#')
238 return _("no value given for variable. (ignored)"); 247 return _("no value given for variable, ignored");
239 248
240 if (!strcmp (var, "on")) 249 else if (!strcmp (var, "on"))
241 { 250 {
242 if (!::thisnode 251 if (::thisnode
243 || (val[0] == '!' && strcmp (val + 1, ::thisnode)) 252 && ((val[0] == '!' && strcmp (val + 1, ::thisnode))
244 || !strcmp (val, ::thisnode)) 253 || !strcmp (val, ::thisnode)))
245 return parse_line (strtok (NULL, "\n\r")); 254 return parse_line (strtok (NULL, "\n\r"));
246 else 255 }
247 return 0; 256
257 else if (!strcmp (var, "include"))
258 {
259 char *fname = conf.config_filename (val);
260 parse_file (fname);
261 free (fname);
248 } 262 }
249 263
250 // truly global 264 // truly global
251 if (!strcmp (var, "loglevel")) 265 else if (!strcmp (var, "loglevel"))
252 { 266 {
253 loglevel l = string_to_loglevel (val); 267 loglevel l = string_to_loglevel (val);
254 268
255 if (l == L_NONE) 269 if (l == L_NONE)
256 return _("unknown loglevel. (skipping)"); 270 return _("unknown loglevel, ignored");
257 } 271 }
258 else if (!strcmp (var, "ip-proto")) 272 else if (!strcmp (var, "ip-proto"))
259 conf.ip_proto = atoi (val); 273 conf.ip_proto = atoi (val);
260 else if (!strcmp (var, "icmp-type")) 274 else if (!strcmp (var, "icmp-type"))
261 { 275 {
262#if ENABLE_ICMP 276#if ENABLE_ICMP
263 conf.icmp_type = atoi (val); 277 conf.icmp_type = atoi (val);
264#endif 278#endif
265 } 279 }
280 else if (!strcmp (var, "chuser"))
281 {
282 struct passwd *pw = getpwnam (val);
283 if (!pw)
284 return _("user specified for chuser not found");
266 285
267 // per config 286 conf.change_uid = pw->pw_uid;
287 conf.change_gid = pw->pw_gid;
288 }
289 else if (!strcmp (var, "chuid"))
290 conf.change_uid = atoi (val);
291 else if (!strcmp (var, "chgid"))
292 conf.change_gid = atoi (val);
293 else if (!strcmp (var, "chroot"))
294 free (conf.change_root), conf.change_root = strdup (val);
295
296 // per node
268 else if (!strcmp (var, "node")) 297 else if (!strcmp (var, "node"))
269 { 298 {
270 parse_argv (); 299 parse_argv ();
271 300
272 conf.default_node.id++; 301 conf.default_node.id++;
368 { 397 {
369#if ENABLE_DNS 398#if ENABLE_DNS
370 conf.dns_max_outstanding = atoi (val); 399 conf.dns_max_outstanding = atoi (val);
371#endif 400#endif
372 } 401 }
402 else if (!strcmp (var, "dns-case-preserving"))
403 {
404#if ENABLE_DNS
405 parse_bool (conf.dns_case_preserving, "dns-case-preserving", true, false);
406#endif
407 }
373 else if (!strcmp (var, "http-proxy-host")) 408 else if (!strcmp (var, "http-proxy-host"))
374 { 409 {
375#if ENABLE_HTTP_PROXY 410#if ENABLE_HTTP_PROXY
376 free (conf.proxy_host), conf.proxy_host = strdup (val); 411 free (conf.proxy_host), conf.proxy_host = strdup (val);
377#endif 412#endif
431 else if (!strcmp (val, "always")) 466 else if (!strcmp (val, "always"))
432 node->connectmode = conf_node::C_ALWAYS; 467 node->connectmode = conf_node::C_ALWAYS;
433 else if (!strcmp (val, "disabled")) 468 else if (!strcmp (val, "disabled"))
434 node->connectmode = conf_node::C_DISABLED; 469 node->connectmode = conf_node::C_DISABLED;
435 else 470 else
436 return _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled'. (ignored)"); 471 return _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled', ignored");
437 } 472 }
438 else if (!strcmp (var, "inherit-tos")) 473 else if (!strcmp (var, "inherit-tos"))
439 parse_bool (node->inherit_tos, "inherit-tos", true, false); 474 parse_bool (node->inherit_tos, "inherit-tos", true, false);
440 else if (!strcmp (var, "compress")) 475 else if (!strcmp (var, "compress"))
441 parse_bool (node->compress, "compress", true, false); 476 parse_bool (node->compress, "compress", true, false);
475 else if (!strcmp (var, "max-queue")) 510 else if (!strcmp (var, "max-queue"))
476 node->max_queue = atoi (val); 511 node->max_queue = atoi (val);
477 512
478 // unknown or misplaced 513 // unknown or misplaced
479 else 514 else
480 return _("unknown configuration directive. (ignored)"); 515 return _("unknown configuration directive - ignored");
481 516
482 return 0; 517 return 0;
483} 518}
484 519
485void 520void
528 if (warn) 563 if (warn)
529 slog (L_WARN, _("%s, while parsing command line option '%s'."), warn, v); 564 slog (L_WARN, _("%s, while parsing command line option '%s'."), warn, v);
530 565
531 *v = 0; 566 *v = 0;
532 } 567 }
568 }
569}
570
571void
572configuration_parser::parse_file (const char *fname)
573{
574 if (FILE *f = fopen (fname, "r"))
575 {
576 char line [2048];
577 int lineno = 0;
578
579 while (fgets (line, sizeof (line), f))
580 {
581 lineno++;
582
583 const char *warn = parse_line (line);
584
585 if (warn)
586 slog (L_WARN, _("%s, at '%s', line %d."), warn, fname, lineno);
587 }
588
589 fclose (f);
590
591 parse_argv ();
592 }
593 else
594 {
595 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno));
596 exit (EXIT_FAILURE);
533 } 597 }
534} 598}
535 599
536configuration_parser::configuration_parser (configuration &conf, 600configuration_parser::configuration_parser (configuration &conf,
537 bool need_keys, 601 bool need_keys,
538 int argc, 602 int argc,
539 char **argv) 603 char **argv)
540: conf (conf),need_keys (need_keys), argc (argc), argv (argv) 604: conf (conf),need_keys (need_keys), argc (argc), argv (argv)
541{ 605{
542 char *fname; 606 char *fname;
543 FILE *f;
544 607
545 conf.clear (); 608 conf.clear ();
609 node = &conf.default_node;
546 610
547 asprintf (&fname, "%s/gvpe.conf", confbase); 611 asprintf (&fname, "%s/gvpe.conf", confbase);
548 f = fopen (fname, "r"); 612 parse_file (fname);
549
550 if (f)
551 {
552 char line[16384];
553 int lineno = 0;
554 node = &conf.default_node;
555
556 while (fgets (line, sizeof (line), f))
557 {
558 lineno++;
559
560 const char *warn = parse_line (line);
561
562 if (warn)
563 slog (L_WARN, _("%s, at '%s', line %d."), warn, fname, lineno);
564 }
565
566 fclose (f);
567
568 parse_argv ();
569 }
570 else
571 {
572 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno));
573 exit (EXIT_FAILURE);
574 }
575
576 free (fname); 613 free (fname);
577 614
578 fname = conf.config_filename (conf.prikeyfile, "hostkey"); 615 fname = conf.config_filename (conf.prikeyfile, "hostkey");
579 616
580 f = fopen (fname, "r"); 617 if (FILE *f = fopen (fname, "r"))
581 if (f)
582 { 618 {
583 conf.rsa_key = RSA_new (); 619 conf.rsa_key = RSA_new ();
584 620
585 if (!PEM_read_RSAPrivateKey (f, &conf.rsa_key, NULL, NULL)) 621 if (!PEM_read_RSAPrivateKey (f, &conf.rsa_key, NULL, NULL))
586 { 622 {
598 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno)); 634 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno));
599 635
600 if (need_keys) 636 if (need_keys)
601 exit (EXIT_FAILURE); 637 exit (EXIT_FAILURE);
602 } 638 }
639
640 free (fname);
603 641
604 if (need_keys && ::thisnode 642 if (need_keys && ::thisnode
605 && conf.rsa_key && conf.thisnode && conf.thisnode->rsa_key) 643 && conf.rsa_key && conf.thisnode && conf.thisnode->rsa_key)
606 if (BN_cmp (conf.rsa_key->n, conf.thisnode->rsa_key->n) != 0 644 if (BN_cmp (conf.rsa_key->n, conf.thisnode->rsa_key->n) != 0
607 || BN_cmp (conf.rsa_key->e, conf.thisnode->rsa_key->e) != 0) 645 || BN_cmp (conf.rsa_key->e, conf.thisnode->rsa_key->e) != 0)
608 { 646 {
609 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode); 647 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode);
610 exit (EXIT_FAILURE); 648 exit (EXIT_FAILURE);
611 } 649 }
612
613 free (fname);
614 650
615 for (configuration::node_vector::iterator i = conf.nodes.begin(); i != conf.nodes.end(); ++i) 651 for (configuration::node_vector::iterator i = conf.nodes.begin(); i != conf.nodes.end(); ++i)
616 (*i)->finalise (); 652 (*i)->finalise ();
617} 653}
618 654

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines