iAdd HAProxy support. - geomyidae - A small C-based gopherd. Err bitreich.org 70 hgit clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ URL:git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ bitreich.org 70 1Log /scm/geomyidae/log.gph bitreich.org 70 1Files /scm/geomyidae/files.gph bitreich.org 70 1Refs /scm/geomyidae/refs.gph bitreich.org 70 1Tags /scm/geomyidae/tag bitreich.org 70 1README /scm/geomyidae/file/README.gph bitreich.org 70 1LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit e03b02a1d3a3f7669d4bd88741def54dad981d59 /scm/geomyidae/commit/e03b02a1d3a3f7669d4bd88741def54dad981d59.gph bitreich.org 70 1parent df8683b61ecb57affad4055f649560a2a789950e /scm/geomyidae/commit/df8683b61ecb57affad4055f649560a2a789950e.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Fri, 11 Nov 2022 09:05:18 +0100 Err bitreich.org 70 i Err bitreich.org 70 iAdd HAProxy support. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M geomyidae.8 | 9 +++++++++ Err bitreich.org 70 i M main.c | 62 +++++++++++++++++++++++++++++-- Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 68 insertions(+), 3 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/geomyidae.8 b/geomyidae.8 /scm/geomyidae/file/geomyidae.8.gph bitreich.org 70 i@@ -18,6 +18,7 @@ Err bitreich.org 70 i .Op Fl e Err bitreich.org 70 i .Op Fl n Err bitreich.org 70 i .Op Fl s Err bitreich.org 70 i+.Op Fl y Err bitreich.org 70 i .Op Fl l Ar logfile Err bitreich.org 70 i .Op Fl v Ar loglevel Err bitreich.org 70 i .Op Fl b Ar base Err bitreich.org 70 i@@ -114,6 +115,9 @@ Don't perform reverse lookups. Err bitreich.org 70 i .It Fl s Err bitreich.org 70 i Log using syslog for logging. Err bitreich.org 70 i . Err bitreich.org 70 i+.It Fl y Err bitreich.org 70 i+Enable HAProxy support. Err bitreich.org 70 i+. Err bitreich.org 70 i .It Fl l Ar logfile Err bitreich.org 70 i Specify file where log output is written (no default). Err bitreich.org 70 i . Err bitreich.org 70 i@@ -483,6 +487,11 @@ Phrases_of_the_Ages.txt Err bitreich.org 70 i .Pp Err bitreich.org 70 i Care should to be exercised to avoid creating miss-Typed entries, unwanted Err bitreich.org 70 i recursions, and/or unintended writes in the working directory. Err bitreich.org 70 i+.Sh HAPROXY SUPPORT Err bitreich.org 70 i+Geomyidae has Err bitreich.org 70 i+.Em HAProxy Err bitreich.org 70 i+support. It can be enabled using the -y parameter. Err bitreich.org 70 i+. Err bitreich.org 70 i .Sh LOG FILES Err bitreich.org 70 i The log file (ie. /var/log/gopherd.log) has the following structure: Err bitreich.org 70 i . Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70 i@@ -526,7 +526,7 @@ getlistenfd(struct addrinfo *hints, char *bindip, char *port, int *rlfdnum) Err bitreich.org 70 i void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- dprintf(2, "usage: %s [-46cdens] [-l logfile] " Err bitreich.org 70 i+ dprintf(2, "usage: %s [-46cdensy] [-l logfile] " Err bitreich.org 70 i #ifdef ENABLE_TLS Err bitreich.org 70 i "[-t keyfile certfile] " Err bitreich.org 70 i #endif /* ENABLE_TLS */ Err bitreich.org 70 i@@ -546,7 +546,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i int sock, dofork = 1, inetf = AF_UNSPEC, usechroot = 0, Err bitreich.org 70 i nocgi = 0, errno_save, nbindips = 0, i, j, Err bitreich.org 70 i nlfdret, *lfdret, listfd, maxlfd, istls = 0, Err bitreich.org 70 i- dotls = 0, Err bitreich.org 70 i+ dotls = 0, dohaproxy = 0, tcpver = -1, haret = 0, Err bitreich.org 70 i #ifdef ENABLE_TLS Err bitreich.org 70 i tlspipe[2], shufbuf[1025], Err bitreich.org 70 i shuflen, wlen, shufpos, Err bitreich.org 70 i@@ -556,7 +556,9 @@ main(int argc, char *argv[]) Err bitreich.org 70 i fd_set rfd; Err bitreich.org 70 i char *port, *base, clienth[NI_MAXHOST], clientp[NI_MAXSERV], Err bitreich.org 70 i *user = NULL, *group = NULL, **bindips = NULL, Err bitreich.org 70 i- *ohost = NULL, *sport = NULL, *p, Err bitreich.org 70 i+ *ohost = NULL, *sport = NULL, *p; Err bitreich.org 70 i+ /* Must be as large as recvb, due to scanf restrictions. */ Err bitreich.org 70 i+ char hachost[1025], hashost[1025], hacport[1025], hasport[1025], Err bitreich.org 70 i #ifdef ENABLE_TLS Err bitreich.org 70 i *certfile = NULL, *keyfile = NULL, Err bitreich.org 70 i #endif /* ENABLE_TLS */ Err bitreich.org 70 i@@ -574,9 +576,11 @@ main(int argc, char *argv[]) Err bitreich.org 70 i ARGBEGIN { Err bitreich.org 70 i case '4': Err bitreich.org 70 i inetf = AF_INET; Err bitreich.org 70 i+ tcpver = 4; Err bitreich.org 70 i break; Err bitreich.org 70 i case '6': Err bitreich.org 70 i inetf = AF_INET6; Err bitreich.org 70 i+ tcpver = 6; Err bitreich.org 70 i break; Err bitreich.org 70 i case 'b': Err bitreich.org 70 i base = EARGF(usage()); Err bitreich.org 70 i@@ -630,6 +634,9 @@ main(int argc, char *argv[]) Err bitreich.org 70 i case 'v': Err bitreich.org 70 i loglvl = atoi(EARGF(usage())); Err bitreich.org 70 i break; Err bitreich.org 70 i+ case 'y': Err bitreich.org 70 i+ dohaproxy = 1; Err bitreich.org 70 i+ break; Err bitreich.org 70 i default: Err bitreich.org 70 i usage(); Err bitreich.org 70 i } ARGEND; Err bitreich.org 70 i@@ -942,6 +949,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i return 1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+read_selector_again: Err bitreich.org 70 i maxrecv = sizeof(recvb) - 1; Err bitreich.org 70 i do { Err bitreich.org 70 i #ifdef ENABLE_TLS Err bitreich.org 70 i@@ -966,6 +974,54 @@ main(int argc, char *argv[]) Err bitreich.org 70 i if (rlen <= 0) Err bitreich.org 70 i return 1; Err bitreich.org 70 i Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * HAProxy v1 protocol support. Err bitreich.org 70 i+ * TODO: Add other protocol version support. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ if (dohaproxy && !strncmp(recvb, "PROXY TCP", 9)) { Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * Be careful, we are using scanf. Err bitreich.org 70 i+ * TODO: Use some better parsing. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ memset(hachost, 0, sizeof(hachost)); Err bitreich.org 70 i+ memset(hashost, 0, sizeof(hashost)); Err bitreich.org 70 i+ memset(hacport, 0, sizeof(hacport)); Err bitreich.org 70 i+ memset(hasport, 0, sizeof(hasport)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ haret = sscanf(recvb, "PROXY TCP%d %s %s %s %s", Err bitreich.org 70 i+ &tcpver, hachost, hashost, hacport, Err bitreich.org 70 i+ hasport); Err bitreich.org 70 i+ if (haret != 5) Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * Be careful. Everything could be Err bitreich.org 70 i+ * malicious. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ memset(clienth, 0, sizeof(clienth)); Err bitreich.org 70 i+ memmove(clienth, hachost, sizeof(clienth)-1); Err bitreich.org 70 i+ memset(serverh, 0, sizeof(serverh)); Err bitreich.org 70 i+ memmove(serverh, hashost, sizeof(serverh)-1); Err bitreich.org 70 i+ memset(clientp, 0, sizeof(clientp)); Err bitreich.org 70 i+ memmove(clientp, hacport, sizeof(clientp)-1); Err bitreich.org 70 i+ memset(serverp, 0, sizeof(serverp)); Err bitreich.org 70 i+ memmove(serverp, hasport, sizeof(serverp)-1); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (!strncmp(serverh, "::ffff:", 7)) { Err bitreich.org 70 i+ memmove(serverh, serverh+7, Err bitreich.org 70 i+ strlen(serverh)-6); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (!strncmp(clienth, "::ffff:", 7)) { Err bitreich.org 70 i+ memmove(clienth, clienth+7, Err bitreich.org 70 i+ strlen(clienth)-6); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (loglvl & CONN) { Err bitreich.org 70 i+ logentry(clienth, clientp, "-", Err bitreich.org 70 i+ "haproxy connected"); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ goto read_selector_again; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i #ifdef ENABLE_TLS Err bitreich.org 70 i if (istls) { Err bitreich.org 70 i if (pipe(tlspipe) < 0) { Err bitreich.org 70 .