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