tcp80 README
Other features in this fork include the ability to redirect error pages so can use your own, usually generated dynamically using the built-in execfs, and the ability to serve different content based on the Host header sent by the client.
This server is also entirely capable of running shithub using the built-in execfs.
Running a basic tcp80 setup is very simple, and requires only one file, and one directory.
First, you must ensure
/usr/web
exists, and world readable/executable. Once this requirement is met, you need
only create the world readable/executable file
/rc/bin/service/tcp80
with contents:
#!/bin/rc
exec /bin/tcp80
This is sufficient for serving static files, and uses none of the advanced features available.
This feature requires a configuration file containing mappings, the format of
which is quite simple.
Each line contains a regex to match the hostname against, followed by at least
one tab, and a path from which to serve files, as in the following example:
server1.domain.org /usr/webroot/server1
aardvark.different.org /usr/webroot/aardvark
Once you have your configuration stored, you must change your /rc/bin/service/tcp80 script. If you use captures in the regular expression, they can be used in the pathname section.
#!/bin/rc
exec /bin/tcp80 -h /sys/lib/hostrules
This currently does not affect the execution of execfs rules, which exist in a single "namespace", however the configuration will likely be expanded to support the use of different execfs rules for each hostname.
It is possible to produce custom error pages. The normal action when tcp80 encounters a situation requiring an error response, such as a 404 Not Found, it produces a very simple HTML snippet. This feature allows you to replace this functionality, however, it does so in a non-standard way.
Instead of allowing for the direct replacement of this snippet, it issues a 301 Moved Permanently response. This redirects the browser to a URL containing the error code and the location that generated it. For example, if you were to access http://server.domain.com/nonexistent.html tcp80 would redirect the client to http://server.domain.com/404/nonexistent.html
To use this feature, you pass multiple -e options to tcp80 in your /rc/bin/service/tcp80 script.
#!/bin/rc
exec /bin/tcp80 -e 404 -e 403
The integrated execfs functionality is the most advanced and powerful feature available in tcp80. Used correctly, it can provide a powerful tool for dynamic websites. Used incorrectly, it can destroy your server, open security holes, and probably set your house on fire while you’re trying to fix the security.
execfs uses the same configuration format as documented above, consiting of a regex to match the pathname (instead of hostname) against, at least one tab, and a script to run. If the regular expression contains captures, they can be used in the script section as arguments. See the shithub gitrules file for an example.
/rc/bin/service/tcp80:
#!/bin/auth/box -r/mnt -r/usr/git -r/sys/lib/ -r/usr/web -r/sys/lib/shithub -r/n -r/dev -eMa -s
<[3]/srv/clone{
d=‘{<[0=3]read}
bind /srv/$d /srv
<[3=0]{
bind /usr/web /mnt/static
exec /bin/tcp80 -r /sys/lib/tcp80 >>[2]/sys/log/httpd/log
}
}
/rc/bin/service/tcp443:
#!/bin/auth/box -r/mnt -r/usr/git -r/sys/lib -r/usr/web -r/sys/lib/shithub -r/n -r/dev -eMa -s
<[3]/srv/clone{
d=‘{<[0=3]read}
bind /srv/$d /srv
<[3=0]{
bind /usr/web /mnt/static
exec /bin/tlssrv -c/sys/lib/tls/cert.pem -lhttpd -r‘{cat $3/remote} /bin/tcp80 \
-r /sys/lib/tcp80 >>[2]/sys/log/httpd/log
}
}
/lib/namespace.httpd:
bind /mnt/static /usr/web/static
If you find a bug, or have a patch, please feel free to send email to grobe0ba@tcp80.org
For all other inquiries, I can be found in gridchat, or grobe0ba in #cat-v on OFTC.