X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/0982871a9992e58c9a9e0bd1aedbff3e0e0d8877..9dd98618d044c63ba4d30c79350f4b6a4a2c3453:/ircd/sslproc.c diff --git a/ircd/sslproc.c b/ircd/sslproc.c index b8d551bb..f9d3efc3 100644 --- a/ircd/sslproc.c +++ b/ircd/sslproc.c @@ -35,9 +35,6 @@ #include "packet.h" #include "certfp.h" -#define ZIPSTATS_TIME 60 - -static void collect_zipstats(void *unused); static void ssl_read_ctl(rb_fde_t * F, void *data); static int ssld_count; @@ -209,7 +206,7 @@ ssl_dead(ssl_ctl_t * ctl) { ssld_count--; ilog(L_MAIN, "ssld helper died - attempting to restart"); - sendto_realops_snomask(SNO_GENERAL, L_ALL, "ssld helper died - attempting to restart"); + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "ssld helper died - attempting to restart"); start_ssldaemon(1); } } @@ -238,7 +235,7 @@ restart_ssld_event(void *unused) { int start = ServerInfo.ssld_count - get_ssld_count(); ilog(L_MAIN, "Attempting to restart ssld processes"); - sendto_realops_snomask(SNO_GENERAL, L_ALL, "Attempt to restart ssld processes"); + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Attempt to restart ssld processes"); start_ssldaemon(start); } } @@ -248,12 +245,6 @@ start_ssldaemon(int count) { rb_fde_t *F1, *F2; rb_fde_t *P1, *P2; -#ifdef _WIN32 - const char *suffix = ".exe"; -#else - const char *suffix = ""; -#endif - char fullpath[PATH_MAX + 1]; char fdarg[6]; const char *parv[2]; @@ -268,7 +259,7 @@ start_ssldaemon(int count) if(ssld_spin_count > 20 && (rb_current_time() - last_spin < 5)) { ilog(L_MAIN, "ssld helper is spinning - will attempt to restart in 1 minute"); - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "ssld helper is spinning - will attempt to restart in 1 minute"); rb_event_add("restart_ssld_event", restart_ssld_event, NULL, 60); ssld_wait = 1; @@ -280,17 +271,16 @@ start_ssldaemon(int count) if(ssld_path == NULL) { - snprintf(fullpath, sizeof(fullpath), "%s%cssld%s", ircd_paths[IRCD_PATH_LIBEXEC], RB_PATH_SEPARATOR, suffix); + snprintf(fullpath, sizeof(fullpath), "%s/ssld", ircd_paths[IRCD_PATH_LIBEXEC]); if(access(fullpath, X_OK) == -1) { - snprintf(fullpath, sizeof(fullpath), "%s%cbin%cssld%s", - ConfigFileEntry.dpath, RB_PATH_SEPARATOR, RB_PATH_SEPARATOR, suffix); + snprintf(fullpath, sizeof(fullpath), "%s/bin/ssld", ConfigFileEntry.dpath); if(access(fullpath, X_OK) == -1) { ilog(L_MAIN, - "Unable to execute ssld%s in %s or %s/bin", - suffix, ircd_paths[IRCD_PATH_LIBEXEC], ConfigFileEntry.dpath); + "Unable to execute ssld in %s or %s/bin", + ircd_paths[IRCD_PATH_LIBEXEC], ConfigFileEntry.dpath); return 0; } } @@ -322,10 +312,9 @@ start_ssldaemon(int count) rb_setenv("CTL_PIPE", fdarg, 1); snprintf(s_pid, sizeof(s_pid), "%d", (int)getpid()); rb_setenv("CTL_PPID", s_pid, 1); -#ifdef _WIN32 - SetHandleInformation((HANDLE) rb_get_fd(F2), HANDLE_FLAG_INHERIT, 1); - SetHandleInformation((HANDLE) rb_get_fd(P1), HANDLE_FLAG_INHERIT, 1); -#endif + + rb_clear_cloexec(F2); + rb_clear_cloexec(P1); pid = rb_spawn_process(ssld_path, (const char **) parv); if(pid == -1) @@ -350,37 +339,6 @@ start_ssldaemon(int count) return started; } -static void -ssl_process_zipstats(ssl_ctl_t * ctl, ssl_ctl_buf_t * ctl_buf) -{ - struct Client *server; - struct ZipStats *zips; - char *parv[7]; - (void) rb_string_to_array(ctl_buf->buf, parv, 6); - server = find_server(NULL, parv[1]); - if(server == NULL || server->localClient == NULL || !IsCapable(server, CAP_ZIP)) - return; - if(server->localClient->zipstats == NULL) - server->localClient->zipstats = rb_malloc(sizeof(struct ZipStats)); - - zips = server->localClient->zipstats; - - zips->in += strtoull(parv[2], NULL, 10); - zips->in_wire += strtoull(parv[3], NULL, 10); - zips->out += strtoull(parv[4], NULL, 10); - zips->out_wire += strtoull(parv[5], NULL, 10); - - if(zips->in > 0) - zips->in_ratio = ((double) (zips->in - zips->in_wire) / (double) zips->in) * 100.00; - else - zips->in_ratio = 0; - - if(zips->out > 0) - zips->out_ratio = ((double) (zips->out - zips->out_wire) / (double) zips->out) * 100.00; - else - zips->out_ratio = 0; -} - static void ssl_process_open_fd(ssl_ctl_t * ctl, ssl_ctl_buf_t * ctl_buf) { @@ -423,7 +381,7 @@ ssl_process_dead_fd(ssl_ctl_t * ctl, ssl_ctl_buf_t * ctl_buf) if(IsAnyServer(client_p)) { - sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) && !IsServer(client_p) ? L_NETWIDE : L_ALL, "ssld error for %s: %s", client_p->name, reason); + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "ssld error for %s: %s", client_p->name, reason); ilog(L_SERVER, "ssld error for %s: %s", log_client_name(client_p, SHOW_IP), reason); } @@ -563,19 +521,16 @@ ssl_process_cmd_recv(ssl_ctl_t * ctl) case 'F': ssl_process_certfp(ctl, ctl_buf); break; - case 'S': - ssl_process_zipstats(ctl, ctl_buf); - break; case 'I': ircd_ssl_ok = false; ilog(L_MAIN, "%s", cannot_setup_ssl); - sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s", cannot_setup_ssl); + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "%s", cannot_setup_ssl); break; case 'U': ircd_zlib_ok = 0; ircd_ssl_ok = false; ilog(L_MAIN, "%s", no_ssl_or_zlib); - sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s", no_ssl_or_zlib); + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "%s", no_ssl_or_zlib); ssl_killall(); return; case 'V': @@ -588,7 +543,7 @@ ssl_process_cmd_recv(ssl_ctl_t * ctl) break; default: ilog(L_MAIN, "Received invalid command from ssld: %s", ctl_buf->buf); - sendto_realops_snomask(SNO_GENERAL, L_ALL, "Received invalid command from ssld"); + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Received invalid command from ssld"); break; } rb_dlinkDelete(ptr, &ctl->readq); @@ -740,7 +695,7 @@ send_new_ssl_certs_one(ssl_ctl_t * ctl) if(len > sizeof(tmpbuf)) { - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Parameters for send_new_ssl_certs_one too long (%zu > %zu) to pass to ssld, not sending...", len, sizeof(tmpbuf)); ilog(L_MAIN, @@ -849,126 +804,6 @@ ssld_decrement_clicount(ssl_ctl_t * ctl) } } -/* - * what we end up sending to the ssld process for ziplinks is the following - * Z[ourfd][level][RECVQ] - * Z = ziplinks command = buf[0] - * ourfd = Our end of the socketpair = buf[1..4] - * level = zip level buf[5] - * recvqlen = our recvq len = buf[6-7] - * recvq = any data we read prior to starting ziplinks - */ -void -start_zlib_session(void *data) -{ - struct Client *server = (struct Client *) data; - uint16_t recvqlen; - uint8_t level; - void *xbuf; - - rb_fde_t *F[2]; - rb_fde_t *xF1, *xF2; - char *buf; - void *recvq_start; - - size_t hdr = (sizeof(uint8_t) * 2) + sizeof(uint32_t); - size_t len; - int cpylen, left; - - server->localClient->event = NULL; - - recvqlen = rb_linebuf_len(&server->localClient->buf_recvq); - - len = recvqlen + hdr; - - if(len > READBUF_SIZE) - { - sendto_realops_snomask(SNO_GENERAL, L_ALL, - "ssld - attempted to pass message of %zd len, max len %d, giving up", - len, READBUF_SIZE); - ilog(L_MAIN, "ssld - attempted to pass message of %zd len, max len %d, giving up", len, READBUF_SIZE); - exit_client(server, server, server, "ssld readbuf exceeded"); - return; - } - - buf = rb_malloc(len); - level = ConfigFileEntry.compression_level; - - uint32_to_buf(&buf[1], rb_get_fd(server->localClient->F)); - buf[5] = (char) level; - - recvq_start = &buf[6]; - server->localClient->zipstats = rb_malloc(sizeof(struct ZipStats)); - - xbuf = recvq_start; - left = recvqlen; - - do - { - cpylen = rb_linebuf_get(&server->localClient->buf_recvq, xbuf, left, LINEBUF_PARTIAL, LINEBUF_RAW); - left -= cpylen; - xbuf = (void *) (((uintptr_t) xbuf) + cpylen); - } - while(cpylen > 0); - - /* Pass the socket to ssld. */ - *buf = 'Z'; - if(rb_socketpair(AF_UNIX, SOCK_STREAM, 0, &xF1, &xF2, "Initial zlib socketpairs") == -1) - { - sendto_realops_snomask(SNO_GENERAL, L_ALL, "Error creating zlib socketpair - %s", strerror(errno)); - ilog(L_MAIN, "Error creating zlib socketpairs - %s", strerror(errno)); - exit_client(server, server, server, "Error creating zlib socketpair"); - rb_free(buf); - return; - } - - F[0] = server->localClient->F; - F[1] = xF1; - server->localClient->F = xF2; - /* need to redo as what we did before isn't valid now */ - uint32_to_buf(&buf[1], connid_get(server)); - - server->localClient->z_ctl = which_ssld(); - if(!server->localClient->z_ctl) - { - exit_client(server, server, server, "Error finding available ssld"); - rb_free(buf); - return; - } - server->localClient->z_ctl->cli_count++; - ssl_cmd_write_queue(server->localClient->z_ctl, F, 2, buf, len); - rb_free(buf); -} - -static void -collect_zipstats(void *unused) -{ - rb_dlink_node *ptr; - struct Client *target_p; - char buf[sizeof(uint8_t) + sizeof(uint32_t) + HOSTLEN]; - void *odata; - size_t len; - uint32_t id; - - buf[0] = 'S'; - odata = buf + sizeof(uint8_t) + sizeof(uint32_t); - - RB_DLINK_FOREACH(ptr, serv_list.head) - { - target_p = ptr->data; - if(IsCapable(target_p, CAP_ZIP)) - { - len = sizeof(uint8_t) + sizeof(uint32_t); - - id = rb_get_fd(target_p->localClient->F); - uint32_to_buf(&buf[1], id); - rb_strlcpy(odata, target_p->name, (sizeof(buf) - len)); - len += strlen(odata) + 1; /* Get the \0 as well */ - ssl_cmd_write_queue(target_p->localClient->z_ctl, NULL, 0, buf, len); - } - } -} - static void cleanup_dead_ssl(void *unused) { @@ -1008,6 +843,5 @@ ssld_foreach_info(void (*func)(void *data, pid_t pid, int cli_count, enum ssld_s void init_ssld(void) { - rb_event_addish("collect_zipstats", collect_zipstats, NULL, ZIPSTATS_TIME); rb_event_addish("cleanup_dead_ssld", cleanup_dead_ssl, NULL, 60); }