summaryrefslogtreecommitdiff
path: root/other/bootstrap_daemon
diff options
context:
space:
mode:
Diffstat (limited to 'other/bootstrap_daemon')
-rw-r--r--other/bootstrap_daemon/conf14
-rw-r--r--other/bootstrap_daemon/tox_bootstrap_daemon.c69
2 files changed, 72 insertions, 11 deletions
diff --git a/other/bootstrap_daemon/conf b/other/bootstrap_daemon/conf
index fb524754..bbdf7652 100644
--- a/other/bootstrap_daemon/conf
+++ b/other/bootstrap_daemon/conf
@@ -3,7 +3,7 @@
3// Listening port. 3// Listening port.
4port = 33445 4port = 33445
5 5
6// The key file is like a password, so keep it where no one can read it. 6// A key file is like a password, so keep it where no one can read it.
7// The daemon should have permission to read/write to it. 7// The daemon should have permission to read/write to it.
8// Remember to replace the provided example with your own path. 8// Remember to replace the provided example with your own path.
9keys_file_path = "/home/tom/.tox_bootstrap_daemon/keys" 9keys_file_path = "/home/tom/.tox_bootstrap_daemon/keys"
@@ -23,9 +23,15 @@ enable_lan_discovery = true
23enable_tcp_relay = true 23enable_tcp_relay = true
24 24
25// Tox uses 443 and 3389 ports by default, so it's highly recommended to keep 25// Tox uses 443 and 3389 ports by default, so it's highly recommended to keep
26// them 26// them.
27tcp_relay_ports = [443, 3389] 27tcp_relay_ports = [443, 3389]
28 28
29// It's planned to use message of the day as a convenient method of checking
30// whether a node is up or not, though there are other methods of doing that.
31enable_motd = true
32
33motd = "tox_bootstrap_daemon"
34
29// Any number of nodes the daemon will bootstrap itself from. 35// Any number of nodes the daemon will bootstrap itself from.
30// Remember to replace the provided example with your own node list. 36// Remember to replace the provided example with your own node list.
31// There is a maintained list of bootstrap nodes on Tox's wiki, if you need it. 37// There is a maintained list of bootstrap nodes on Tox's wiki, if you need it.
@@ -34,8 +40,8 @@ tcp_relay_ports = [443, 3389]
34// from anyone. 40// from anyone.
35bootstrap_nodes = ( 41bootstrap_nodes = (
36 { // Node 1 42 { // Node 1
37 // Any ipv4 or ipv6, depending if `enable_ipv6` is set or not, and also 43 // Any ipv4 or ipv6, depending on whether `enable_ipv6` is set or not, and
38 // any US-ASCII domain name. 44 // also any US-ASCII domain name.
39 address = "198.46.136.167" 45 address = "198.46.136.167"
40 port = 33445 46 port = 33445
41 public_key = "728925473812C7AAC482BE7250BCCAD0B8CB9F737BF3D42ABD34459C1768F854" 47 public_key = "728925473812C7AAC482BE7250BCCAD0B8CB9F737BF3D42ABD34459C1768F854"
diff --git a/other/bootstrap_daemon/tox_bootstrap_daemon.c b/other/bootstrap_daemon/tox_bootstrap_daemon.c
index 410a3453..6853358a 100644
--- a/other/bootstrap_daemon/tox_bootstrap_daemon.c
+++ b/other/bootstrap_daemon/tox_bootstrap_daemon.c
@@ -48,10 +48,12 @@
48#include "../../toxcore/util.h" 48#include "../../toxcore/util.h"
49 49
50// misc 50// misc
51#include "../bootstrap_node_packets.c"
51#include "../../testing/misc_tools.c" 52#include "../../testing/misc_tools.c"
52 53
53 54
54#define DAEMON_NAME "tox_bootstrap_daemon" 55#define DAEMON_NAME "tox_bootstrap_daemon"
56#define DAEMON_VERSION_NUMBER 2014051700UL // yyyymmmddvv format: yyyy year, mm month, dd day, vv version change count for that day
55 57
56#define SLEEP_TIME_MILLISECONDS 30 58#define SLEEP_TIME_MILLISECONDS 30
57#define sleep usleep(1000*SLEEP_TIME_MILLISECONDS) 59#define sleep usleep(1000*SLEEP_TIME_MILLISECONDS)
@@ -62,6 +64,8 @@
62#define DEFAULT_ENABLE_IPV6 0 // 1 - true, 0 - false 64#define DEFAULT_ENABLE_IPV6 0 // 1 - true, 0 - false
63#define DEFAULT_ENABLE_LAN_DISCOVERY 1 // 1 - true, 0 - false 65#define DEFAULT_ENABLE_LAN_DISCOVERY 1 // 1 - true, 0 - false
64#define DEFAULT_ENABLE_TCP_RELAY 1 // 1 - true, 0 - false 66#define DEFAULT_ENABLE_TCP_RELAY 1 // 1 - true, 0 - false
67#define DEFAULT_ENABLE_MOTD 1 // 1 - true, 0 - false
68#define DEFAULT_MOTD DAEMON_NAME
65 69
66#define MIN_ALLOWED_PORT 1 70#define MIN_ALLOWED_PORT 1
67#define MAX_ALLOWED_PORT 65535 71#define MAX_ALLOWED_PORT 65535
@@ -129,7 +133,7 @@ void parse_tcp_relay_ports_config(config_t *cfg, uint16_t **tcp_relay_ports, int
129 } 133 }
130 134
131 if (config_setting_is_array(ports_array) == CONFIG_FALSE) { 135 if (config_setting_is_array(ports_array) == CONFIG_FALSE) {
132 syslog(LOG_WARNING, "'%s' setting should be an array. Array syntax: 'setting = [value1, value2, ...]'.\n"); 136 syslog(LOG_WARNING, "'%s' setting should be an array. Array syntax: 'setting = [value1, value2, ...]'.\n", NAME_TCP_RELAY_PORTS);
133 return; 137 return;
134 } 138 }
135 139
@@ -161,7 +165,7 @@ void parse_tcp_relay_ports_config(config_t *cfg, uint16_t **tcp_relay_ports, int
161 165
162 (*tcp_relay_ports)[*tcp_relay_port_count] = config_setting_get_int(elem); 166 (*tcp_relay_ports)[*tcp_relay_port_count] = config_setting_get_int(elem);
163 if ((*tcp_relay_ports)[i] < MIN_ALLOWED_PORT || (*tcp_relay_ports)[i] > MAX_ALLOWED_PORT) { 167 if ((*tcp_relay_ports)[i] < MIN_ALLOWED_PORT || (*tcp_relay_ports)[i] > MAX_ALLOWED_PORT) {
164 syslog(LOG_WARNING, "Port #%d: Invalid port value, should be in [%d, %d]. Skipping.\n", i, MIN_ALLOWED_PORT, MAX_ALLOWED_PORT); 168 syslog(LOG_WARNING, "Port #%d: Invalid port: %u, should be in [%d, %d]. Skipping.\n", i, (*tcp_relay_ports)[i], MIN_ALLOWED_PORT, MAX_ALLOWED_PORT);
165 continue; 169 continue;
166 } 170 }
167 171
@@ -176,12 +180,14 @@ void parse_tcp_relay_ports_config(config_t *cfg, uint16_t **tcp_relay_ports, int
176// 180//
177// Important: you are responsible for freeing `pid_file_path` and `keys_file_path` 181// Important: you are responsible for freeing `pid_file_path` and `keys_file_path`
178// also, iff `tcp_relay_ports_count` > 0, then you are responsible for freeing `tcp_relay_ports` 182// also, iff `tcp_relay_ports_count` > 0, then you are responsible for freeing `tcp_relay_ports`
183// and also `motd` iff `enable_motd` is set
179// 184//
180// returns 1 on success 185// returns 1 on success
181// 0 on failure, doesn't modify any data pointed by arguments 186// 0 on failure, doesn't modify any data pointed by arguments
182 187
183int get_general_config(char *cfg_file_path, char **pid_file_path, char **keys_file_path, int *port, int *enable_ipv6, 188int get_general_config(char *cfg_file_path, char **pid_file_path, char **keys_file_path, int *port, int *enable_ipv6,
184 int *enable_lan_discovery, int *enable_tcp_relay, uint16_t **tcp_relay_ports, int *tcp_relay_port_count) 189 int *enable_lan_discovery, int *enable_tcp_relay, uint16_t **tcp_relay_ports, int *tcp_relay_port_count,
190 int *enable_motd, char **motd)
185{ 191{
186 config_t cfg; 192 config_t cfg;
187 193
@@ -191,6 +197,8 @@ int get_general_config(char *cfg_file_path, char **pid_file_path, char **keys_fi
191 const char *NAME_ENABLE_IPV6 = "enable_ipv6"; 197 const char *NAME_ENABLE_IPV6 = "enable_ipv6";
192 const char *NAME_ENABLE_LAN_DISCOVERY = "enable_lan_discovery"; 198 const char *NAME_ENABLE_LAN_DISCOVERY = "enable_lan_discovery";
193 const char *NAME_ENABLE_TCP_RELAY = "enable_tcp_relay"; 199 const char *NAME_ENABLE_TCP_RELAY = "enable_tcp_relay";
200 const char *NAME_ENABLE_MOTD = "enable_motd";
201 const char *NAME_MOTD = "motd";
194 202
195 config_init(&cfg); 203 config_init(&cfg);
196 204
@@ -261,6 +269,30 @@ int get_general_config(char *cfg_file_path, char **pid_file_path, char **keys_fi
261 *tcp_relay_port_count = 0; 269 *tcp_relay_port_count = 0;
262 } 270 }
263 271
272 // Get MOTD option
273 if (config_lookup_bool(&cfg, NAME_ENABLE_MOTD, enable_motd) == CONFIG_FALSE) {
274 syslog(LOG_WARNING, "No '%s' setting in configuration file.\n", NAME_ENABLE_MOTD);
275 syslog(LOG_WARNING, "Using default '%s': %s\n", NAME_ENABLE_MOTD,
276 DEFAULT_ENABLE_MOTD ? "true" : "false");
277 *enable_motd = DEFAULT_ENABLE_MOTD;
278 }
279
280 if (*enable_motd) {
281 // Get MOTD
282 const char *tmp_motd;
283
284 if (config_lookup_string(&cfg, NAME_MOTD, &tmp_motd) == CONFIG_FALSE) {
285 syslog(LOG_WARNING, "No '%s' setting in configuration file.\n", NAME_MOTD);
286 syslog(LOG_WARNING, "Using default '%s': %s\n", NAME_MOTD, DEFAULT_MOTD);
287 tmp_motd = DEFAULT_MOTD;
288 }
289 size_t tmp_motd_length = strlen(tmp_motd) + 1;
290 size_t motd_length = tmp_motd_length > MAX_MOTD_LENGTH ? MAX_MOTD_LENGTH : tmp_motd_length;
291 *motd = malloc(motd_length);
292 strncpy(*motd, tmp_motd, motd_length);
293 (*motd)[MAX_MOTD_LENGTH - 1] = '\0';
294 }
295
264 config_destroy(&cfg); 296 config_destroy(&cfg);
265 297
266 syslog(LOG_DEBUG, "Successfully read:\n"); 298 syslog(LOG_DEBUG, "Successfully read:\n");
@@ -269,6 +301,7 @@ int get_general_config(char *cfg_file_path, char **pid_file_path, char **keys_fi
269 syslog(LOG_DEBUG, "'%s': %d\n", NAME_PORT, *port); 301 syslog(LOG_DEBUG, "'%s': %d\n", NAME_PORT, *port);
270 syslog(LOG_DEBUG, "'%s': %s\n", NAME_ENABLE_IPV6, *enable_ipv6 ? "true" : "false"); 302 syslog(LOG_DEBUG, "'%s': %s\n", NAME_ENABLE_IPV6, *enable_ipv6 ? "true" : "false");
271 syslog(LOG_DEBUG, "'%s': %s\n", NAME_ENABLE_LAN_DISCOVERY, *enable_lan_discovery ? "true" : "false"); 303 syslog(LOG_DEBUG, "'%s': %s\n", NAME_ENABLE_LAN_DISCOVERY, *enable_lan_discovery ? "true" : "false");
304
272 syslog(LOG_DEBUG, "'%s': %s\n", NAME_ENABLE_TCP_RELAY, *enable_tcp_relay ? "true" : "false"); 305 syslog(LOG_DEBUG, "'%s': %s\n", NAME_ENABLE_TCP_RELAY, *enable_tcp_relay ? "true" : "false");
273 // show info about tcp ports only if tcp relay is enabled 306 // show info about tcp ports only if tcp relay is enabled
274 if (*enable_tcp_relay) { 307 if (*enable_tcp_relay) {
@@ -283,6 +316,11 @@ int get_general_config(char *cfg_file_path, char **pid_file_path, char **keys_fi
283 } 316 }
284 } 317 }
285 318
319 syslog(LOG_DEBUG, "'%s': %s\n", NAME_ENABLE_MOTD, *enable_motd ? "true" : "false");
320 if (*enable_motd) {
321 syslog(LOG_DEBUG, "'%s': %s\n", NAME_MOTD, *motd);
322 }
323
286 return 1; 324 return 1;
287} 325}
288 326
@@ -415,6 +453,8 @@ int main(int argc, char *argv[])
415{ 453{
416 openlog(DAEMON_NAME, LOG_NOWAIT | LOG_PID, LOG_DAEMON); 454 openlog(DAEMON_NAME, LOG_NOWAIT | LOG_PID, LOG_DAEMON);
417 455
456 syslog(LOG_INFO, "Running \"%s\" version %lu.\n", DAEMON_NAME, DAEMON_VERSION_NUMBER);
457
418 if (argc < 2) { 458 if (argc < 2) {
419 syslog(LOG_ERR, "Please specify a path to a configuration file as the first argument. Exiting.\n"); 459 syslog(LOG_ERR, "Please specify a path to a configuration file as the first argument. Exiting.\n");
420 return 1; 460 return 1;
@@ -428,8 +468,10 @@ int main(int argc, char *argv[])
428 int enable_tcp_relay; 468 int enable_tcp_relay;
429 uint16_t *tcp_relay_ports; 469 uint16_t *tcp_relay_ports;
430 int tcp_relay_port_count; 470 int tcp_relay_port_count;
471 int enable_motd;
472 char *motd;
431 473
432 if (get_general_config(cfg_file_path, &pid_file_path, &keys_file_path, &port, &enable_ipv6, &enable_lan_discovery, &enable_tcp_relay, &tcp_relay_ports, &tcp_relay_port_count)) { 474 if (get_general_config(cfg_file_path, &pid_file_path, &keys_file_path, &port, &enable_ipv6, &enable_lan_discovery, &enable_tcp_relay, &tcp_relay_ports, &tcp_relay_port_count, &enable_motd, &motd)) {
433 syslog(LOG_DEBUG, "General config read successfully\n"); 475 syslog(LOG_DEBUG, "General config read successfully\n");
434 } else { 476 } else {
435 syslog(LOG_ERR, "Couldn't read config file: %s. Exiting.\n", cfg_file_path); 477 syslog(LOG_ERR, "Couldn't read config file: %s. Exiting.\n", cfg_file_path);
@@ -465,8 +507,18 @@ int main(int argc, char *argv[])
465 return 1; 507 return 1;
466 } 508 }
467 509
510 if (enable_motd) {
511 if (bootstrap_set_callbacks(dht->net, DAEMON_VERSION_NUMBER, (uint8_t*)motd, strlen(motd) + 1) == 0) {
512 syslog(LOG_DEBUG, "Set MOTD successfully.\n");
513 } else {
514 syslog(LOG_ERR, "Couldn't set MOTD: %s. Exiting.\n", motd);
515 return 1;
516 }
517 free(motd);
518 }
519
468 if (manage_keys(dht, keys_file_path)) { 520 if (manage_keys(dht, keys_file_path)) {
469 syslog(LOG_DEBUG, "Keys are managed successfully\n"); 521 syslog(LOG_DEBUG, "Keys are managed successfully.\n");
470 } else { 522 } else {
471 syslog(LOG_ERR, "Couldn't read/write: %s. Exiting.\n", keys_file_path); 523 syslog(LOG_ERR, "Couldn't read/write: %s. Exiting.\n", keys_file_path);
472 return 1; 524 return 1;
@@ -485,14 +537,16 @@ int main(int argc, char *argv[])
485 // tcp_relay_port_count != 0 at this point 537 // tcp_relay_port_count != 0 at this point
486 free(tcp_relay_ports); 538 free(tcp_relay_ports);
487 539
488 if (tcp_server == NULL) { 540 if (tcp_server != NULL) {
541 syslog(LOG_DEBUG, "Initialized Tox TCP server successfully.\n");
542 } else {
489 syslog(LOG_ERR, "Couldn't initialize Tox TCP server. Exiting.\n"); 543 syslog(LOG_ERR, "Couldn't initialize Tox TCP server. Exiting.\n");
490 return 1; 544 return 1;
491 } 545 }
492 } 546 }
493 547
494 if (bootstrap_from_config(cfg_file_path, dht, enable_ipv6)) { 548 if (bootstrap_from_config(cfg_file_path, dht, enable_ipv6)) {
495 syslog(LOG_DEBUG, "List of bootstrap nodes read successfully\n"); 549 syslog(LOG_DEBUG, "List of bootstrap nodes read successfully.\n");
496 } else { 550 } else {
497 syslog(LOG_ERR, "Couldn't read list of bootstrap nodes in %s. Exiting.\n", cfg_file_path); 551 syslog(LOG_ERR, "Couldn't read list of bootstrap nodes in %s. Exiting.\n", cfg_file_path);
498 return 1; 552 return 1;
@@ -554,6 +608,7 @@ int main(int argc, char *argv[])
554 608
555 if (enable_lan_discovery) { 609 if (enable_lan_discovery) {
556 LANdiscovery_init(dht); 610 LANdiscovery_init(dht);
611 syslog(LOG_DEBUG, "Initialized LAN discovery.\n");
557 } 612 }
558 613
559 while (1) { 614 while (1) {