port70 - a Gopher server (RFC-1436) written in Lua. This currently runs my
own personal Gopher server at but should be
usable by people other than myself, unlike my previous Gopher server.
Features:
* Configurable filenames for Gopher index files.
* A much nicer Gopher index file format native to this program.
* Generates Gopher indexes for directories that lack a Gopher index file.
* Support for user directories.
* Support for URL: selectors.
* Support for CGI scripts
* Easily extensible with support for custom handlers.
* Experiemental support for selector redirection.
* Configuration via file.
Prerequisites:
* Lua >= 5.3
* GNU libmagic (NOTE: this is NOT image manipulation, but file
identification)
* LPEG >= 1.0.0
* A whole bunch of other Lua modules, available at:
* https://github.com/spc476/lua-conmanorg
* https://github.com/spc476/LPeg-Parsers
Installation:
This will require some work. You will need to download the modules listed
above from Github and get them installed. The lua-conmanorg repository will
take some futzing around to get it compiled (first hint: remove any mention
of tcc in the Makefile). But once you have all the prerequisites installed,
the server should just work.
Bulding:
Just type "make". If you have the Lua include files in a non-standard
location, you may need to do:
make LUA_INCDIR=/path/to/Lua/includes
or even
make LUA= LUA_INCDIR=/path/to/Lua/includes
You can do "make install" if you want to install the server onto the system:
make install
This will install files in the following locations:
/usr/local/bin/port70 # server
/usr/local/lib/lua/5.3/port70/ # server modules (written in C)
/usr/local/share/lua/5.3/port70/ # server modules (written in Lua)
To fine tune, you can from the command line:
make [location] install
The various [location] options are (multiple can be specified)
prefix=target-dir
target-dir/bin/port70
target-dir/lib/lua/5.3/port70/
target-dir/share/lua/5.3/port70/
LUADIR=target-dir
target-dir/port70/ # modules written in Lua
LIBDIR=target-dir
target-dir/port70/ # modules written in C
BINDIR=target-dir
target-dir/port70/ # server program
Configuration:
The file "minimal-conf.lua" is the bare minimum configuration file you'll
need to serve up files from a directory, but do look at the sample-conf.lua
file as that has extensive comments about each section and what is required,
and what isn't. It will help to know some Lua, especially Lua string
patterns (its form of regex) as various sections of the configuration are
applied to requests via pattern matching of the request.
Gopher Index files
While the standard gopher index file format described in RFC-1436:
0This is a filefile-selectorexample.com70
this program does have its own gopher index file that is easier to write and
less error prone. Lines that do NOT start with a tab () are converted
as is to the gopher 'i' type (information). Lines that do start with a tab
are converted. The generalized format is:
typeselectordescription
The following types supported are:
file selector refers to a text file (type 0)
dir selector refers to a directory (type 1)
CSO selector refers to a CSO phone-book server (type 2)
binhex selector refers to a BinHexed Macintosh file (type 4)
EXE selector refers to an executable file (type 5)
uuencode selector refers to a UNIX uuencoded file (type 6)
search selector refers to an Index-Search server (type 7)
telnet selector refers to a text-based telnet session (type 8)
binary selector refers to a binary file (type 9)
gif selector refers to a GIF file (type g)
image selector refers to a non-GIF image file (type I)
html selector refers to an HTML file (type h)
url selector is a URL (more below)
The 'url' type is special since the selector is an actual URL---what type is
used determined by the URL given (a full URL is expected, with scheme).
Example:
url gopher://gopher.example.com/ Some random server
will create a type 1 entry (directory) with a blank selector, a host of
"gopher.example.com" and a port number of 70.
url https://www.example.com/ Some other random server
will create a type h entry (HTML) with a selector of
"URL:https://www.example.com".
One final type is supported to allow dynamic content in the page to be
generated. If the type is "Lua{", the following lines until a "Lua}" will
be collected and executed as Lua code. The only global available will be
the require() function, allowing one to include other Lua modules without
polluting the namespace of the main program.
The "share/index.port70" is an example of this format. It will generate a
file that closely matches the "share/index.gopher" file (sans the dynamic
output).
.