Allow more configuration variables to be changed when reloading configuration.
In particular, Subnets may be added or removed from the local node on the fly.
This commit is contained in:
parent
c678e7c4fb
commit
4c8ead9874
1 changed files with 52 additions and 1 deletions
53
src/net.c
53
src/net.c
|
@ -276,6 +276,16 @@ int reload_configuration(void) {
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
read_config_options(config_tree, NULL);
|
||||||
|
|
||||||
|
xasprintf(&fname, "%s/hosts/%s", confbase, myself->name);
|
||||||
|
read_config_file(config_tree, fname);
|
||||||
|
free(fname);
|
||||||
|
|
||||||
|
/* Parse some options that are allowed to be changed while tinc is running */
|
||||||
|
|
||||||
|
setup_myself_reloadable();
|
||||||
|
|
||||||
/* Close connections to hosts that have a changed or deleted host config file */
|
/* Close connections to hosts that have a changed or deleted host config file */
|
||||||
|
|
||||||
for(node = connection_tree->head; node; node = next) {
|
for(node = connection_tree->head; node; node = next) {
|
||||||
|
@ -306,7 +316,6 @@ int reload_configuration(void) {
|
||||||
if(strictsubnets) {
|
if(strictsubnets) {
|
||||||
subnet_t *subnet;
|
subnet_t *subnet;
|
||||||
|
|
||||||
|
|
||||||
for(node = subnet_tree->head; node; node = node->next) {
|
for(node = subnet_tree->head; node; node = node->next) {
|
||||||
subnet = node->data;
|
subnet = node->data;
|
||||||
subnet->expires = 1;
|
subnet->expires = 1;
|
||||||
|
@ -330,6 +339,48 @@ int reload_configuration(void) {
|
||||||
subnet_update(subnet->owner, subnet, true);
|
subnet_update(subnet->owner, subnet, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else { /* Only read our own subnets back in */
|
||||||
|
subnet_t *subnet, *s2;
|
||||||
|
|
||||||
|
for(node = myself->subnet_tree->head; node; node = node->next) {
|
||||||
|
subnet_t *subnet = node->data;
|
||||||
|
logger(DEBUG_ALWAYS, LOG_DEBUG, "subnet %p expires %d\n", subnet, subnet->expires);
|
||||||
|
if(!subnet->expires)
|
||||||
|
subnet->expires = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
config_t *cfg = lookup_config(config_tree, "Subnet");
|
||||||
|
|
||||||
|
while(cfg) {
|
||||||
|
if(!get_config_subnet(cfg, &subnet))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if((s2 = lookup_subnet(myself, subnet))) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_DEBUG, "read subnet that already exists: %p expires %d\n", s2, s2->expires);
|
||||||
|
if(s2->expires == 1)
|
||||||
|
s2->expires = 0;
|
||||||
|
|
||||||
|
free_subnet(subnet);
|
||||||
|
} else {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_DEBUG, "read new subnet %p", subnet);
|
||||||
|
subnet_add(myself, subnet);
|
||||||
|
send_add_subnet(everyone, subnet);
|
||||||
|
subnet_update(myself, subnet, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg = lookup_config_next(config_tree, cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(node = myself->subnet_tree->head; node; node = next) {
|
||||||
|
next = node->next;
|
||||||
|
subnet_t *subnet = node->data;
|
||||||
|
if(subnet->expires == 1) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_DEBUG, "removed subnet %p", subnet);
|
||||||
|
send_del_subnet(everyone, subnet);
|
||||||
|
subnet_update(myself, subnet, false);
|
||||||
|
subnet_del(myself, subnet);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to make outgoing connections */
|
/* Try to make outgoing connections */
|
||||||
|
|
Loading…
Reference in a new issue