summaryrefslogtreecommitdiff
path: root/other
diff options
context:
space:
mode:
Diffstat (limited to 'other')
-rw-r--r--other/bootstrap_serverdaemon/CMakeLists.txt1
-rw-r--r--other/bootstrap_serverdaemon/DHT_bootstrap_daemon.c394
-rwxr-xr-xother/bootstrap_serverdaemon/DHT_bootstrap_daemon.sh109
-rw-r--r--other/bootstrap_serverdaemon/initscript.sh109
-rw-r--r--other/bootstrap_serverdaemon/server.cfg30
5 files changed, 470 insertions, 173 deletions
diff --git a/other/bootstrap_serverdaemon/CMakeLists.txt b/other/bootstrap_serverdaemon/CMakeLists.txt
index bc717d4b..6aa4dbee 100644
--- a/other/bootstrap_serverdaemon/CMakeLists.txt
+++ b/other/bootstrap_serverdaemon/CMakeLists.txt
@@ -6,4 +6,5 @@ set(exe_name DHT_bootstrap_daemon)
6add_executable(${exe_name} 6add_executable(${exe_name}
7 DHT_bootstrap_daemon.c) 7 DHT_bootstrap_daemon.c)
8 8
9target_link_libraries(${exe_name} config)
9linkCoreLibraries(${exe_name}) 10linkCoreLibraries(${exe_name})
diff --git a/other/bootstrap_serverdaemon/DHT_bootstrap_daemon.c b/other/bootstrap_serverdaemon/DHT_bootstrap_daemon.c
index 4d79c48b..395bd7f2 100644
--- a/other/bootstrap_serverdaemon/DHT_bootstrap_daemon.c
+++ b/other/bootstrap_serverdaemon/DHT_bootstrap_daemon.c
@@ -1,50 +1,305 @@
1/* DHT boostrap 1/* DHT boostrap
2* 2 *
3* A simple DHT boostrap server for tox (daemon edition) 3 * A simple DHT boostrap server for tox - daemon edition.
4*/ 4 */
5 5
6#include <sys/types.h> /* pid_t */ 6#include <sys/types.h> /* pid_t */
7#include <sys/stat.h> /* umask */ 7#include <sys/stat.h> /* umask */
8#include <stdio.h>
9#include <stdlib.h>
10#include <unistd.h> /* POSIX things */ 8#include <unistd.h> /* POSIX things */
11#include <errno.h> 9#include <errno.h>
12 10
11#include <stdio.h>
12#include <stdlib.h>
13#include <libconfig.h>
14#include <arpa/inet.h> /* htons() */
15#include <string.h> /* strcpy() */
16
13#include "../../core/DHT.h" 17#include "../../core/DHT.h"
14#include "../../core/friend_requests.h" 18#include "../../core/friend_requests.h"
15 19
16 20#define DEFAULT_PORT 33445
17/* Sleep function (x = milliseconds) */ 21#define DEFAULT_PID_FILE "bootstrap_server.pid"
18#ifdef WIN32 22#define DEFAULT_KEYS_FILE "bootstrap_server.keys"
19#define c_sleep(x) Sleep(1*x) 23
20#else 24/* Server info struct */
21#include <unistd.h> 25struct server_info_s {
22#define c_sleep(x) usleep(1000*x) 26 int valid;
23#endif 27 IP_Port conn;
24 28 uint8_t bs_pk[32];
25#define PORT 33445 29};
26#define USERNAME getenv("USER") 30
27#define PIDFILE "/home/%s/.bootstrap_server.pid" /* %s represents the unser's name */ 31/* This is the struct configure_server() uses to return its data to */
28 32struct server_conf_s {
33 int err;
34 int port;
35 char pid_file[512];
36 char keys_file[512];
37 struct server_info_s info[32];
38};
39
40int b16_to_key(char b16_string[], uint8_t *bs_pubkey) {
41
42 int i;
43 unsigned int num1 = 0, num2 = 0;
44
45 for(i = 0; i < 32; ++i)
46 {
47 sscanf(&b16_string[i*2], "%1X", &num1);
48 sscanf(&b16_string[i*2+1], "%1X", &num2);
49 num1 = num1 << 4;
50 bs_pubkey[i] = bs_pubkey[i] | num1;
51 bs_pubkey[i] = bs_pubkey[i] | num2;
52 }
53 return 0;
54}
55
56/* This unction connects to all specified servers
57and connect to them.
58returns 1 if the connection to the DHT is up
59returns -1 if all attempts failed
60*/
61int connect_to_servers(struct server_info_s *info)
62{
63 int i;
64 int c;
65
66 IP_Port ip_port;
67 uint8_t data[MAX_UDP_PACKET_SIZE];
68 uint32_t length;
69
70 for(i = 0; i < 32; ++i) {
71 if(info[i].valid) {
72 /* Actual bootstrapping code goes here */
73 //puts("Calling DHT_bootstrap");
74 DHT_bootstrap(info[i].conn, info[i].bs_pk);
75 }
76 }
77
78 /* Check if we're connected to the DHT */
79 for(c = 0; c != 100; ++c) {
80 usleep(10000);
81 if(DHT_isconnected()) {
82 //puts("Connected");
83 return 1;
84 break;
85 }
86 if(DHT_isconnected() == 0 && c == 99) {
87 //puts("Not connected");
88 return -1;
89 break;
90 }
91
92 doDHT();
93
94 while(receivepacket(&ip_port, data, &length) != -1)
95 {
96 DHT_handlepacket(data, length, ip_port);
97 }
98 }
99
100 /* This probably never happens */
101 return 0;
102}
103
104void manage_keys(char *keys_file)
105{
106 const uint32_t KEYS_SIZE = crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES;
107 uint8_t keys[KEYS_SIZE];
108
109 /* TODO: stat the file before trying to open it. We aren't cave people! */
110 FILE *keysf = fopen(keys_file, "r");
111 if (keysf != NULL) {
112 /* if file was opened successfully -- load keys */
113 size_t read_size = fread(keys, sizeof(uint8_t), KEYS_SIZE, keysf);
114 if (read_size != KEYS_SIZE) {
115 printf("Error while reading the key file\nExiting.\n");
116 exit(1);
117 } else {
118 printf("Keys loaded successfully\n");
119 }
120 load_keys(keys);
121
122 } else {
123 /* otherwise save new keys */
124 /* Silly work-around to ignore any errors coming from new_keys() */
125 new_keys();
126 save_keys(keys);
127 keysf = fopen(keys_file, "w");
128 if (fwrite(keys, sizeof(uint8_t), KEYS_SIZE, keysf) != KEYS_SIZE) {
129 printf("Error while writing the key file.\nExiting.\n");
130 exit(1);
131 } else {
132 printf("Keys saved successfully\n");
133 }
134 }
135
136 fclose(keysf);
137}
138
139/* This reads the configuration file, and returns a struct server_conf_s with:
140 *an error number:
141 *-1 = file wasn't read, for whatever reason
142 *-2 = no bootstrap servers found
143 *the port
144 *the location of the keys file
145 *the location of the PID file
146 *the list of bootstrap servers
147*/
148struct server_conf_s configure_server(char *cfg_file)
149{
150 config_t cfg;
151 config_setting_t *server_list;
152
153 /* This one will be strcpy'd into the pid_file array in server_conf */
154 const char *pid_file_tmp;
155 const char *keys_file_tmp;
156
157 /* Remote bootstrap server variables */
158 int bs_port;
159 const char *bs_ip;
160 const char *bs_pk;
161
162 /* The big struct */
163 static struct server_conf_s server_conf;
164
165 /* Set both to their default values. If there's an error
166 with opening/reading the config file, we return right away */
167 server_conf.port = DEFAULT_PORT;
168 strcpy(server_conf.pid_file, DEFAULT_PID_FILE);
169 strcpy(server_conf.keys_file, DEFAULT_KEYS_FILE);
170
171 config_init(&cfg);
172
173 /* Read the file. If there is an error, report it and exit. */
174 if(! config_read_file(&cfg, cfg_file))
175 {
176 fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg),
177 config_error_line(&cfg), config_error_text(&cfg));
178 config_destroy(&cfg);
179 server_conf.err = -1;
180 return server_conf;
181 }
182
183 /* Get the port to listen on */
184 if(config_lookup_int(&cfg, "port", &server_conf.port)) {
185 //printf("Port: %d\n", port);
186 } else {
187 fprintf(stderr, "No 'port' setting in configuration file.\n");
188 }
189
190 /* Get PID file location */
191 if(config_lookup_string(&cfg, "pid_file", &pid_file_tmp)) {
192 //printf("PID file: %s\n", pid_file_tmp);
193 strcpy(server_conf.pid_file, pid_file_tmp);
194 } else {
195 fprintf(stderr, "No 'pid_file' setting in configuration file.\n");
196 }
197
198 /* Get keys file location */
199 if(config_lookup_string(&cfg, "keys_file", &keys_file_tmp)) {
200 //printf("Keys file: %s\n", keys_file_tmp);
201 strcpy(server_conf.keys_file, keys_file_tmp);
202 } else {
203 fprintf(stderr, "No 'keys_file' setting in configuration file.\n");
204 }
205
206 /* Get all the servers in the list */
207 server_list = config_lookup(&cfg, "bootstrap_servers");
208 if(server_list != NULL) {
209 int count = config_setting_length(server_list);
210 int i;
211
212 char tmp_ip[30]; /* IP */
213 char tmp_pk[64]; /* bs_pk */
214 for(i = 0; i < count; ++i) {
215 config_setting_t *server = config_setting_get_elem(server_list, i);
216 /* Get a pointer on the key aray */
217 uint8_t *bs_pk_p = server_conf.info[i].bs_pk;
218
219 /* Only output the record if all of the expected fields are present. */
220 if(!(config_setting_lookup_string(server, "ip", &bs_ip)
221 && config_setting_lookup_int(server, "port", &bs_port)
222 && config_setting_lookup_string(server, "bs_pk", &bs_pk)))
223 continue;
224
225 /* Converting all that stuff into usable formats and storing
226 it away in the server_info struct */
227 server_conf.info[i].valid = 1;
228
229 if(resolve_addr(strcpy(tmp_ip, bs_ip)) == -1) {
230 server_conf.info[i].valid = 0;
231 printf("bootstrap_server %d: Invalid IP\n", i);
232 }
233
234 if(strlen(bs_pk) != 64) {
235 server_conf.info[i].valid = 0;
236 printf("bootstrap_server %d: Invalid public key\n", i);
237 }
238
239 if(!bs_port) {
240 server_conf.info[i].valid = 0;
241 printf("bootstrap_server %d: Invalid port\n", i);
242 }
243
244 server_conf.info[i].conn.ip.i = resolve_addr(strcpy(tmp_ip, bs_ip));
245 server_conf.info[i].conn.port = htons(bs_port);
246 b16_to_key(strcpy(tmp_pk, bs_pk), bs_pk_p);
247 }
248
249 /* Check if at least one server entry is valid */
250 for(i = 0; i < 32; ++i) {
251 if(server_conf.info[i].valid)
252 break;
253 else
254 server_conf.err = -2;
255 }
256
257 } else {
258 server_conf.err = -2;
259 }
260
261 config_destroy(&cfg);
262 return server_conf;
263}
264
29int main(int argc, char *argv[]) { 265int main(int argc, char *argv[]) {
30 266
31 char pidfloc[512]; /* Location of the soon-to-be PID file */
32 pid_t pid, sid; /* Process- and Session-ID */ 267 pid_t pid, sid; /* Process- and Session-ID */
33 268 struct server_conf_s server_conf;
269
34 FILE *pidf; /* The PID file */ 270 FILE *pidf; /* The PID file */
35 271
36 /* Assemble PID file location an try to open the file */ 272 if(argc < 2) {
37 sprintf(pidfloc, PIDFILE, USERNAME); 273 printf("Please specify a configuration file.\n");
38 pidf = fopen(pidfloc, "w"); 274 exit(EXIT_FAILURE);
39 275 }
40 /* Generate new keypair */ 276
41 new_keys(); 277 /* Read the config file */
42 278 server_conf = configure_server(argv[1]);
279
280 printf("PID file: %s\n", server_conf.pid_file);
281 printf("Key file: %s\n", server_conf.keys_file);
282
283 if(server_conf.err == -1)
284 printf("Config file not read.\n");
285
286 if(server_conf.err == -2)
287 printf("No valid servers in list.\n");
288
289 /* Open PID file for writing - if an error happens,
290 it will be caught down the line */
291 pidf = fopen(server_conf.pid_file, "w");
292
293 /* Manage the keys */
294 /* for now, just ignore any errors after this call. */
295 int tmperr = errno;
296 manage_keys(server_conf.keys_file);
297 errno = tmperr;
298
43 /* Public key */ 299 /* Public key */
44 uint32_t i; 300 int i;
45
46 printf("\nPublic Key: "); 301 printf("\nPublic Key: ");
47 for(i = 0; i < 32; i++) 302 for(i = 0; i < 32; ++i)
48 { 303 {
49 uint8_t ln, hn; 304 uint8_t ln, hn;
50 ln = 0x0F & self_public_key[i]; 305 ln = 0x0F & self_public_key[i];
@@ -53,84 +308,95 @@ int main(int argc, char *argv[]) {
53 printf("%X%X", hn, ln); 308 printf("%X%X", hn, ln);
54 } 309 }
55 printf("\n"); 310 printf("\n");
56 311
57 /* initialize networking 312 /* initialize networking
58 bind to ip 0.0.0.0:PORT */ 313 bind to ip 0.0.0.0:PORT */
59 IP ip; 314 IP ip;
60 ip.i = 0; 315 ip.i = 0;
61 init_networking(ip, PORT); 316 init_networking(ip, server_conf.port);
62 317
318 /* Bootstrap the DHT
319 This one throws odd errors, too. Ignore. I assume they come
320 from somewhere in the core. */
321 tmperr = errno;
322 connect_to_servers(server_conf.info);
323 errno = tmperr;
324
325 if(!DHT_isconnected()) {
326 puts("Could not establish DHT connection. Check server settings.\n");
327 exit(EXIT_FAILURE);
328 } else {
329 printf("Connected to DHT successfully.\n");
330 }
331
63 /* If there's been an error, exit before forking off */ 332 /* If there's been an error, exit before forking off */
64 if (errno != 0) { 333 if (errno != 0) {
65 perror("Error"); 334 perror("Error");
66 printf("Error(s) occured during start-up. Exiting.\n"); 335 printf("Error(s) occured during start-up. Exiting.\n");
67 exit(EXIT_FAILURE); 336 exit(EXIT_FAILURE);
68 } 337 }
69 338
70// /* Assemble the location of the PID file */ 339 /* Things that make the daemon work come past here.
71// sprintf(pidfloc, PIDFILE, USERNAME); 340 There should be nothing here but the daemon code and
72// pidf = fopen(pidfloc, "w"); 341 the main loop. */
73// /* Check if we can actually open the file */ 342
74// if(pidf == NULL) { 343 /* Fork off from the parent process */
75// printf("Couldn't open PID-File %s for writing.\n", pidfloc);
76// exit(EXIT_FAILURE);
77// }
78
79 /* Fork off the parent process */
80 pid = fork(); 344 pid = fork();
81 if (pid < 0) { 345 if (pid < 0) {
82 printf("Forking failed.\n"); 346 printf("Forking failed.\n");
83 exit(EXIT_FAILURE); 347 exit(EXIT_FAILURE);
84 } 348 }
85 349
86 /* If we got a good PID, then 350 /* If we got a good PID, then
87 we can exit the parent process. */ 351 we can exit the parent process. */
88 if (pid > 0) { 352 if (pid > 0) {
89 printf("Forked successfully: %d\n", pid); 353 printf("Forked successfully: %d\n", pid);
90 354
91 /* Write the PID file */ 355 /* Write the PID file */
92 fprintf(pidf, "%d\n", pid); 356 fprintf(pidf, "%d\n", pid);
93 fclose(pidf); 357 fclose(pidf);
94 358
95 /* Exit parent */ 359 /* Exit parent */
96 exit(EXIT_SUCCESS); 360 exit(EXIT_SUCCESS);
97 } 361 }
98 362
99 /* Change the file mode mask */ 363 /* Change the file mode mask */
100 umask(0); 364 umask(0);
101 365
102 /* Create a new SID for the child process */ 366 /* Create a new SID for the child process */
103 sid = setsid(); 367 sid = setsid();
104 if (sid < 0) { 368 if (sid < 0) {
105 printf("SID creation failure.\n"); 369 printf("SID creation failure.\n");
106 exit(EXIT_FAILURE); 370 exit(EXIT_FAILURE);
107 } 371 }
108 372
109 /* Change the current working directory */ 373 /* Change the current working directory */
110 if ((chdir("/")) < 0) { 374 if ((chdir("/")) < 0) {
111 exit(EXIT_FAILURE); 375 exit(EXIT_FAILURE);
112 } 376 }
113 377
114 /* Go quiet */ 378 /* Go quiet */
115 close(STDIN_FILENO);
116 close(STDOUT_FILENO); 379 close(STDOUT_FILENO);
380 close(STDIN_FILENO);
117 close(STDERR_FILENO); 381 close(STDERR_FILENO);
118 382
383 /* Main loop */
119 IP_Port ip_port; 384 IP_Port ip_port;
120 uint8_t data[MAX_UDP_PACKET_SIZE]; 385 uint8_t data[MAX_UDP_PACKET_SIZE];
121 uint32_t length; 386 uint32_t length;
122 387
123 /* Main loop */ 388 while(1)
124 while(1) { 389 {
125 doDHT(); 390 doDHT();
126 while(receivepacket(&ip_port, data, &length) != -1) { 391
392 while(receivepacket(&ip_port, data, &length) != -1)
393 {
127 DHT_handlepacket(data, length, ip_port); 394 DHT_handlepacket(data, length, ip_port);
128 friendreq_handlepacket(data, length, ip_port); 395 friendreq_handlepacket(data, length, ip_port);
129 } 396 }
130 c_sleep(1); 397 usleep(10000);
131 } 398 }
132 399
133 shutdown_networking(); 400 shutdown_networking();
134 exit(EXIT_SUCCESS); 401 exit(EXIT_SUCCESS);
135} 402}
136
diff --git a/other/bootstrap_serverdaemon/DHT_bootstrap_daemon.sh b/other/bootstrap_serverdaemon/DHT_bootstrap_daemon.sh
new file mode 100755
index 00000000..936bc808
--- /dev/null
+++ b/other/bootstrap_serverdaemon/DHT_bootstrap_daemon.sh
@@ -0,0 +1,109 @@
1#! /bin/sh
2### BEGIN INIT INFO
3# Provides: DHT_bootstrap_daemon
4# Required-Start: $remote_fs $syslog
5# Required-Stop: $remote_fs $syslog
6# Default-Start: 2 3 4 5
7# Default-Stop: 0 1 6
8# Short-Description: Start the Tox bootstrapping server
9# Description: Use this piece of junk to start the Tox
10# bootstrap server.
11### END INIT INFO
12
13# PATH should only include /usr/* if it runs after the mountnfs.sh script
14PATH=/sbin:/usr/sbin:/bin:/usr/bin
15DESC="ProjectTox bootstrap server daemon"
16NAME=DHT_bootstrap_daemon
17CFG=/home/$USER/server.cfg
18DAEMON=/home/$USER/$NAME
19DAEMON_ARGS="$CFG"
20PIDFILE=/home/$USER/.$NAME.pid
21SCRIPTNAME=/etc/init.d/$NAME
22
23# Exit if the package is not installed
24[ -x "$DAEMON" ] || exit 0
25
26# Read configuration variable file if it is present
27#[ -r /etc/default/$NAME ] && . /etc/default/$NAME
28
29# Load the VERBOSE setting and other rcS variables
30. /lib/init/vars.sh
31
32# Define LSB log_* functions.
33# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
34# and status_of_proc is working.
35. /lib/lsb/init-functions
36
37#
38# Function that starts the daemon/service
39#
40do_start()
41{
42 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
43 || return 1
44 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
45 $DAEMON_ARGS \
46 || return 2
47 sleep 1
48}
49
50#
51# Function that stops the daemon/service
52#
53do_stop()
54{
55 start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --exec $DAEMON
56 RETVAL="$?"
57 [ "$RETVAL" = 2 ] && return 2
58
59 start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
60 [ "$?" = 2 ] && return 2
61 # Many daemons don't delete their pidfiles when they exit.
62 rm -f $PIDFILE
63 return "$RETVAL"
64}
65
66case "$1" in
67 start)
68 [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
69 do_start
70 case "$?" in
71 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
72 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
73 esac
74 ;;
75 stop)
76 [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
77 do_stop
78 case "$?" in
79 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
80 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
81 esac
82 ;;
83 status)
84 status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
85 ;;
86
87 restart) #|force-reload)
88 log_daemon_msg "Restarting $DESC" "$NAME"
89 do_stop
90 case "$?" in
91 0|1)
92 do_start
93 case "$?" in
94 0) log_end_msg 0 ;;
95 1) log_end_msg 1 ;; # Old process is still running
96 *) log_end_msg 1 ;; # Failed to start
97 esac
98 ;;
99 *)
100 # Failed to stop
101 log_end_msg 1
102 ;;
103 esac
104 ;;
105 *)
106 echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
107 exit 3
108 ;;
109esac
diff --git a/other/bootstrap_serverdaemon/initscript.sh b/other/bootstrap_serverdaemon/initscript.sh
deleted file mode 100644
index aa4b3e77..00000000
--- a/other/bootstrap_serverdaemon/initscript.sh
+++ /dev/null
@@ -1,109 +0,0 @@
1#! /bin/sh
2### BEGIN INIT INFO
3# Provides: bootstrap_server
4# Required-Start: $remote_fs $syslog
5# Required-Stop: $remote_fs $syslog
6# Default-Start: 2 3 4 5
7# Default-Stop: 0 1 6
8# Short-Description: Start the Tox bootstrapping server
9# Description: Use this piece of junk to start the Tox
10# bootstrap server.
11### END INIT INFO
12
13# PATH should only include /usr/* if it runs after the mountnfs.sh script
14PATH=/sbin:/usr/sbin:/bin:/usr/bin
15DESC="ProjectTox bootstrap server daemon"
16NAME=bootstrap_server
17DAEMON=/home/$USER/$NAME
18DAEMON_ARGS=""
19PIDFILE=/home/$USER/.$NAME.pid
20SCRIPTNAME=/etc/init.d/$NAME
21
22# Exit if the package is not installed
23[ -x "$DAEMON" ] || exit 0
24
25# Read configuration variable file if it is present
26[ -r /etc/default/$NAME ] && . /etc/default/$NAME
27
28# Load the VERBOSE setting and other rcS variables
29. /lib/init/vars.sh
30
31# Define LSB log_* functions.
32# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
33# and status_of_proc is working.
34. /lib/lsb/init-functions
35
36#
37# Function that starts the daemon/service
38#
39do_start()
40{
41 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
42 || return 1
43 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
44 $DAEMON_ARGS \
45 || return 2
46 sleep 1
47}
48
49#
50# Function that stops the daemon/service
51#
52do_stop()
53{
54 start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --exec $DAEMON
55 RETVAL="$?"
56 [ "$RETVAL" = 2 ] && return 2
57
58 start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
59 [ "$?" = 2 ] && return 2
60 # Many daemons don't delete their pidfiles when they exit.
61 rm -f $PIDFILE
62 return "$RETVAL"
63}
64
65case "$1" in
66 start)
67 [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
68 do_start
69 case "$?" in
70 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
71 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
72 esac
73 ;;
74 stop)
75 [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
76 do_stop
77 case "$?" in
78 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
79 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
80 esac
81 ;;
82 status)
83 status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
84 ;;
85
86 restart) #|force-reload)
87 log_daemon_msg "Restarting $DESC" "$NAME"
88 do_stop
89 case "$?" in
90 0|1)
91 do_start
92 case "$?" in
93 0) log_end_msg 0 ;;
94 1) log_end_msg 1 ;; # Old process is still running
95 *) log_end_msg 1 ;; # Failed to start
96 esac
97 ;;
98 *)
99 # Failed to stop
100 log_end_msg 1
101 ;;
102 esac
103 ;;
104 *)
105 echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
106 exit 3
107 ;;
108esac
109
diff --git a/other/bootstrap_serverdaemon/server.cfg b/other/bootstrap_serverdaemon/server.cfg
new file mode 100644
index 00000000..8ef516ca
--- /dev/null
+++ b/other/bootstrap_serverdaemon/server.cfg
@@ -0,0 +1,30 @@
1// ProjectTox bootstrap server configuration file
2
3// The port used by bootstrap_server to listen on
4port = 33445;
5
6// The key file
7// make sure that the user who runs the server
8// does have permissions to read it/write to it
9keys_file = "/home/tom/.bootstrap_server.keys"
10
11// The PID file written to by bootstrap_server,
12// make sure that the user who runs the server
13// does have permissions to write to it
14pid_file = "/home/tom/.bootstrap_server.pid";
15
16// The info of the node bootstap_server will
17// bootstrap itself from.
18bootstrap_servers = (
19 { // Server 1
20 ip = "198.46.136.167";
21 port = 33445;
22 bs_pk = "728925473812C7AAC482BE7250BCCAD0B8CB9F737BF3D42ABD34459C1768F854";
23// }
24 },
25 { // Server 2
26 ip = "192.81.133.111";
27 port = 33445;
28 bs_pk = "8CD5A9BF0A6CE358BA36F7A653F99FA6B258FF756E490F52C1F98CC420F78858";
29 }
30);