Add the ability to query configuration variables to tincctl.

This commit is contained in:
Guus Sliepen 2012-08-01 15:50:45 +02:00
parent a9caa2a6ea
commit b0f3a76e9b
3 changed files with 55 additions and 22 deletions

View file

@ -2044,6 +2044,11 @@ the value of this environment variable is used.
Create initial configuration files and RSA and ECDSA keypairs with default length.
If no @var{name} for this node is given, it will be asked for.
@item config [get] @var{variable}
Print the current value of configuration variable @var{variable}.
If more than one variable with the same name exists,
the value of each of them will be printed on a separate line.
@item config [set] @var{variable} @var{value}
Set configuration variable @var{variable} to the given @var{value}.
All previously existing configuration variables with the same name are removed.

View file

@ -52,6 +52,11 @@ Create initial configuration files and RSA and ECDSA keypairs with default lengt
If no
.Ar name
for this node is given, it will be asked for.
.It config Oo get Oc Ar variable
Print the current value of configuration variable
.Ar variable .
If more than one variable with the same name exists,
the value of each of them will be printed on a separate line.
.It config Oo set Oc Ar variable Ar value
Set configuration variable
.Ar variable

View file

@ -111,6 +111,7 @@ static void usage(bool status) {
"Valid commands are:\n"
" init [name] Create initial configuration files.\n"
" config Change configuration:\n"
" [get] VARIABLE - print current value of VARIABLE\n"
" [set] VARIABLE VALUE - set VARIABLE to VALUE\n"
" add VARIABLE VALUE - add VARIABLE with the given VALUE\n"
" del VARIABLE [VALUE] - remove VARIABLE [only ones with watching VALUE]\n"
@ -942,7 +943,7 @@ static int cmd_log(int argc, char *argv[]) {
}
static int cmd_pid(int argc, char *argv[]) {
if(!connect_tincd())
if(!connect_tincd() && !pid)
return 1;
printf("%d\n", pid);
@ -1056,8 +1057,10 @@ static int cmd_config(int argc, char *argv[]) {
return 1;
}
int action = 0;
if(!strcasecmp(argv[1], "add")) {
int action = -2;
if(!strcasecmp(argv[1], "get")) {
argv++, argc--;
} else if(!strcasecmp(argv[1], "add")) {
argv++, argc--, action = 1;
} else if(!strcasecmp(argv[1], "del")) {
argv++, argc--, action = -1;
@ -1109,6 +1112,9 @@ static int cmd_config(int argc, char *argv[]) {
return 1;
}
if(action < -1 && *value)
action = 0;
/* Some simple checks. */
bool found = false;
@ -1157,8 +1163,8 @@ static int cmd_config(int argc, char *argv[]) {
return 1;
}
if(!found && action >= 0) {
if(force) {
if(!found) {
if(force || action < 0) {
fprintf(stderr, "Warning: %s is not a known configuration variable!\n", variable);
} else {
fprintf(stderr, "%s: is not a known configuration variable! Use --force to use it anyway.\n", variable);
@ -1190,19 +1196,24 @@ static int cmd_config(int argc, char *argv[]) {
}
}
char *tmpfile;
xasprintf(&tmpfile, "%s.config.tmp", filename);
FILE *tf = fopen(tmpfile, "w");
if(!tf) {
fprintf(stderr, "Could not open temporary file %s: %s\n", tmpfile, strerror(errno));
return 1;
char *tmpfile = NULL;
FILE *tf = NULL;
if(action >= -1) {
xasprintf(&tmpfile, "%s.config.tmp", filename);
tf = fopen(tmpfile, "w");
if(!tf) {
fprintf(stderr, "Could not open temporary file %s: %s\n", tmpfile, strerror(errno));
return 1;
}
}
// Copy the file, making modifications on the fly.
// Copy the file, making modifications on the fly, unless we are just getting a value.
char buf1[4096];
char buf2[4096];
bool set = false;
bool removed = false;
found = false;
while(fgets(buf1, sizeof buf1, f)) {
buf1[sizeof buf1 - 1] = 0;
@ -1224,8 +1235,12 @@ static int cmd_config(int argc, char *argv[]) {
// Did it match?
if(!strcasecmp(buf2, variable)) {
// Get
if(action < -1) {
found = true;
printf("%s\n", bvalue);
// Del
if(action < 0) {
} else if(action == -1) {
if(!*value || !strcasecmp(bvalue, value)) {
removed = true;
continue;
@ -1245,18 +1260,20 @@ static int cmd_config(int argc, char *argv[]) {
}
}
// Copy original line...
if(fputs(buf1, tf) < 0) {
fprintf(stderr, "Error writing to temporary file %s: %s\n", tmpfile, strerror(errno));
return 1;
}
// Add newline if it is missing...
if(*buf1 && buf1[strlen(buf1) - 1] != '\n') {
if(fputc('\n', tf) < 0) {
if(action >= -1) {
// Copy original line...
if(fputs(buf1, tf) < 0) {
fprintf(stderr, "Error writing to temporary file %s: %s\n", tmpfile, strerror(errno));
return 1;
}
// Add newline if it is missing...
if(*buf1 && buf1[strlen(buf1) - 1] != '\n') {
if(fputc('\n', tf) < 0) {
fprintf(stderr, "Error writing to temporary file %s: %s\n", tmpfile, strerror(errno));
return 1;
}
}
}
}
@ -1279,6 +1296,12 @@ static int cmd_config(int argc, char *argv[]) {
}
}
if(action < -1) {
if(!found)
fprintf(stderr, "No matching configuration variables found.\n");
return 0;
}
// Make sure we wrote everything...
if(fclose(tf)) {
fprintf(stderr, "Error closing temporary file %s: %s\n", tmpfile, strerror(errno));