projects
/
tinc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add "list" as an alias for "dump" in the CLI.
[tinc]
/
src
/
tincctl.c
diff --git
a/src/tincctl.c
b/src/tincctl.c
index
c0c8a25
..
8d3d7a5
100644
(file)
--- a/
src/tincctl.c
+++ b/
src/tincctl.c
@@
-31,6
+31,7
@@
#include "control_common.h"
#include "crypto.h"
#include "ecdsagen.h"
#include "control_common.h"
#include "crypto.h"
#include "ecdsagen.h"
+#include "fsck.h"
#include "info.h"
#include "invitation.h"
#include "names.h"
#include "info.h"
#include "invitation.h"
#include "names.h"
@@
-66,7
+67,7
@@
char line[4096];
static int code;
static int req;
static int result;
static int code;
static int req;
static int result;
-
static
bool force = false;
+bool force = false;
bool tty = true;
bool confbasegiven = false;
bool netnamegiven = false;
bool tty = true;
bool confbasegiven = false;
bool netnamegiven = false;
@@
-87,8
+88,8
@@
static struct option const long_options[] = {
static void version(void) {
printf("%s version %s (built %s %s, protocol %d.%d)\n", PACKAGE,
static void version(void) {
printf("%s version %s (built %s %s, protocol %d.%d)\n", PACKAGE,
- VERSION, BUILD_DATE, BUILD_TIME, PROT_MAJOR, PROT_MINOR);
- printf("Copyright (C) 1998-201
2
Ivo Timmermans, Guus Sliepen and others.\n"
+
BUILD_
VERSION, BUILD_DATE, BUILD_TIME, PROT_MAJOR, PROT_MINOR);
+ printf("Copyright (C) 1998-201
4
Ivo Timmermans, Guus Sliepen and others.\n"
"See the AUTHORS file for a complete list.\n\n"
"tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n"
"and you are welcome to redistribute it under certain conditions;\n"
"See the AUTHORS file for a complete list.\n\n"
"tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n"
"and you are welcome to redistribute it under certain conditions;\n"
@@
-105,6
+106,7
@@
static void usage(bool status) {
" -c, --config=DIR Read configuration options from DIR.\n"
" -n, --net=NETNAME Connect to net NETNAME.\n"
" --pidfile=FILENAME Read control cookie from FILENAME.\n"
" -c, --config=DIR Read configuration options from DIR.\n"
" -n, --net=NETNAME Connect to net NETNAME.\n"
" --pidfile=FILENAME Read control cookie from FILENAME.\n"
+ " --force Force some commands to work despite warnings.\n"
" --help Display this help and exit.\n"
" --version Output version information and exit.\n"
"\n"
" --help Display this help and exit.\n"
" --version Output version information and exit.\n"
"\n"
@@
-119,8
+121,12
@@
static void usage(bool status) {
" restart [tincd options] Restart tincd.\n"
" reload Partially reload configuration of running tincd.\n"
" pid Show PID of currently running tincd.\n"
" restart [tincd options] Restart tincd.\n"
" reload Partially reload configuration of running tincd.\n"
" pid Show PID of currently running tincd.\n"
+#ifdef DISABLE_LEGACY
+ " generate-keys Generate a new Ed25519 public/private keypair.\n"
+#else
" generate-keys [bits] Generate new RSA and Ed25519 public/private keypairs.\n"
" generate-rsa-keys [bits] Generate a new RSA public/private keypair.\n"
" generate-keys [bits] Generate new RSA and Ed25519 public/private keypairs.\n"
" generate-rsa-keys [bits] Generate a new RSA public/private keypair.\n"
+#endif
" generate-ed25519-keys Generate a new Ed25519 public/private keypair.\n"
" dump Dump a list of one of the following things:\n"
" [reachable] nodes - all known nodes in the VPN\n"
" generate-ed25519-keys Generate a new Ed25519 public/private keypair.\n"
" dump Dump a list of one of the following things:\n"
" [reachable] nodes - all known nodes in the VPN\n"
@@
-140,12
+146,13
@@
static void usage(bool status) {
" log [level] Dump log output [up to the specified level]\n"
" export Export host configuration of local node to standard output\n"
" export-all Export all host configuration files to standard output\n"
" log [level] Dump log output [up to the specified level]\n"
" export Export host configuration of local node to standard output\n"
" export-all Export all host configuration files to standard output\n"
- " import
[--force]
Import host configuration file(s) from standard input\n"
- " exchange
[--force]
Same as export followed by import\n"
- " exchange-all
[--force]
Same as export-all followed by import\n"
+ " import
Import host configuration file(s) from standard input\n"
+ " exchange
Same as export followed by import\n"
+ " exchange-all
Same as export-all followed by import\n"
" invite NODE [...] Generate an invitation for NODE\n"
" invite NODE [...] Generate an invitation for NODE\n"
- " join INVITATION Join a VPN using an INVIT
I
ATION\n"
+ " join INVITATION Join a VPN using an INVITATION\n"
" network [NETNAME] List all known networks, or switch to the one named NETNAME.\n"
" network [NETNAME] List all known networks, or switch to the one named NETNAME.\n"
+ " fsck Check the configuration files for problems.\n"
"\n");
printf("Report bugs to tinc@tinc-vpn.org.\n");
}
"\n");
printf("Report bugs to tinc@tinc-vpn.org.\n");
}
@@
-415,6
+422,7
@@
static bool ed25519_keygen(bool ask) {
return true;
}
return true;
}
+#ifndef DISABLE_LEGACY
/*
Generate a public/private RSA keypair, and ask for a file to store
them in.
/*
Generate a public/private RSA keypair, and ask for a file to store
them in.
@@
-480,6
+488,7
@@
static bool rsa_keygen(int bits, bool ask) {
return true;
}
return true;
}
+#endif
char buffer[4096];
size_t blen = 0;
char buffer[4096];
size_t blen = 0;
@@
-763,7
+772,7
@@
bool connect_tincd(bool verbose) {
#ifdef SO_NOSIGPIPE
static const int one = 1;
#ifdef SO_NOSIGPIPE
static const int one = 1;
- setsockopt(
c
, SOL_SOCKET, SO_NOSIGPIPE, (void *)&one, sizeof one);
+ setsockopt(
fd
, SOL_SOCKET, SO_NOSIGPIPE, (void *)&one, sizeof one);
#endif
char data[4096];
#endif
char data[4096];
@@
-1002,6
+1011,7
@@
static int cmd_dump(int argc, char *argv[]) {
break;
char node[4096];
break;
char node[4096];
+ char id[4096];
char from[4096];
char to[4096];
char subnet[4096];
char from[4096];
char to[4096];
char subnet[4096];
@@
-1019,8
+1029,8
@@
static int cmd_dump(int argc, char *argv[]) {
switch(req) {
case REQ_DUMP_NODES: {
switch(req) {
case REQ_DUMP_NODES: {
- int n = sscanf(line, "%*d %*d %s %s
port %s %d %d %d %d %x %x %s %s %d %hd %hd %hd %ld", node
, host, port, &cipher, &digest, &maclength, &compression, &options, &status_int, nexthop, via, &distance, &pmtu, &minmtu, &maxmtu, &last_state_change);
- if(n != 1
6
) {
+ int n = sscanf(line, "%*d %*d %s %s
%s port %s %d %d %d %d %x %x %s %s %d %hd %hd %hd %ld", node, id
, host, port, &cipher, &digest, &maclength, &compression, &options, &status_int, nexthop, via, &distance, &pmtu, &minmtu, &maxmtu, &last_state_change);
+ if(n != 1
7
) {
fprintf(stderr, "Unable to parse node dump from tincd: %s\n", line);
return 1;
}
fprintf(stderr, "Unable to parse node dump from tincd: %s\n", line);
return 1;
}
@@
-1043,8
+1053,8
@@
static int cmd_dump(int argc, char *argv[]) {
} else {
if(only_reachable && !status.reachable)
continue;
} else {
if(only_reachable && !status.reachable)
continue;
- printf("%s at %s port %s cipher %d digest %d maclength %d compression %d options %x status %04x nexthop %s via %s distance %d pmtu %hd (min %hd max %hd)\n",
- node, host, port, cipher, digest, maclength, compression, options, status_int, nexthop, via, distance, pmtu, minmtu, maxmtu);
+ printf("%s
id %s
at %s port %s cipher %d digest %d maclength %d compression %d options %x status %04x nexthop %s via %s distance %d pmtu %hd (min %hd max %hd)\n",
+ node,
id,
host, port, cipher, digest, maclength, compression, options, status_int, nexthop, via, distance, pmtu, minmtu, maxmtu);
}
} break;
}
} break;
@@
-1305,7
+1315,7
@@
char *get_my_name(bool verbose) {
continue;
if(*value) {
fclose(f);
continue;
if(*value) {
fclose(f);
- return
strdup
(value);
+ return
replace_name
(value);
}
}
}
}
@@
-1322,9
+1332,11
@@
const var_t variables[] = {
{"BindToAddress", VAR_SERVER | VAR_MULTIPLE},
{"BindToInterface", VAR_SERVER},
{"Broadcast", VAR_SERVER | VAR_SAFE},
{"BindToAddress", VAR_SERVER | VAR_MULTIPLE},
{"BindToInterface", VAR_SERVER},
{"Broadcast", VAR_SERVER | VAR_SAFE},
+ {"BroadcastSubnet", VAR_SERVER | VAR_MULTIPLE | VAR_SAFE},
{"ConnectTo", VAR_SERVER | VAR_MULTIPLE | VAR_SAFE},
{"DecrementTTL", VAR_SERVER},
{"Device", VAR_SERVER},
{"ConnectTo", VAR_SERVER | VAR_MULTIPLE | VAR_SAFE},
{"DecrementTTL", VAR_SERVER},
{"Device", VAR_SERVER},
+ {"DeviceStandby", VAR_SERVER},
{"DeviceType", VAR_SERVER},
{"DirectOnly", VAR_SERVER},
{"Ed25519PrivateKeyFile", VAR_SERVER},
{"DeviceType", VAR_SERVER},
{"DirectOnly", VAR_SERVER},
{"Ed25519PrivateKeyFile", VAR_SERVER},
@@
-1355,6
+1367,12
@@
const var_t variables[] = {
{"ScriptsInterpreter", VAR_SERVER},
{"StrictSubnets", VAR_SERVER},
{"TunnelServer", VAR_SERVER},
{"ScriptsInterpreter", VAR_SERVER},
{"StrictSubnets", VAR_SERVER},
{"TunnelServer", VAR_SERVER},
+ {"UDPDiscovery", VAR_SERVER},
+ {"UDPDiscoveryKeepaliveInterval", VAR_SERVER},
+ {"UDPDiscoveryInterval", VAR_SERVER},
+ {"UDPDiscoveryTimeout", VAR_SERVER},
+ {"MTUInfoInterval", VAR_SERVER},
+ {"UDPInfoInterval", VAR_SERVER},
{"UDPRcvBuf", VAR_SERVER},
{"UDPSndBuf", VAR_SERVER},
{"VDEGroup", VAR_SERVER},
{"UDPRcvBuf", VAR_SERVER},
{"UDPSndBuf", VAR_SERVER},
{"VDEGroup", VAR_SERVER},
@@
-1595,6
+1613,11
@@
static int cmd_config(int argc, char *argv[]) {
}
set = true;
continue;
}
set = true;
continue;
+ // Add
+ } else if(action > 0) {
+ // Check if we've already seen this variable with the same value
+ if(!strcasecmp(bvalue, value))
+ found = true;
}
}
}
}
@@
-1627,7
+1650,7
@@
static int cmd_config(int argc, char *argv[]) {
}
// Add new variable if necessary.
}
// Add new variable if necessary.
- if(
action > 0
|| (action == 0 && !set)) {
+ if(
(action > 0 && !found)
|| (action == 0 && !set)) {
if(fprintf(tf, "%s = %s\n", variable, value) < 0) {
fprintf(stderr, "Error writing to temporary file %s: %s\n", tmpfile, strerror(errno));
return 1;
if(fprintf(tf, "%s = %s\n", variable, value) < 0) {
fprintf(stderr, "Error writing to temporary file %s: %s\n", tmpfile, strerror(errno));
return 1;
@@
-1635,9
+1658,12
@@
static int cmd_config(int argc, char *argv[]) {
}
if(action < -1) {
}
if(action < -1) {
- if(!found)
+ if(found) {
+ return 0;
+ } else {
fprintf(stderr, "No matching configuration variables found.\n");
fprintf(stderr, "No matching configuration variables found.\n");
- return 1;
+ return 1;
+ }
}
// Make sure we wrote everything...
}
// Make sure we wrote everything...
@@
-1672,18
+1698,6
@@
static int cmd_config(int argc, char *argv[]) {
return 0;
}
return 0;
}
-bool check_id(const char *name) {
- if(!name || !*name)
- return false;
-
- for(int i = 0; i < strlen(name); i++) {
- if(!isalnum(name[i]) && name[i] != '_')
- return false;
- }
-
- return true;
-}
-
static bool try_bind(int port) {
struct addrinfo *ai = NULL;
struct addrinfo hint = {
static bool try_bind(int port) {
struct addrinfo *ai = NULL;
struct addrinfo hint = {
@@
-1806,7
+1820,12
@@
static int cmd_init(int argc, char *argv[]) {
fprintf(f, "Name = %s\n", name);
fclose(f);
fprintf(f, "Name = %s\n", name);
fclose(f);
- if(!rsa_keygen(2048, false) || !ed25519_keygen(false))
+#ifndef DISABLE_LEGACY
+ if(!rsa_keygen(2048, false))
+ return 1;
+#endif
+
+ if(!ed25519_keygen(false))
return 1;
check_port(name);
return 1;
check_port(name);
@@
-1830,7
+1849,11
@@
static int cmd_init(int argc, char *argv[]) {
}
static int cmd_generate_keys(int argc, char *argv[]) {
}
static int cmd_generate_keys(int argc, char *argv[]) {
+#ifdef DISABLE_LEGACY
+ if(argc > 1) {
+#else
if(argc > 2) {
if(argc > 2) {
+#endif
fprintf(stderr, "Too many arguments!\n");
return 1;
}
fprintf(stderr, "Too many arguments!\n");
return 1;
}
@@
-1838,9
+1861,18
@@
static int cmd_generate_keys(int argc, char *argv[]) {
if(!name)
name = get_my_name(false);
if(!name)
name = get_my_name(false);
- return !(rsa_keygen(argc > 1 ? atoi(argv[1]) : 2048, true) && ed25519_keygen(true));
+#ifndef DISABLE_LEGACY
+ if(!rsa_keygen(argc > 1 ? atoi(argv[1]) : 2048, true))
+ return 1;
+#endif
+
+ if(!ed25519_keygen(true))
+ return 1;
+
+ return 0;
}
}
+#ifndef DISABLE_LEGACY
static int cmd_generate_rsa_keys(int argc, char *argv[]) {
if(argc > 2) {
fprintf(stderr, "Too many arguments!\n");
static int cmd_generate_rsa_keys(int argc, char *argv[]) {
if(argc > 2) {
fprintf(stderr, "Too many arguments!\n");
@@
-1852,6
+1884,7
@@
static int cmd_generate_rsa_keys(int argc, char *argv[]) {
return !rsa_keygen(argc > 1 ? atoi(argv[1]) : 2048, true);
}
return !rsa_keygen(argc > 1 ? atoi(argv[1]) : 2048, true);
}
+#endif
static int cmd_generate_ed25519_keys(int argc, char *argv[]) {
if(argc > 1) {
static int cmd_generate_ed25519_keys(int argc, char *argv[]) {
if(argc > 1) {
@@
-2131,7
+2164,6
@@
static int switch_network(char *name) {
free(netname);
netname = strcmp(name, ".") ? xstrdup(name) : NULL;
free(netname);
netname = strcmp(name, ".") ? xstrdup(name) : NULL;
- make_names();
xasprintf(&tinc_conf, "%s" SLASH "tinc.conf", confbase);
xasprintf(&hosts_dir, "%s" SLASH "hosts", confbase);
xasprintf(&prompt, "%s> ", identname);
xasprintf(&tinc_conf, "%s" SLASH "tinc.conf", confbase);
xasprintf(&hosts_dir, "%s" SLASH "hosts", confbase);
xasprintf(&prompt, "%s> ", identname);
@@
-2176,6
+2208,15
@@
static int cmd_network(int argc, char *argv[]) {
return 0;
}
return 0;
}
+static int cmd_fsck(int argc, char *argv[]) {
+ if(argc > 1) {
+ fprintf(stderr, "Too many arguments!\n");
+ return 1;
+ }
+
+ return fsck(orig_argv[0]);
+}
+
static const struct {
const char *command;
int (*function)(int argc, char *argv[]);
static const struct {
const char *command;
int (*function)(int argc, char *argv[]);
@@
-2186,6
+2227,7
@@
static const struct {
{"restart", cmd_restart},
{"reload", cmd_reload},
{"dump", cmd_dump},
{"restart", cmd_restart},
{"reload", cmd_reload},
{"dump", cmd_dump},
+ {"list", cmd_dump},
{"purge", cmd_purge},
{"debug", cmd_debug},
{"retry", cmd_retry},
{"purge", cmd_purge},
{"debug", cmd_debug},
{"retry", cmd_retry},
@@
-2202,7
+2244,9
@@
static const struct {
{"set", cmd_config},
{"init", cmd_init},
{"generate-keys", cmd_generate_keys},
{"set", cmd_config},
{"init", cmd_init},
{"generate-keys", cmd_generate_keys},
+#ifndef DISABLE_LEGACY
{"generate-rsa-keys", cmd_generate_rsa_keys},
{"generate-rsa-keys", cmd_generate_rsa_keys},
+#endif
{"generate-ed25519-keys", cmd_generate_ed25519_keys},
{"help", cmd_help},
{"version", cmd_version},
{"generate-ed25519-keys", cmd_generate_ed25519_keys},
{"help", cmd_help},
{"version", cmd_version},
@@
-2216,6
+2260,7
@@
static const struct {
{"invite", cmd_invite},
{"join", cmd_join},
{"network", cmd_network},
{"invite", cmd_invite},
{"join", cmd_join},
{"network", cmd_network},
+ {"fsck", cmd_fsck},
{NULL, NULL},
};
{NULL, NULL},
};