Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
-- ************************************************************************
--
-- Sample config file
-- Copyright 2019 by Sean Conner. All Rights Reserved.
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
--
-- Comments, questions and criticisms can be sent to: sean@conman.org
--
-- ************************************************************************
-- luacheck: globals network syslog no_access user redirect handlers cgi
-- luacheck: ignore 611
-- ************************************************************************
-- Network definition block, required (optional fields are default values)
-- ************************************************************************
network =
{
host = "example.com",
addr = "::", -- optional, default listens all interfaces, IPv4/IPv6
port = 70, -- optional, port to listen on
}
-- ************************************************************************
-- syslog() definition block, optional (default value presented)
-- ************************************************************************
syslog =
{
ident = 'gopher',
facility = 'daemon',
}
-- ************************************************************************
-- User to run under, optional. Either numeric value, or name of user. If
-- not given, userid will not change (you have to be root for this to work
-- anyway ... )
-- ************************************************************************
user =
{
uid = 'gopher',
gid = 'gopher', -- optional, defaults to group of supplied user
}
-- ************************************************************************
-- Experimental Redirection for gopher. This replaces the earlier redirect
-- module I had. The new method is a bit more flexible, as it can deal with
-- both permament redirections and selectors that are no longer valid
-- (gone).
--
-- So, before any handlers are checked, requests are filtered through these
-- redirection blocks. The first is the permanent block, then the gone
-- block. The format for the permanent block is a Lua pattern, then a
-- redirection location where "$1" will be replaced with the first capture,
-- "$2" with the second capture and so on. This will return a gopher error
-- with the display string of "Permanent redirect" and the new selector to
-- use.
-- The gone block is just a pattern to match against; there is no
-- substitution required, as we're not really directing anywhere. This will
-- return a gopher error with the display string of "Gone" with the original
-- selector.
-- ************************************************************************
redirect =
{
permanent =
{
{ "^/oldselector/(.*)" , "/newselector/$1" },
{ "^/old/(.*)/(.*)/(.*)" , "/new/$1-$2-$2" }
},
gone =
{
"^/no%-longer%-here$",
"^/this_is_gone_as_well$",
"^/obsolete(.*)"
}
}
-- ************************************************************************
-- Handlers, mostly optional
--
-- These handle all requests. The configuration options are entirely
-- dependant upon the handler---the only required configuration options per
-- handler are the 'selector' field and the 'module' field, which defines
-- the codebase for the handler. The selector fields match the *beginning*
-- of the selector; the rest of the selector is then passed to the nandler.
-- The first handler that matches is the one that handles the request.
-- ************************************************************************
handlers =
{
-- -------------------------------------------------------------------
-- Individual file handler. This allows you to link to a file on the
-- computer---it does not have to appear in a directory served up by
-- the filesystem handler.
-- -------------------------------------------------------------------
{
selector = "/motd",
module = "port70.handlers.file",
file = "/etc/motd", --required
},
-- ----------------------------------------------------------------
-- The user directory handler, allowing individual users of the computer
-- to serve up gopher content. The rest of the selector is assumed to be
-- of the form "[^/]+/.*"---that is, the username starts the path, and is
-- delimeted by a '/' character.
--
-- The directory field is the subdirectory underneath the users $HOME that
-- is served up. The index field are a list of files that will be
-- considered "index" files and served up; if one isn't provided, one will
-- be constructed. The extension field gives the exention used for the
-- port70-specific index format (which is different than a traditional
-- gopher index). The no_access field is a list of patterns for each
-- filename that will NOT be served up.
-- --------------------------------------------------------------------------
{
selector = "/~",
module = "port70.handlers.userdir",
directory = "public_gopher", -- optional
index = { "index.port70" , "index.gopher" }, -- optional
extension = ".port70", -- optional
no_access = -- optional
{
"^%.",
},
},
-- -----------------------------------------------------------------
-- The content handler---for when a file is just too much overhead.
-- -----------------------------------------------------------------
{
selector = "/hello.txt",
module = "port70.handlers.content",
content = "Hello, world!\r\n",
},
-- --------------------------------------------------------------------
-- The HTTP handler---a way to tell those pesky web robots to go away,
-- we aren't a web server but a tea pot.
-- --------------------------------------------------------------------
{ selector = "GET " , module = "port70.handlers.http" },
{ selector = "HEAD " , module = "port70.handlers.http" },
{ selector = "POST " , module = "port70.handlers.http" },
{ selector = "PUT " , module = "port70.handlers.http" },
{ selector = "DELETE " , module = "port70.handlers.http" },
{ selector = "CONNECT " , module = "port70.handlers.http" },
{ selector = "OPTIONS " , module = "port70.handlers.http" },
{ selector = "TRACE " , module = "port70.handlers.http" },
{ selector = "BREW " , module = "port70.handlers.http" }, -- RFC-2324, in case people get cute
{ selector = "PROPFIND " , module = "port70.handlers.http" },
{ selector = "WHEN " , module = "port70.handlers.http" },
-- ---------------------------------------------------------------------
-- URL handler. If a gopher client doesn't understand the URL: marker
-- of the 'h' type, use this to send back an HTML page with a redirect
-- to the given URL.
-- ---------------------------------------------------------------------
{
selector = "URL:",
module = "port70.handlers.url",
},
-- --------------------------------------------------------------------
-- The sample handler. This just exists to give you a skeleton of a
-- handler to work from.
-- --------------------------------------------------------------------
{
selector = "sample/",
module = "port70.handlers.sample",
},
-- --------------------------------------------------------------------
-- The filesystem handler. You will most likely want to use this one.
-- You are not restricted to a single instance of this. The first example
-- sets up a hypthetical source of tarballs, while the second example will
-- serve up all other selectors that haven't matched by a file.
--
-- The index field is a list of filenames that will be displayed if a
-- directory is specified.
--
-- The dirext field is a list of extensions for files that should have
-- the 'dir' selector type instead of 'file'.
--
-- The extension field is the extension used for special processing
-- of an index file.
--
-- the cgi field enables CGI scripts. You will also need to configure
-- the CGI handler block (see below).
-- -----------------------------------------------------------------------
{
selector = "/archive",
module = "port70.handlers.filesystem",
directory = "/usr/src/archive", -- required
index = { "index.port70" , "index.gopher" }, -- optional
dirext = { ".port70" , ".gopher" }, -- optional
extension = ".port70", -- optional
cgi = false, -- optional
no_access = -- optional
{
"^%.",
},
},
{
selector = "", -- matches everything else
module = "port70.handlers.filesystem",
directory = "share", -- required,
index = { "index.port70" , "index.gopher" }, -- optional
extension = ".port70", -- optional
cgi = true, -- optional
no_access = -- optional
{
"^%.",
},
},
}
-- ************************************************************************
-- CGI definition block, optional
--
-- Any file found with the executable bit set and the cgi field in the
-- handler definition block is true, is considered a CGI script and will be
-- executed as such. This module implements the CGI standard as defined in
-- RFC-3875 with some deviations due to the semantics of gopher. The script
-- will be executed and any output will be sent to the client. The script
-- SHOULD NOT include the standard CGI header output as that does not make
-- semantic sense for gopher. The output SHOULD be what a gopher client is
-- expecting per the selector type. The following environment variables
-- will be defined:
--
-- GATEWAY_INTERFACE Will be set to "CGI/1.1"
-- PATH_INFO May be set (see RFC-3875 for details)
-- PATH_TRANSLATED May be set (see RFC-3875 for details)
-- QUERY_STRING Will be set to the passed in search query, or ""
-- REMOTE_ADDR IP address of the client
-- REMOTE_HOST IP address of the client (allowed in RFC-3875)
-- REQUEST_METHOD Set to "" (not defined for gopher)
-- SCRIPT_NAME Name of the script per the gopher selector
-- SERVER_NAME Per network.host
-- SERVER_PORT Per network.port
-- SERVER_PROTOCOL Set to "GOPHER"
-- SERVER_SOFTWARE Set to "port70"
-- GOPHER_DOCUMENT_ROOT Set to the parent directory of the CGI script
-- GOPHER_SCRIPT_FILENAME Set to the full path of the script
-- GOPHER_SELECTOR Set to the raw selector
--
-- If this block is NOT defined, then no scripts will be run, and any file
-- found that is marked as 'executable' will return "Not found" as a
-- security measure.
-- ************************************************************************
cgi =
{
-- ----------------------------------------------------------------
-- The following variables apply to ALL CGI scripts. They are all
-- optional, and not not beed to be defined.
-- ----------------------------------------------------------------
-- ------------------------------------------------------
-- Define to true if you do no want leading slashes--e.g.
-- gopher://example.com/0script
-- If NOT defined, then a leading slash is assumed---e.g.
-- gopher://example.com/0/script
-- ------------------------------------------------------
no_slash = true,
-- -----------------------------------------------------------
-- All scripts will use this as the current working directory.
-- -----------------------------------------------------------
cwd = "/tmp",
-- ------------------------------------------------------------------
-- Additional environment variables can be set. The following list
-- is probably what would be nice to have.
-- ------------------------------------------------------------------
env =
{
PATH = "/usr/local/bin:/usr/bin:/bin",
LANG = "en_US.UTF-8",
},
-- -------------------------------------------------------------------
-- The instance block allows you to define values per CGI script and
-- will override any global settings. The script is defined as a Lua
-- pattern, so that they'll apply to any script whose name matches
-- the pattern.
-- -------------------------------------------------------------------
instance =
{
['^/private/raw.*'] =
{
cwd = '/var/tmp',
-- -----------------------------------------------------------------
-- If you need to specify arguments to the script, define them here.
-- -----------------------------------------------------------------
arg =
{
"first-argument",
"second-argument",
"third-argument",
},
-- ---------------------------------------------
-- Additional environment variables per script.
-- ---------------------------------------------
env =
{
SAMPLE_CONFIG = "sample.config",
PATH = "/var/bin",
},
},
},
}