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.52 by root, Tue Feb 8 23:11:35 2011 UTC vs.
Revision 1.56 by root, Sun Mar 6 21:01:36 2011 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
105 return false; 105 return false;
106 106
107 return true; 107 return true;
108} 108}
109 109
110void
111conf_node::print ()
112{
113 printf ("%4d fe:fd:80:00:0%1x:%02x %c %-8.8s %-10.10s %s%s%d\n",
114 id,
115 id >> 8, id & 0xff,
116 compress ? 'Y' : 'N',
117 connectmode == C_ONDEMAND ? "ondemand"
118 : connectmode == C_NEVER ? "never"
119 : connectmode == C_ALWAYS ? "always"
120 : connectmode == C_DISABLED ? "disabled"
121 : "",
122 nodename,
123 hostname ? hostname : "",
124 hostname ? ":" : "",
125 hostname ? udp_port : 0
126 );
127}
128
129conf_node::~conf_node () 110conf_node::~conf_node ()
130{ 111{
131#if 0 112#if 0
132 // does not work, because string pointers etc. are shared 113 // does not work, because string pointers etc. are shared
133 // is not called, however 114 // is not called, however
170 default_node.if_up_data = strdup (""); 151 default_node.if_up_data = strdup ("");
171 152
172#if ENABLE_DNS 153#if ENABLE_DNS
173 default_node.dns_port = 0; // default is 0 == client 154 default_node.dns_port = 0; // default is 0 == client
174 155
156 dns_case_preserving = true;
175 dns_forw_host = strdup ("127.0.0.1"); 157 dns_forw_host = strdup ("127.0.0.1");
176 dns_forw_port = 53; 158 dns_forw_port = 53;
177 dns_timeout_factor = DEFAULT_DNS_TIMEOUT_FACTOR; 159 dns_timeout_factor = DEFAULT_DNS_TIMEOUT_FACTOR;
178 dns_send_interval = DEFAULT_DNS_SEND_INTERVAL; 160 dns_send_interval = DEFAULT_DNS_SEND_INTERVAL;
179 dns_overlap_factor = DEFAULT_DNS_OVERLAP_FACTOR; 161 dns_overlap_factor = DEFAULT_DNS_OVERLAP_FACTOR;
191 173
192 rsa_key = 0; 174 rsa_key = 0;
193 175
194 free (pidfilename); pidfilename = 0; 176 free (pidfilename); pidfilename = 0;
195 free (ifname); ifname = 0; 177 free (ifname); ifname = 0;
196#if ENABLE_HTTP_PROXY 178#if ENABLE_HTTP_PROXY
197 free (proxy_host); proxy_host = 0; 179 free (proxy_host); proxy_host = 0;
198 free (proxy_auth); proxy_auth = 0; 180 free (proxy_auth); proxy_auth = 0;
199#endif 181#endif
200#if ENABLE_DNS 182#if ENABLE_DNS
201 free (dns_forw_host); dns_forw_host = 0; 183 free (dns_forw_host); dns_forw_host = 0;
202#endif 184#endif
203 free (script_if_up); script_if_up = 0; 185 free (script_if_up); script_if_up = 0;
204 free (script_node_up); script_node_up = 0; 186 free (script_node_up); script_node_up = 0;
205 free (script_node_change); script_node_change = 0; 187 free (script_node_change); script_node_change = 0;
215 nodes.clear (); 197 nodes.clear ();
216 198
217 cleanup (); 199 cleanup ();
218 init (); 200 init ();
219} 201}
202
203//static bool
204//is_true (const char *name)
205//{
206 //re
207//}
220 208
221#define parse_bool(target,name,trueval,falseval) do { \ 209#define parse_bool(target,name,trueval,falseval) do { \
222 if (!strcmp (val, "yes")) target = trueval; \ 210 if (!strcmp (val, "yes")) target = trueval; \
223 else if (!strcmp (val, "no")) target = falseval; \ 211 else if (!strcmp (val, "no")) target = falseval; \
224 else if (!strcmp (val, "true")) target = trueval; \ 212 else if (!strcmp (val, "true")) target = trueval; \
225 else if (!strcmp (val, "false")) target = falseval; \ 213 else if (!strcmp (val, "false")) target = falseval; \
226 else if (!strcmp (val, "on")) target = trueval; \ 214 else if (!strcmp (val, "on")) target = trueval; \
227 else if (!strcmp (val, "off")) target = falseval; \ 215 else if (!strcmp (val, "off")) target = falseval; \
228 else \ 216 else \
229 return _("illegal boolean value, only 'yes|true|on' or 'no|false|off' allowed. (ignored)"); \ 217 return _("illegal boolean value, only 'yes|true|on' or 'no|false|off' allowed, ignored"); \
230} while (0) 218} while (0)
231 219
232const char * 220const char *
233configuration_parser::parse_line (char *line) 221configuration_parser::parse_line (char *line)
234{ 222{
252 return 0; /* comment: ignore */ 240 return 0; /* comment: ignore */
253 241
254 char *val = strtok (NULL, "\t\n\r ="); 242 char *val = strtok (NULL, "\t\n\r =");
255 243
256 if (!val || val[0] == '#') 244 if (!val || val[0] == '#')
257 return _("no value given for variable. (ignored)"); 245 return _("no value given for variable, ignored");
258 246
259 if (!strcmp (var, "on")) 247 else if (!strcmp (var, "on"))
260 { 248 {
261 if (!::thisnode 249 if (::thisnode
262 || (val[0] == '!' && strcmp (val + 1, ::thisnode)) 250 && ((val[0] == '!' && strcmp (val + 1, ::thisnode))
263 || !strcmp (val, ::thisnode)) 251 || !strcmp (val, ::thisnode)))
264 return parse_line (strtok (NULL, "\n\r")); 252 return parse_line (strtok (NULL, "\n\r"));
265 else 253 }
266 return 0; 254
255 else if (!strcmp (var, "include"))
256 {
257 char *fname = conf.config_filename (val);
258 parse_file (fname);
259 free (fname);
267 } 260 }
268 261
269 // truly global 262 // truly global
270 if (!strcmp (var, "loglevel")) 263 else if (!strcmp (var, "loglevel"))
271 { 264 {
272 loglevel l = string_to_loglevel (val); 265 loglevel l = string_to_loglevel (val);
273 266
274 if (l == L_NONE) 267 if (l == L_NONE)
275 return _("unknown loglevel. (skipping)"); 268 return _("unknown loglevel, ignored");
276 } 269 }
277 else if (!strcmp (var, "ip-proto")) 270 else if (!strcmp (var, "ip-proto"))
278 conf.ip_proto = atoi (val); 271 conf.ip_proto = atoi (val);
279 else if (!strcmp (var, "icmp-type")) 272 else if (!strcmp (var, "icmp-type"))
280 { 273 {
387 { 380 {
388#if ENABLE_DNS 381#if ENABLE_DNS
389 conf.dns_max_outstanding = atoi (val); 382 conf.dns_max_outstanding = atoi (val);
390#endif 383#endif
391 } 384 }
385 else if (!strcmp (var, "dns-case-preserving"))
386 {
387#if ENABLE_DNS
388 parse_bool (conf.dns_case_preserving, "dns-case-preserving", true, false);
389#endif
390 }
392 else if (!strcmp (var, "http-proxy-host")) 391 else if (!strcmp (var, "http-proxy-host"))
393 { 392 {
394#if ENABLE_HTTP_PROXY 393#if ENABLE_HTTP_PROXY
395 free (conf.proxy_host), conf.proxy_host = strdup (val); 394 free (conf.proxy_host), conf.proxy_host = strdup (val);
396#endif 395#endif
450 else if (!strcmp (val, "always")) 449 else if (!strcmp (val, "always"))
451 node->connectmode = conf_node::C_ALWAYS; 450 node->connectmode = conf_node::C_ALWAYS;
452 else if (!strcmp (val, "disabled")) 451 else if (!strcmp (val, "disabled"))
453 node->connectmode = conf_node::C_DISABLED; 452 node->connectmode = conf_node::C_DISABLED;
454 else 453 else
455 return _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled'. (ignored)"); 454 return _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled', ignored");
456 } 455 }
457 else if (!strcmp (var, "inherit-tos")) 456 else if (!strcmp (var, "inherit-tos"))
458 parse_bool (node->inherit_tos, "inherit-tos", true, false); 457 parse_bool (node->inherit_tos, "inherit-tos", true, false);
459 else if (!strcmp (var, "compress")) 458 else if (!strcmp (var, "compress"))
460 parse_bool (node->compress, "compress", true, false); 459 parse_bool (node->compress, "compress", true, false);
494 else if (!strcmp (var, "max-queue")) 493 else if (!strcmp (var, "max-queue"))
495 node->max_queue = atoi (val); 494 node->max_queue = atoi (val);
496 495
497 // unknown or misplaced 496 // unknown or misplaced
498 else 497 else
499 return _("unknown configuration directive. (ignored)"); 498 return _("unknown configuration directive - ignored");
500 499
501 return 0; 500 return 0;
502} 501}
503 502
504void 503void
547 if (warn) 546 if (warn)
548 slog (L_WARN, _("%s, while parsing command line option '%s'."), warn, v); 547 slog (L_WARN, _("%s, while parsing command line option '%s'."), warn, v);
549 548
550 *v = 0; 549 *v = 0;
551 } 550 }
551 }
552}
553
554void
555configuration_parser::parse_file (const char *fname)
556{
557 if (FILE *f = fopen (fname, "r"))
558 {
559 char line [2048];
560 int lineno = 0;
561
562 while (fgets (line, sizeof (line), f))
563 {
564 lineno++;
565
566 const char *warn = parse_line (line);
567
568 if (warn)
569 slog (L_WARN, _("%s, at '%s', line %d."), warn, fname, lineno);
570 }
571
572 fclose (f);
573
574 parse_argv ();
575 }
576 else
577 {
578 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno));
579 exit (EXIT_FAILURE);
552 } 580 }
553} 581}
554 582
555configuration_parser::configuration_parser (configuration &conf, 583configuration_parser::configuration_parser (configuration &conf,
556 bool need_keys, 584 bool need_keys,
557 int argc, 585 int argc,
558 char **argv) 586 char **argv)
559: conf (conf),need_keys (need_keys), argc (argc), argv (argv) 587: conf (conf),need_keys (need_keys), argc (argc), argv (argv)
560{ 588{
561 char *fname; 589 char *fname;
562 FILE *f;
563 590
564 conf.clear (); 591 conf.clear ();
592 node = &conf.default_node;
565 593
566 asprintf (&fname, "%s/gvpe.conf", confbase); 594 asprintf (&fname, "%s/gvpe.conf", confbase);
567 f = fopen (fname, "r"); 595 parse_file (fname);
568
569 if (f)
570 {
571 char line[16384];
572 int lineno = 0;
573 node = &conf.default_node;
574
575 while (fgets (line, sizeof (line), f))
576 {
577 lineno++;
578
579 const char *warn = parse_line (line);
580
581 if (warn)
582 slog (L_WARN, _("%s, at '%s', line %d."), warn, fname, lineno);
583 }
584
585 fclose (f);
586
587 parse_argv ();
588 }
589 else
590 {
591 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno));
592 exit (EXIT_FAILURE);
593 }
594
595 free (fname); 596 free (fname);
596 597
597 fname = conf.config_filename (conf.prikeyfile, "hostkey"); 598 fname = conf.config_filename (conf.prikeyfile, "hostkey");
598 599
599 f = fopen (fname, "r"); 600 if (FILE *f = fopen (fname, "r"))
600 if (f)
601 { 601 {
602 conf.rsa_key = RSA_new (); 602 conf.rsa_key = RSA_new ();
603 603
604 if (!PEM_read_RSAPrivateKey (f, &conf.rsa_key, NULL, NULL)) 604 if (!PEM_read_RSAPrivateKey (f, &conf.rsa_key, NULL, NULL))
605 { 605 {
617 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno)); 617 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno));
618 618
619 if (need_keys) 619 if (need_keys)
620 exit (EXIT_FAILURE); 620 exit (EXIT_FAILURE);
621 } 621 }
622
623 free (fname);
622 624
623 if (need_keys && ::thisnode 625 if (need_keys && ::thisnode
624 && conf.rsa_key && conf.thisnode && conf.thisnode->rsa_key) 626 && conf.rsa_key && conf.thisnode && conf.thisnode->rsa_key)
625 if (BN_cmp (conf.rsa_key->n, conf.thisnode->rsa_key->n) != 0 627 if (BN_cmp (conf.rsa_key->n, conf.thisnode->rsa_key->n) != 0
626 || BN_cmp (conf.rsa_key->e, conf.thisnode->rsa_key->e) != 0) 628 || BN_cmp (conf.rsa_key->e, conf.thisnode->rsa_key->e) != 0)
627 { 629 {
628 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode); 630 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode);
629 exit (EXIT_FAILURE); 631 exit (EXIT_FAILURE);
630 } 632 }
631 633
632 free (fname);
633
634 for (configuration::node_vector::iterator i = conf.nodes.begin(); i != conf.nodes.end(); ++i) 634 for (configuration::node_vector::iterator i = conf.nodes.begin(); i != conf.nodes.end(); ++i)
635 (*i)->finalise (); 635 (*i)->finalise ();
636} 636}
637 637
638char * 638char *
648 asprintf (&fname, "%s/%s", confbase, rname); 648 asprintf (&fname, "%s/%s", confbase, rname);
649 free (rname); 649 free (rname);
650 } 650 }
651 651
652 return fname; 652 return fname;
653}
654
655void
656conf_node::print ()
657{
658 printf ("%4d fe:fd:80:00:0%1x:%02x %c %-8.8s %-10.10s %02x %s%s%d\n",
659 id,
660 id >> 8, id & 0xff,
661 compress ? 'Y' : 'N',
662 connectmode == C_ONDEMAND ? "ondemand"
663 : connectmode == C_NEVER ? "never"
664 : connectmode == C_ALWAYS ? "always"
665 : connectmode == C_DISABLED ? "disabled"
666 : "",
667 nodename,
668 protocols,
669 hostname ? hostname : "",
670 hostname ? ":" : "",
671 hostname ? udp_port : 0
672 );
653} 673}
654 674
655void 675void
656configuration::print () 676configuration::print ()
657{ 677{
664 printf (_("interface: %s\n"), ifname); 684 printf (_("interface: %s\n"), ifname);
665 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>"); 685 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>");
666 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) * 8 : -1); 686 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) * 8 : -1);
667 printf ("\n"); 687 printf ("\n");
668 688
669 printf ("%4s %-17s %s %-8.8s %-10.10s %s\n", 689 printf ("%4s %-17s %s %-8.8s %-10.10s %04s %s\n",
670 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Host:Port")); 690 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Prot"), _("Host:Port"));
671 691
672 for (node_vector::iterator i = nodes.begin (); i != nodes.end (); ++i) 692 for (node_vector::iterator i = nodes.begin (); i != nodes.end (); ++i)
673 (*i)->print (); 693 (*i)->print ();
674 694
675 printf ("\n"); 695 printf ("\n");

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines