144 lines
4.5 KiB
C
144 lines
4.5 KiB
C
#include "donar_server.h"
|
|
|
|
void create_onion_services(struct tor_os_str* tos, struct tor_ctl* tctl, uint16_t* ports, int ports_count, enum TOR_ONION_FLAGS tof) {
|
|
tor_os_create (tos, "onion_services.pub", "onion_services.txt", 1);
|
|
tor_os_read (tos);
|
|
|
|
int err = 0;
|
|
err = tor_ctl_connect (tctl, "127.0.0.1", "9051");
|
|
if (err < 0) {
|
|
fprintf(stderr, "Unable to open Tor Socket\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
err = tor_ctl_add_onion (tctl, tos, ports, ports_count, tof);
|
|
if (err != 0) {
|
|
fprintf(stderr, "Unable to create Onion Services (error: %d)\n", err);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
}
|
|
|
|
void destroy_resources(struct tor_os_str* tos, struct tor_ctl* tctl) {
|
|
tor_ctl_close (tctl);
|
|
tor_os_free (tos);
|
|
}
|
|
|
|
void init_tcp_servers(struct donar_server_ctx* ctx, int nlinks) {
|
|
char url[1024];
|
|
struct evt_core_cat cat = {0};
|
|
struct evt_core_fdinfo fdinfo = {0};
|
|
fdinfo.cat = &cat;
|
|
fdinfo.url = url;
|
|
|
|
char buffer[6];
|
|
int err, sock = 0;
|
|
for (int i = 0; i < nlinks; i++) {
|
|
sprintf (buffer, "%d", ctx->ports[i]);
|
|
//@FIXME shouldn't listen on 0.0.0.0 but 127.13.3.7 is not compatible with docker
|
|
sock = create_tcp_server ("0.0.0.0", buffer);
|
|
if (sock < 0) goto socket_create_err;
|
|
err = listen(sock, SOMAXCONN);
|
|
if (err != 0) goto socket_create_err;
|
|
|
|
fdinfo.cat->name = "tcp-listen";
|
|
fdinfo.fd = sock;
|
|
sprintf(fdinfo.url, "tcp:listen:127.0.0.1:%d", ctx->ports[i]);
|
|
evt_core_add_fd(&(ctx->evts), &fdinfo);
|
|
}
|
|
return;
|
|
|
|
socket_create_err:
|
|
fprintf(stderr, "Unable to create a TCP socket\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
struct tor_ctl* ugly_global_tctl;
|
|
int donar_server_stream_repair(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
|
fprintf(stdout, "[%s][donar-server] %s broke\n", current_human_datetime (), fdinfo->url);
|
|
|
|
struct evt_core_fdinfo* fdtarget = NULL;
|
|
int port = url_get_port_int (fdinfo->url);
|
|
int pos = port - 7500, removed = 0;
|
|
char buffer[256];
|
|
|
|
sprintf(buffer, "tcp:read:127.0.0.1:%d", port);
|
|
fdtarget = evt_core_get_from_url (ctx, buffer);
|
|
if (fdtarget != NULL) {
|
|
evt_core_rm_fd(ctx, fdtarget->fd);
|
|
removed++;
|
|
}
|
|
|
|
sprintf(buffer, "tcp:write:127.0.0.1:%d", port);
|
|
fdtarget = evt_core_get_from_url (ctx, buffer);
|
|
if (fdtarget != NULL) {
|
|
evt_core_rm_fd(ctx, fdtarget->fd);
|
|
removed++;
|
|
}
|
|
printf("[%s][donar-server] removed %d links\n", current_human_datetime (), removed);
|
|
|
|
return 1;
|
|
}
|
|
|
|
struct donar_server_os_republish_params {
|
|
struct donar_server_ctx* dctx;
|
|
struct donar_params* dp;
|
|
};
|
|
/*
|
|
void republish_tor_os(struct evt_core_ctx* ctx, void* user_data) {
|
|
struct donar_server_os_republish_params* dsorp = user_data;
|
|
|
|
int err = 0;
|
|
printf("Republish Tor OS\n");
|
|
err = tor_ctl_add_onion (&dsorp->dctx->tctl, &dsorp->dctx->tos, dsorp->dctx->ports, dsorp->dp->tof);
|
|
if (err != 0) {
|
|
fprintf(stderr, "Unable to create Onion Services (error: %d)\n", err);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
printf("Republish Tor OS\n");
|
|
}*/
|
|
|
|
void donar_server(struct donar_server_ctx* ctx, struct donar_params* dp) {
|
|
struct algo_params ap = {
|
|
.is_waiting_bootstrap = dp->is_waiting_bootstrap,
|
|
.algo_specific_params = dp->algo_specific_params,
|
|
.algo_name = dp->algo,
|
|
.links = dp->links,
|
|
.fresh_data = dp->fresh_data,
|
|
.redundant_data = dp->redundant_data,
|
|
.capture_file = dp->capture_file,
|
|
.sr = donar_server_stream_repair
|
|
};
|
|
|
|
evt_core_init (&(ctx->evts), dp->verbose);
|
|
|
|
signal_init(&ctx->evts);
|
|
printf("--- Signal initialized\n");
|
|
|
|
algo_main_init(&ctx->evts, &ap);
|
|
printf("--- Algorithm initialized\n");
|
|
|
|
for (uint16_t i = 0; i < dp->links ; i++) {
|
|
ctx->ports[i] = 7500 + i;
|
|
}
|
|
create_onion_services (&(ctx->tos), &(ctx->tctl), ctx->ports, dp->links, dp->tof);
|
|
ugly_global_tctl = &(ctx->tctl);
|
|
/*struct donar_server_os_republish_params dsorp = { .dctx = ctx, dp = dp};
|
|
init_timer(&(ctx->evts));
|
|
set_timeout(&(ctx->evts), 1000, &dsorp, republish_tor_os); */
|
|
printf("--- Onion services created\n");
|
|
|
|
init_tcp_servers(ctx, dp->links);
|
|
printf("--- TCP servers are listening\n");
|
|
|
|
g_ptr_array_foreach (dp->remote_ports, (void(*)(void*, void*))init_udp_remote, &(ctx->evts));
|
|
printf("--- Remote ports are binded locally\n");
|
|
|
|
for (int i = 0; i < dp->exposed_ports->len; i++) {
|
|
init_udp_exposed(dp->bound_ip, g_ptr_array_index (dp->exposed_ports, i), &(ctx->evts));
|
|
}
|
|
printf("--- Local UDP services (on %s) are exposed\n", dp->bound_ip);
|
|
|
|
evt_core_loop (&(ctx->evts));
|
|
|
|
//stop_timer(&(ctx->evts));
|
|
destroy_resources (&(ctx->tos), &(ctx->tctl));
|
|
}
|