python3 -m http.serverto 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.pyIt 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 once
For 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 cssLater you could stop this process by executing
python3 retrictedhttpserver.py -sFor more information have a look at the source code, it is pretty readable I think :-)