geomyidae.8 - geomyidae - A small C-based gopherd. | |
git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
geomyidae.8 (17814B) | |
--- | |
1 .\" geomyidae.8 handcrafted in GNU groff -mdoc using nvi | |
2 .\" | |
3 .Dd January 4, 2025 | |
4 .Dt GEOMYIDAE 8 | |
5 .Os | |
6 . | |
7 .Sh NAME | |
8 .Nm geomyidae | |
9 .Nd a gopher daemon for Linux/BSD | |
10 . | |
11 .Sh SYNOPSIS | |
12 .Nm | |
13 .Bk -words | |
14 .Op Fl 4 | |
15 .Op Fl 6 | |
16 .Op Fl c | |
17 .Op Fl d | |
18 .Op Fl e | |
19 .Op Fl n | |
20 .Op Fl s | |
21 .Op Fl y | |
22 .Op Fl l Ar logfile | |
23 .Op Fl v Ar loglevel | |
24 .Op Fl b Ar base | |
25 .Op Fl p Ar port | |
26 .Op Fl o Ar sport | |
27 .Op Fl u Ar user | |
28 .Op Fl g Ar group | |
29 .Op Fl h Ar host | |
30 .Op Fl i Ar interface ... | |
31 .Op Fl t Ar keyfile certfile | |
32 .Ek | |
33 . | |
34 .Sh DESCRIPTION | |
35 .Nm | |
36 is a daemon for serving the protocol specified in | |
37 .Em RFC 1436 | |
38 (Gopher). Under 1000 lines of C by design, it is lightweight yet supports | |
39 dynamic content, automatic file/directory indexing, logging and privilege | |
40 separation. | |
41 . | |
42 .Sh IMPLEMENTATION | |
43 Installation is straightforward: grab the zipped tar file, expand it in | |
44 an appropriate temp directory, change to the | |
45 .Qq Pa "../geomyidae-x.xx" | |
46 directory, tweak the Makefile if desired (installs in | |
47 .Qq Pa "/usr/bin" | |
48 by default), then run the | |
49 .Qq Ql "make ; make install" | |
50 commands. | |
51 The resulting executable should be run by root. | |
52 . | |
53 .Ss Basic Installation and Startup | |
54 .Bd -literal -offset indent | |
55 $ wget ftp://bitreich.org/releases/geomyidae/geomyidae-$VERSION.tar.lz | |
56 $ lzip -d geomyidae-$VERSION.tar.lz | |
57 $ tar -xvf geomyidae-*.tar | |
58 $ cd geomyidae-* | |
59 $ make; sudo make install | |
60 $ sudo mkdir -p /var/gopher | |
61 $ sudo cp index.gph /var/gopher | |
62 $ sudo geomyidae -l /var/log/geomyidae.log -b /var/gopher -p 70 | |
63 $ tail -f /var/log/geomyidae.log | |
64 .Ed | |
65 . | |
66 .Pp | |
67 Use whatever gopher client you like (ie. sacc) to browse: | |
68 .Bd -literal -offset indent | |
69 $ sacc gopher://localhost | |
70 .Ed | |
71 . | |
72 .Ss Running | |
73 .Nm | |
74 should normally be started by root, although it can be started | |
75 by a regular user provided that the base directory and its contents are … | |
76 by the same user. | |
77 .Nm | |
78 will only serve content within the base directory | |
79 tree and will drop privileges to the | |
80 .Fl u Ar user | |
81 and | |
82 .Fl g Ar group | |
83 values if set. | |
84 See | |
85 .Sx OPTIONS | |
86 below for specifics. | |
87 Launching | |
88 .Nm | |
89 automatically is best done via a UNIX | |
90 run-time (rc.d) script; several sample rc.d scripts are included in the | |
91 .Nm | |
92 source archive. | |
93 Logging in | |
94 .Nm | |
95 can be done through either logfiles or syslog. | |
96 . | |
97 .Sh OPTIONS | |
98 .Nm | |
99 options and default settings: | |
100 .Bl -tag -width Ds | |
101 . | |
102 .It Fl 4 | |
103 Only use IPv4. | |
104 . | |
105 .It Fl 6 | |
106 Only use IPv6. | |
107 . | |
108 .It Fl c | |
109 Use | |
110 .Xr chroot 2 | |
111 for the | |
112 .Ar base | |
113 directory (by default off). | |
114 . | |
115 .It Fl d | |
116 Don't fork into background. | |
117 If no | |
118 .Ar logfile | |
119 is given, this implies logging to the standard output. | |
120 . | |
121 .It Fl e | |
122 Disable execution of any CGI or DCGI script. | |
123 . | |
124 .It Fl n | |
125 Perform reverse lookups. | |
126 . | |
127 .It Fl s | |
128 Log using syslog for logging. | |
129 . | |
130 .It Fl y | |
131 Enable HAProxy support. | |
132 . | |
133 .It Fl l Ar logfile | |
134 Specify file where log output is written (no default). | |
135 . | |
136 .It Fl v Ar loglevel | |
137 Set the logging level (default: 47). | |
138 Loglevels: | |
139 .Bl -tag -width "XX" -compact | |
140 .It Cm 0 | |
141 no logging | |
142 .It Cm 1 | |
143 served plain files | |
144 .It Cm 2 | |
145 directory listings | |
146 .It Cm 4 | |
147 HTTP redirects | |
148 .It Cm 8 | |
149 errors (e.g., not found) | |
150 .It Cm 16 | |
151 client connections | |
152 .It Cm 32 | |
153 gopher+ redirects | |
154 .El | |
155 .Pp | |
156 E.g.: | |
157 .Bd -literal -offset indent | |
158 1 + 2 + 4 + 8 + 32 = 47 | |
159 (files + directories + HTTP + errors + gopher+) | |
160 .Ed | |
161 . | |
162 .It Fl b Ar base | |
163 Root directory to serve | |
164 .Po | |
165 default: | |
166 .Pa /var/gopher | |
167 .Pc . | |
168 . | |
169 .It Fl p Ar port | |
170 Port | |
171 .Nm | |
172 should listen on (default: 70). | |
173 . | |
174 .It Fl o Ar sport | |
175 Port | |
176 .Nm | |
177 displays within base directory (default: 70). | |
178 Use in conjunction with | |
179 .Ic -p | |
180 for obfuscating actual port | |
181 .Nm | |
182 is running on. | |
183 . | |
184 .It Fl u Ar user | |
185 Sets the user to which privileges drop when | |
186 .Nm | |
187 is ready to accept network connections (default: user | |
188 .Nm | |
189 runs as). | |
190 Helps improve security by reducing privileges during request | |
191 processing. | |
192 . | |
193 .It Fl g Ar group | |
194 Sets the group to which privileges drop when | |
195 .Nm | |
196 is ready to accept network connections (default: group | |
197 .Nm | |
198 runs as). | |
199 Helps improve security by reducing privileges during request | |
200 processing. | |
201 . | |
202 .It Fl h Ar host | |
203 Host to use in directory listings (default: localhost). | |
204 . | |
205 .It Fl i Ar interface | |
206 Defines the interface to which | |
207 .Nm | |
208 binds to | |
209 .Po | |
210 default: | |
211 .Cm 0.0.0.0 | |
212 .Pc . | |
213 Multiple interfaces can be given. | |
214 . | |
215 .It Fl t Ar keyfile certfile | |
216 Activate gopher TLS and use the private key | |
217 .Ar keyfile | |
218 and the public key | |
219 .Ar certfile | |
220 for TLS connections (if the feature is compiled in.) See | |
221 .Sx ENCRYPTION ONLY | |
222 support below. | |
223 .El | |
224 . | |
225 .Sh FORMATTING | |
226 Structured Gopher space(s) can be created with | |
227 .Nm | |
228 through the use of special indexing files of the form | |
229 .Pa <name>.gph | |
230 which, if present, | |
231 .Nm | |
232 uses to format and/or filter the contents of the base directory | |
233 .Po | |
234 .Pa /var/gopher | |
235 by default | |
236 .Pc | |
237 and create gopher menus. | |
238 However, index files are | |
239 .Em not | |
240 required: if no | |
241 .Pa index.gph , | |
242 .Pa index.cgi | |
243 or | |
244 .Pa index.dcgi | |
245 file is found, | |
246 .Nm | |
247 simply lists the directory contents in alphanumeric order. | |
248 In addition, a directory can utilize | |
249 multiple index files to create a layered gopher environment without the | |
250 use of sub-directories: ie. | |
251 .Pa pictures.gph , | |
252 .Pa music.gph | |
253 and | |
254 .Pa documents.gph | |
255 could be "directories" within | |
256 .Pa main.gph , | |
257 yet all reside in | |
258 .Pa /var/gopher | |
259 along with their respective files (*.jpg, *.mp3, *.pdf for example). | |
260 . | |
261 .Ss Anatomy of an index.gph file | |
262 A gph file consists of informational text and links. | |
263 A link has the form: | |
264 .Pp | |
265 .Dl [ Ar <type> Ns | Ns Ar <desc> Ns | Ns Ar <path> Ns | Ns Ar <host> Ns… | |
266 .Pp | |
267 where, | |
268 .Bl -tag -width "<XXXX>" | |
269 .It Ar <type> | |
270 A valid gopher Item Type. | |
271 .Pp | |
272 Some common Gopher Types as defined in | |
273 .Em RFC 1436 : | |
274 . | |
275 .Bl -tag -width "XX" -compact | |
276 .It Cm 0 | |
277 Item is a file. | |
278 .It Cm 1 | |
279 Gopher directory. | |
280 .It Cm 3 | |
281 Error. | |
282 .It Cm 7 | |
283 Item is an Index-Search server. | |
284 .It Cm 8 | |
285 Item points to a text-based telnet session. | |
286 .It Cm 9 | |
287 Binary file. | |
288 Client reads until TCP connection closes! | |
289 .It Cm g | |
290 GIF format graphics file. | |
291 .It Cm I | |
292 Indeterminate image file. | |
293 Client decides how to display. | |
294 .El | |
295 .Pp | |
296 In addition, | |
297 .Nm | |
298 provides these: | |
299 .Bl -tag -width "XX" -compact | |
300 .It Cm h | |
301 Item is a hypertext (HTTP) link. | |
302 .It Cm i | |
303 Informational Item (used for descriptive purposes). | |
304 .El | |
305 .Pp | |
306 Unknown file types default to Type | |
307 .Qq Cm "9" | |
308 (binary). | |
309 . | |
310 .It Ar <desc> | |
311 Description of gopher item. | |
312 Most printable characters should work. | |
313 . | |
314 .It Ar <path> | |
315 Full or relative path to gopher item (base value is | |
316 .Qq Pa "/" ) . | |
317 Use the | |
318 .Qq Pa "Err" | |
319 path for items not intended to be served. | |
320 . | |
321 .It Ar <host> | |
322 Hostname or IP hosting the gopher item. | |
323 Must be resolvable for the intended clients. | |
324 If this is set to | |
325 .Qq Cm "server" , | |
326 the server's hostname is used. | |
327 . | |
328 .It Ar <port> | |
329 TCP port number (usually 70). | |
330 If this is set to | |
331 .Qq Cm "port" , | |
332 the default port of the server is used. | |
333 .El | |
334 . | |
335 .Pp | |
336 Note: | |
337 .Nm | |
338 doesn't require "informational" text to be formally typed as | |
339 .Ql "[i|...]" ; | |
340 any line | |
341 .Em not | |
342 beginning with | |
343 .Ql "\(lB" | |
344 is treated as informational, greatly simplifying the formatting of | |
345 .Pa index.gph | |
346 files. | |
347 If you want to display some informational text beginning with | |
348 .Ql "\(lB" | |
349 you can use the special case of an empty item type. | |
350 .Ql "[|[some link" | |
351 will be shortened to | |
352 .Ql "[some link" . | |
353 For dynamically generated content it may be desirable to either formally… | |
354 informational text or run it through a filter to prepend | |
355 .Ql "[|" | |
356 - \.ie | |
357 .Ql "sed 's,^[,[|&,'" . | |
358 .Pp | |
359 Note 2: You can escape a pipe | |
360 .Pq Ql "\(ba" | |
361 character in for example a | |
362 .Cm <desc> | |
363 field by prepending a slash ("\\"). | |
364 .Pp | |
365 Note 3: The gph parser is very forgiving. | |
366 If the link structure is not parsed correctly, then the original line is… | |
367 . | |
368 .Ss index.gph Example | |
369 A | |
370 .Pa root.gph | |
371 file for a server running on | |
372 .Ql host=frog.bog , | |
373 .Ql port=70 . | |
374 Note use of optional [i]nformational Item (line 2) for vertical space in… | |
375 .Bd -literal -offset indent | |
376 Welcome to Frog.bog | |
377 [i||Err||] | |
378 [0|About this server|about.txt|frog.bog|70] | |
379 [0|Daily Log|/dtail.cgi|frog.bog|70] | |
380 [1|Phlog: like a blog, but not|/PHLOG|frog.bog|70] | |
381 [9|Some binary file|widget.exe|frog.bog|70] | |
382 [I|Snowflake picture|snowflake.jpg|frog.bog|70] | |
383 try our snowflakes! | |
384 | |
385 Links and Searches | |
386 [1|Go to R-36.net|/|gopher.r-36.net|70] | |
387 [h|Go to NetBSD.org|URL:http://netbsd.org|frog.bog|70] | |
388 [7|Query US Weather by Zipcode|/weather.cgi?|frog.bog|70] | |
389 [7|Search Veronica II|/v2/vs|gopher.floodgap.com|70] | |
390 [8|Telnet to SDF Public Access Unix System|null|freeshell.org|23] | |
391 .Ed | |
392 . | |
393 .Pp | |
394 The above looks something like this in a text-based gopher client: | |
395 .Bd -filled -offset indent | |
396 .Bl -tag -width "(XXXXX)" -compact | |
397 .It Sy Welcome to Frog.bog | |
398 .Pp | |
399 .It Sy (FILE) | |
400 About this server | |
401 .It Sy (FILE) | |
402 Daily Log | |
403 .It Sy (DIR) | |
404 Phlog: like a blog, but not | |
405 .It Sy (BIN) | |
406 Some binary file | |
407 .It Sy (IMG) | |
408 Snowflake picture | |
409 .El | |
410 .Pp | |
411 try our snowflakes! | |
412 .Pp | |
413 .Bl -tag -width "(XXXXX)" -compact | |
414 .It Sy Links and Searches | |
415 .It Sy (DIR) | |
416 Go to R-36.net | |
417 .It Sy (HTML) | |
418 Go to NetBSD.org | |
419 .It Sy (?) | |
420 Query US Weather by Zipcode | |
421 .It Sy (?) | |
422 Search Veronica II | |
423 .It Sy (TEL) | |
424 Telnet to SDF Public Access Unix System | |
425 .El | |
426 .Ed | |
427 .Sh DYNAMIC CONTENT (gopher CGI) | |
428 There are two options provided for dynamic content creation and a special | |
429 case: standard CGI | |
430 .Pq Pa ".cgi" , | |
431 dynamic CGI | |
432 .Pq Pa ".dcgi" , | |
433 and HTTP compatibility mode. | |
434 Despite the names, all three can accept input and generate dynamic conte… | |
435 the only difference is that dcgi re-formats it's output so it appears to | |
436 the server as a standard | |
437 .Nm | |
438 index | |
439 .Pq Pa ".gph" | |
440 file. | |
441 This makes the creation of on-the-fly gopher directories much easier (se… | |
442 All scripts must be under the gopher root directory and be executable by… | |
443 .Ar "user:group" | |
444 running | |
445 .Nm . | |
446 Consequently, it is best to use the | |
447 .Fl u | |
448 and | |
449 .Fl g | |
450 server options to avoid running as root. | |
451 .Pp | |
452 Executed scripts get the full I/O of the socket bound to stdin and stdou… | |
453 You are thus able to write long-lasting streaming services. | |
454 Radio or TV stations over gopher are possible that way. | |
455 .Pp | |
456 Both | |
457 .Pa ".cgi" | |
458 and | |
459 .Pa ".dcgi" | |
460 scripts have the same argument call structure (as seen by | |
461 .Nm ) : | |
462 .Pp | |
463 .Dl Ic executable.[d]cgi Ar search Ar arguments Ar host Ar port Ar trave… | |
464 .Pp | |
465 where: | |
466 .Bl -tag -width "XXXXXXXXX" -compact | |
467 .It Ar search | |
468 Query string (type 7) or "" (type 0). | |
469 .It Ar arguments | |
470 String behind "?" in selector or "". | |
471 .It Ar host | |
472 Server's hostname ("localhost" by default). | |
473 .It Ar port | |
474 Server's port ("70" by default). | |
475 .It Ar traversal | |
476 Remaining path from path traversal in REST case. | |
477 .It Ar selector | |
478 Raw selector or full req (See HTTP compatibility mode.) | |
479 .El | |
480 .Pp | |
481 All terms are tab-separated (per gopher protocol) which can cause some | |
482 surprises depending on how a script is written. | |
483 See the CGI file (included in the | |
484 .Nm | |
485 source archive) for further elaboration. | |
486 .Pp | |
487 For a special REST path case for the arguments, see the CGI file for the | |
488 description. | |
489 .Pp | |
490 QUIRK: The original gopher client tried to be too intelligent. | |
491 It is using gopher+ when you request some resource. | |
492 When "search" is just the value "+", "!", "$" or empty, | |
493 .Nm | |
494 will display a gopher+ redirect instead of invoking the script. | |
495 Be careful to design your search script so the user is unlikely to enter… | |
496 The designers of gopher+ did not think of classic gopher to survive. | |
497 It survived gopher+. | |
498 .Pp | |
499 Additionally to the above arguments several environment variables are se… | |
500 Only the programmatically relevant variables are listed here. | |
501 For further information, see ind.c:setcgienviron() in the geomyidae | |
502 source code. | |
503 .Bl -tag -width "REMOTE_ADDR , REMOTE_HOST" -compact | |
504 .It Ev PATH_INFO | |
505 Traversal (See above.) | |
506 .It Ev PATH_TRANSLATED | |
507 Absolute path to script. | |
508 .It Ev QUERY_STRING | |
509 Arguments (See above.) | |
510 .It Ev REMOTE_ADDR , REMOTE_HOST | |
511 IP of the client | |
512 .It Ev SCRIPT_NAME | |
513 Script which is executed. | |
514 .It Ev SERVER_NAME | |
515 Server's hostname. | |
516 .It Ev SERVER_PORT | |
517 Server's port. | |
518 .It Ev GOPHER_SELECTOR | |
519 Raw gopher selector | |
520 .It Ev GOPHER_REQUEST | |
521 Raw gopher selector | |
522 .It Ev GOPHER_SEARCH | |
523 Search (See above.) | |
524 .It Ev GOPHER_SCRIPT_FILENAME | |
525 Absolute path with script which is executed. | |
526 .It Ev GOPHER_DOCUMENT_ROOT | |
527 Base root for serving files. | |
528 .It Ev SERVER_LISTEN_NAME | |
529 Ip the server received the connection on. | |
530 .It Ev HTTPS , GOPHERS | |
531 Set, if TLS is used. | |
532 .El | |
533 . | |
534 .Ss The REST path handling | |
535 If a client requests a path in a selector, which has no corresponding | |
536 file or path found, | |
537 .Nm | |
538 will try to traverse from the | |
539 .Fl b Ar base | |
540 path until a path component / directory is not found. | |
541 Then | |
542 .Nm | |
543 tries to find some index.dcgi or index.cgi file in the last existing dir… | |
544 If this is found and the index files are executable, | |
545 .Nm | |
546 will execute them using the traversal and | |
547 .Ev PATH_INFO | |
548 parameter and environment variable being set to the rest path. | |
549 .Bd -literal -offset indent | |
550 Selector: /some/v1/service/add/something?args=value | |
551 -> /some/v1/service exists | |
552 -> /some/v1/service/index.dcgi exists | |
553 -> /some/v1/service/index.dcgi "" "args=value" $host $port | |
554 "/add/something" "/some/v1/service/add/something?args=value" is called | |
555 .Ed | |
556 . | |
557 .Ss HTTP compatibility | |
558 For maximum flexibility in case someone sends a HTTP request to gopher, | |
559 .Nm | |
560 supports a special case of CGI. | |
561 See this example: | |
562 .Bd -literal -offset indent | |
563 Client request: GET /some/path HTTP/1.1 | |
564 -> /GET exists and is executable | |
565 -> /GET "" "" $host $port "" "GET /some/path HTTP/1.1" is called | |
566 .Ed | |
567 .Pp | |
568 This allows for example simple scripts for icecast upload compatibility | |
569 or handling transparent HTTP right next to gopher, getting TLS for free. | |
570 . | |
571 .Ss Some CGI Examples | |
572 Note: these are a very simple examples with no fitness checks with respe… | |
573 to safety/security. | |
574 .Pp | |
575 ex. | |
576 .Pa uptime.cgi - standard CGI, no queries | |
577 . | |
578 .Bd -literal -offset indent | |
579 #!/bin/sh | |
580 # uptime.cgi - prints system uptime(1) | |
581 /usr/bin/uptime | |
582 exit 0 | |
583 .Ed | |
584 . | |
585 .Pp | |
586 Call the above with the following index.gph entry: | |
587 .Pp | |
588 .Dl [0|System Uptime|/uptime.cgi|frog.bog|70] | |
589 .Pp | |
590 A search query request must have an item Type of | |
591 .Qq Cm "7" | |
592 to be called from an | |
593 .Pq index.gph | |
594 file. | |
595 It also needs a | |
596 .Qq Cm "?\&" | |
597 suffix in the | |
598 .Ar <path> | |
599 field: | |
600 .Pp | |
601 ex. | |
602 .Pa hello.cgi - standard CGI with query | |
603 . | |
604 .Bd -literal -offset indent | |
605 #!/bin/sh | |
606 # hello.cgi - welcome user | |
607 NAME=$1 | |
608 HOSTNAME=$2 | |
609 echo "" | |
610 echo Hello $NAME - welcome to $HOSTNAME | |
611 exit 0 | |
612 .Ed | |
613 . | |
614 .Pp | |
615 Call the above with the following index.gph entry: | |
616 .Bd -literal -offset indent | |
617 [7|Hello You - Please enter your name|/hello.cgi?FROG.bog|frog.bog|70] | |
618 .Ed | |
619 . | |
620 .Pp | |
621 And do a simple | |
622 .Xr snarf 1 | |
623 query (note the inserted TAB): | |
624 .Bd -literal -offset indent | |
625 % snarf "gopher://frog.bog/7/hello.cgi?FROG.bog[TAB]Christoph" - | |
626 Hello Christoph - welcome to FROG.bog | |
627 .Ed | |
628 . | |
629 .Pp | |
630 Dynamic CGI entries are similar to above except that the script | |
631 needs to create output as described in the | |
632 .Sx FORMATTING | |
633 section: | |
634 .Pp | |
635 ex. | |
636 .Pa jughead.dcgi - dynamic CGI script with query | |
637 . | |
638 .Bd -literal -offset indent | |
639 #!/bin/sh | |
640 # jughead.dcgi - jughead-like local gopher search | |
641 KWRD="$1" | |
642 ARCHIVE="/var/gopher/textfiles/" | |
643 echo "[i|Search results for \\"${KWRD}\\":|Err||]" | |
644 echo "[i||Err||]" | |
645 # grep(1) recursive, case-insensitive KWRD search of ARCHIVE: | |
646 for RESULT in $(/usr/bin/grep -i -l -m1 ${KWRD} -r $ARCHIVE) | |
647 do | |
648 DESC=$(/usr/bin/basename ${RESULT}) | |
649 PATH=$(echo "$RESULT" | /usr/bin/sed 's/^\\/var\\/gopher//') | |
650 echo "[0|${DESC}|${PATH}|frog.bog|70]" | |
651 done | |
652 exit 0 | |
653 .Ed | |
654 . | |
655 .Pp | |
656 Call the above with the following index.gph entry: | |
657 .Pp | |
658 .Dl [7|Search this Gopher|/jughead.dcgi?|frog.bog|70] | |
659 .Pp | |
660 A successful query might look like this: | |
661 .Bd -filled -offset indent | |
662 Search results for | |
663 .Qq fubar : | |
664 .Pp | |
665 .Bl -tag -width "(XXXX)" -compact | |
666 .It Sy (FILE) | |
667 How_Things_Break.txt | |
668 .It Sy (FILE) | |
669 Origins_of_Words.txt | |
670 .It Sy (FILE) | |
671 Phrases_of_the_Ages.txt | |
672 .El | |
673 .Ed | |
674 . | |
675 .Pp | |
676 Care should to be exercised to avoid creating mistyped entries, unwanted | |
677 recursions, and/or unintended writes in the working directory. | |
678 .Sh HAPROXY SUPPORT | |
679 .Nm | |
680 has | |
681 .Em HAProxy | |
682 support. | |
683 It can be enabled using the | |
684 .Fl y | |
685 parameter. | |
686 . | |
687 .Sh LOG FILES | |
688 The log file (ie. /var/log/gopherd.log) has the following structure: | |
689 .Dl [ Ns Ar <date> Ns | Ns Ar <IP/Host> Ns | Ns Ar <port> Ns | Ns Ar <st… | |
690 . | |
691 .Pp | |
692 where, | |
693 .Bl -tag -width "<XXXX XXXX>" | |
694 .It Ar <date> | |
695 Access date and time (std 'date' format). | |
696 .br | |
697 ex. | |
698 .Qq Cm "2018-01-31 14:18:34 +0000" | |
699 .It Ar <IP/Host> | |
700 Client IP/Host served | |
701 .br | |
702 ex. | |
703 .Qq Cm "104.23.33.1" | |
704 .It Ar <port> | |
705 Client port served | |
706 .br | |
707 ex. | |
708 .Qq Cm "16857" | |
709 .It Ar <status> | |
710 Status of client request | |
711 .br | |
712 ex. - some common status entries: | |
713 .Bl -tag -width "XXXX XXXXXXXX" -compact | |
714 .It Qq Cm serving | |
715 A successful request. | |
716 .It Qq Cm not found | |
717 An unsuccessful request. | |
718 .It Qq Cm HTTP redirect | |
719 Web link redirect (Type h). | |
720 .It Qq Cm dir listing | |
721 Unindexed directory listing. | |
722 .El | |
723 .It Ar <item path> | |
724 Full path to item served | |
725 .br | |
726 ex. | |
727 .Qq Pa "/PICS/simple2.jpg" | |
728 for an image file; | |
729 .Qq Pa "/PICS" | |
730 for a directory access. | |
731 .El | |
732 . | |
733 .Sh ENCRYPTION ONLY | |
734 If you set the sticky bit | |
735 .Pq Ql "chmod +t" | |
736 on some file or directory, | |
737 .Nm | |
738 will only serve it over an encrypted connection. | |
739 There is the special case, that when the sticky bit is set on the | |
740 .Ar base | |
741 directory, all content will only be served over TLS. | |
742 . | |
743 .Sh FILES | |
744 .Pa README , LICENSE , CGI , index.gph , rc.d/ , LINKS , gph/ | |
745 . | |
746 .Sh SEE ALSO | |
747 Links for further information on gopher: | |
748 .Pp | |
749 .Lk gopher://gopher.floodgap.com "Floodgap Systems" | |
750 .Pp | |
751 .Lk gopher://gopherproject.org "The Gopher Project" | |
752 .Sh STANDARDS | |
753 .Rs | |
754 .%A F. Anklesaria | |
755 .%A M. McCahill | |
756 .%A P. Lindner | |
757 .%A D. Johnson | |
758 .%A D. Torrey | |
759 .%A B. Alberti | |
760 .%D March 1993 | |
761 .%R RFC 1436 | |
762 .%T The Internet Gopher Protocol (a distributed document search and retr… | |
763 .Re | |
764 . | |
765 .Sh HISTORY | |
766 .Bd -filled | |
767 .Nm | |
768 started as a Linux/BSD port of the Plan 9 gopherd_P9 server. | |
769 Originally called gopherd_BSD, the name was later changed to | |
770 .Qq Em Geomyidae | |
771 (latin), the taxonomic family of burrowing rodents known as | |
772 .Qq Em "pocket gophers" | |
773 which are in fact the true gophers. | |
774 Due to inconsistencies and the UNIX culture, the name was changed to low… | |
775 .Ed | |
776 . | |
777 .Sh AUTHORS | |
778 See LICENSE file for authors in the distribution. | |
779 . | |
780 .Sh LICENSE | |
781 .Nm | |
782 is released under the MIT/X Consortium License. | |
783 . | |
784 .Sh BUGS | |
785 Dynamic content functionality may vary across gopher clients. | |
786 . | |
787 .Ss "Reporting Bugs" | |
788 Report bugs to: | |
789 .An "Christoph Lohmann" Aq Mt [email protected] |