Merge local host configuration with server configuration.
authorGuus Sliepen <guus@tinc-vpn.org>
Fri, 22 Oct 2010 10:47:12 +0000 (12:47 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Fri, 22 Oct 2010 10:47:12 +0000 (12:47 +0200)
With some exceptions, tinc only accepted host configuration options for the
local node from the corresponding host configuration file. Although this is
documented, many people expect that they can also put those options in
tinc.conf. Tinc now internally merges the contents of both tinc.conf and the
local host configuration file.

doc/tinc.conf.5.in
doc/tinc.texi
src/net_setup.c
src/protocol_auth.c

index bc82b17637443a7708b1f470804b1a39c9a4f81d..2bfd5fef94f8b2f6f0afa5f47540ef49b54362ef 100644 (file)
@@ -110,6 +110,13 @@ Note: it is not required that you put in the
 sign, but doing so improves readability.
 If you leave it out, remember to replace it with at least one space character.
 
 sign, but doing so improves readability.
 If you leave it out, remember to replace it with at least one space character.
 
+.Pp
+The server configuration is complemented with host specific configuration (see the next section).
+Although all configuration options for the local host listed in this document can also be put in
+.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf ,
+it is recommended to put host specific configuration options in the host configuration file,
+as this makes it easy to exchange with other nodes.
+
 .Pp
 Here are all valid variables, listed in alphabetical order.
 The default value is given between parentheses.
 .Pp
 Here are all valid variables, listed in alphabetical order.
 The default value is given between parentheses.
index dd7bc6250013289f6a43a54b1900f2da10c9447b..9e0f978da942b4aaf1bfd59bd474a069c438481e 100644 (file)
@@ -725,6 +725,13 @@ and carriage returns are ignored.  Note: it is not required that you put
 in the `=' sign, but doing so improves readability.  If you leave it
 out, remember to replace it with at least one space character.
 
 in the `=' sign, but doing so improves readability.  If you leave it
 out, remember to replace it with at least one space character.
 
+The server configuration is complemented with host specific configuration (see
+the next section). Although all host configuration options for the local node
+listed in this document can also be put in
+@file{@value{sysconfdir}/tinc/@var{netname}/tinc.conf}, it is recommended to
+put host specific configuration options in the host configuration file, as this
+makes it easy to exchange with other nodes.
+
 In this section all valid variables are listed in alphabetical order.
 The default value is given between parentheses,
 other comments are between square brackets.
 In this section all valid variables are listed in alphabetical order.
 The default value is given between parentheses,
 other comments are between square brackets.
index cb70926ad0c3dbaa13bac715514098a536f533a8..9f0fd888067db646e2a699562f82ccc4e55742c4 100644 (file)
@@ -149,7 +149,7 @@ bool read_rsa_private_key(void) {
        struct stat s;
 
        if(get_config_string(lookup_config(config_tree, "PrivateKey"), &key)) {
        struct stat s;
 
        if(get_config_string(lookup_config(config_tree, "PrivateKey"), &key)) {
-               if(!get_config_string(lookup_config(myself->connection->config_tree, "PublicKey"), &pubkey)) {
+               if(!get_config_string(lookup_config(config_tree, "PublicKey"), &pubkey)) {
                        logger(LOG_ERR, "PrivateKey used but no PublicKey found!");
                        return false;
                }
                        logger(LOG_ERR, "PrivateKey used but no PublicKey found!");
                        return false;
                }
@@ -270,6 +270,7 @@ bool setup_myself(void) {
        config_t *cfg;
        subnet_t *subnet;
        char *name, *hostname, *mode, *afname, *cipher, *digest;
        config_t *cfg;
        subnet_t *subnet;
        char *name, *hostname, *mode, *afname, *cipher, *digest;
+       char *fname = NULL;
        char *address = NULL;
        char *envp[5];
        struct addrinfo *ai, *aip, hint = {0};
        char *address = NULL;
        char *envp[5];
        struct addrinfo *ai, *aip, hint = {0};
@@ -278,7 +279,6 @@ bool setup_myself(void) {
 
        myself = new_node();
        myself->connection = new_connection();
 
        myself = new_node();
        myself->connection = new_connection();
-       init_configuration(&myself->connection->config_tree);
 
        myself->hostname = xstrdup("MYSELF");
        myself->connection->hostname = xstrdup("MYSELF");
 
        myself->hostname = xstrdup("MYSELF");
        myself->connection->hostname = xstrdup("MYSELF");
@@ -299,17 +299,14 @@ bool setup_myself(void) {
 
        myself->name = name;
        myself->connection->name = xstrdup(name);
 
        myself->name = name;
        myself->connection->name = xstrdup(name);
-
-       if(!read_connection_config(myself->connection)) {
-               logger(LOG_ERR, "Cannot open host configuration file for myself!");
-               return false;
-       }
+       xasprintf(&fname, "%s/hosts/%s", confbase, name);
+       read_config_file(config_tree, fname);
+       free(fname);
 
        if(!read_rsa_private_key())
                return false;
 
 
        if(!read_rsa_private_key())
                return false;
 
-       if(!get_config_string(lookup_config(config_tree, "Port"), &myport)
-                       && !get_config_string(lookup_config(myself->connection->config_tree, "Port"), &myport))
+       if(!get_config_string(lookup_config(config_tree, "Port"), &myport))
                myport = xstrdup("655");
 
        if(!atoi(myport)) {
                myport = xstrdup("655");
 
        if(!atoi(myport)) {
@@ -324,7 +321,7 @@ bool setup_myself(void) {
 
        /* Read in all the subnets specified in the host configuration file */
 
 
        /* Read in all the subnets specified in the host configuration file */
 
-       cfg = lookup_config(myself->connection->config_tree, "Subnet");
+       cfg = lookup_config(config_tree, "Subnet");
 
        while(cfg) {
                if(!get_config_subnet(cfg, &subnet))
 
        while(cfg) {
                if(!get_config_subnet(cfg, &subnet))
@@ -332,7 +329,7 @@ bool setup_myself(void) {
 
                subnet_add(myself, subnet);
 
 
                subnet_add(myself, subnet);
 
-               cfg = lookup_config_next(myself->connection->config_tree, cfg);
+               cfg = lookup_config_next(config_tree, cfg);
        }
 
        /* Check some options */
        }
 
        /* Check some options */
@@ -343,12 +340,6 @@ bool setup_myself(void) {
        if(get_config_bool(lookup_config(config_tree, "TCPOnly"), &choice) && choice)
                myself->options |= OPTION_TCPONLY;
 
        if(get_config_bool(lookup_config(config_tree, "TCPOnly"), &choice) && choice)
                myself->options |= OPTION_TCPONLY;
 
-       if(get_config_bool(lookup_config(myself->connection->config_tree, "IndirectData"), &choice) && choice)
-               myself->options |= OPTION_INDIRECT;
-
-       if(get_config_bool(lookup_config(myself->connection->config_tree, "TCPOnly"), &choice) && choice)
-               myself->options |= OPTION_TCPONLY;
-
        if(myself->options & OPTION_TCPONLY)
                myself->options |= OPTION_INDIRECT;
 
        if(myself->options & OPTION_TCPONLY)
                myself->options |= OPTION_INDIRECT;
 
@@ -386,14 +377,12 @@ bool setup_myself(void) {
        }
 
        choice = true;
        }
 
        choice = true;
-       get_config_bool(lookup_config(myself->connection->config_tree, "PMTUDiscovery"), &choice);
        get_config_bool(lookup_config(config_tree, "PMTUDiscovery"), &choice);
        if(choice)
                myself->options |= OPTION_PMTU_DISCOVERY;
 
        choice = true;
        get_config_bool(lookup_config(config_tree, "ClampMSS"), &choice);
        get_config_bool(lookup_config(config_tree, "PMTUDiscovery"), &choice);
        if(choice)
                myself->options |= OPTION_PMTU_DISCOVERY;
 
        choice = true;
        get_config_bool(lookup_config(config_tree, "ClampMSS"), &choice);
-       get_config_bool(lookup_config(myself->connection->config_tree, "ClampMSS"), &choice);
        if(choice)
                myself->options |= OPTION_CLAMP_MSS;
 
        if(choice)
                myself->options |= OPTION_CLAMP_MSS;
 
@@ -434,7 +423,7 @@ bool setup_myself(void) {
        /* Generate packet encryption key */
 
        if(get_config_string
        /* Generate packet encryption key */
 
        if(get_config_string
-          (lookup_config(myself->connection->config_tree, "Cipher"), &cipher)) {
+          (lookup_config(config_tree, "Cipher"), &cipher)) {
                if(!strcasecmp(cipher, "none")) {
                        myself->incipher = NULL;
                } else {
                if(!strcasecmp(cipher, "none")) {
                        myself->incipher = NULL;
                } else {
@@ -462,7 +451,7 @@ bool setup_myself(void) {
        
        /* Check if we want to use message authentication codes... */
 
        
        /* Check if we want to use message authentication codes... */
 
-       if(get_config_string(lookup_config(myself->connection->config_tree, "Digest"), &digest)) {
+       if(get_config_string(lookup_config(config_tree, "Digest"), &digest)) {
                if(!strcasecmp(digest, "none")) {
                        myself->indigest = NULL;
                } else {
                if(!strcasecmp(digest, "none")) {
                        myself->indigest = NULL;
                } else {
@@ -478,7 +467,7 @@ bool setup_myself(void) {
 
        myself->connection->outdigest = EVP_sha1();
 
 
        myself->connection->outdigest = EVP_sha1();
 
-       if(get_config_int(lookup_config(myself->connection->config_tree, "MACLength"), &myself->inmaclength)) {
+       if(get_config_int(lookup_config(config_tree, "MACLength"), &myself->inmaclength)) {
                if(myself->indigest) {
                        if(myself->inmaclength > myself->indigest->md_size) {
                                logger(LOG_ERR, "MAC length exceeds size of digest!");
                if(myself->indigest) {
                        if(myself->inmaclength > myself->indigest->md_size) {
                                logger(LOG_ERR, "MAC length exceeds size of digest!");
@@ -495,7 +484,7 @@ bool setup_myself(void) {
 
        /* Compression */
 
 
        /* Compression */
 
-       if(get_config_int(lookup_config(myself->connection->config_tree, "Compression"), &myself->incompression)) {
+       if(get_config_int(lookup_config(config_tree, "Compression"), &myself->incompression)) {
                if(myself->incompression < 0 || myself->incompression > 11) {
                        logger(LOG_ERR, "Bogus compression level!");
                        return false;
                if(myself->incompression < 0 || myself->incompression > 11) {
                        logger(LOG_ERR, "Bogus compression level!");
                        return false;
index 98d5b61dde4415db74e3c12a853489a99d8c5eea..3f4fa01021a8db3a3ee7b7bbcea43720950ae3d4 100644 (file)
@@ -539,7 +539,7 @@ bool ack_h(connection_t *c) {
        if(get_config_int(lookup_config(c->config_tree, "PMTU"), &mtu) && mtu < n->mtu)
                n->mtu = mtu;
 
        if(get_config_int(lookup_config(c->config_tree, "PMTU"), &mtu) && mtu < n->mtu)
                n->mtu = mtu;
 
-       if(get_config_int(lookup_config(myself->connection->config_tree, "PMTU"), &mtu) && mtu < n->mtu)
+       if(get_config_int(lookup_config(config_tree, "PMTU"), &mtu) && mtu < n->mtu)
                n->mtu = mtu;
 
        if(get_config_bool(lookup_config(c->config_tree, "ClampMSS"), &choice)) {
                n->mtu = mtu;
 
        if(get_config_bool(lookup_config(c->config_tree, "ClampMSS"), &choice)) {