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