python3 -m http.server
to provide a simple http server that listens on a configurable port and basically serves any file from the directory it is started from.
That is a good start but I had some additional requirements to serve up files from my raspberry Pi:
- The server must be able to run as a demonized process, i.e, in the background
- It must server a limited set of files
- from a configurable directory and
- be able to run as a less privileged user
restrictedhttpserver.py
The server is based on thedaemon
module a wrote about in a previous article and can be started from the commandline in much the same way as http.server:python3 restrictedhttpserver.py
It will run as the user that started it, will listen on port 8000 and start serving any file from the current directory. It will demonize itself as well.
It takes some additional options:
python3 restrictedhttpserver.py -h usage: restrictedhttpserver.py [-h] [-p PID_FILE] [-l LOG_FILE] [-r ROOT_DIR] [-n NAME] [-u USER] [-f] [-s] [-d] [--bind ADDRESS] [-x] [-e EXT] [port] Example HTTP Server positional arguments: port Specify alternate port [default: 8000] optional arguments: -h, --help show this help message and exit -p PID_FILE, --pid-file PID_FILE -l LOG_FILE, --log-file LOG_FILE -r ROOT_DIR, --root-dir ROOT_DIR -n NAME, --name NAME name of the server used in log lines -u USER, --user USER drop privileges of running server to those of user -f, --force start a server even if pid file is present already -s, --stop stop a running server -d, --debug Run http server in foreground mode --bind ADDRESS, -b ADDRESS Specify alternate bind address [default: all interfaces] -x, --nodirlist never show a directory listing -e EXT, --ext EXT allowed file extensions (without .) May occur more than onceFor example if you wanted to run it as user
www
from the directory /public/www
and just server html and css files, you could run it (as root) as follows:python3 restrictedhttpserver.py -r /public/www -u www -e html -e css
Later you could stop this process by executing
python3 retrictedhttpserver.py -s
For more information have a look at the source code, it is pretty readable I think :-)