Tupi: A simple web server¶
Tupi’s main purpose is to provide an easy way to upload and download files. It supports basic http auth for file uploads.
Install¶
Tupi is written in go, so you need a go compiler installed. Then, clone the code:
$ git clone https://github.com/jucacrispim/tupi
And install the program with:
$ cd tupi
$ make install
Note
For all make targets use make help
Usage¶
Serving files¶
Now you can use the tupi
command to start the server. By default it serves
the current working dir. It can be changed using the param -root
:
$ tupi -root /some/dir
By default tupi listens in the port 8080. You can change using the param -port
:
$ tupi -port 8000
Now you can download files
$ curl http://localhost:8080/some-file.txt
You can also list the contents of a directory:
$ curl http://localhost:8080/
One can instead of listing the contents of a directory, return the
index.html file in it. To do so use the option default-to-index
.
$ tupi -default-to-index
To authenticate downloads, use the options -auth-methods POST,GET
and htpasswd
.
$ tupi -auth-methods POST,GET -htpasswd /some/htpasswd/file.
Note
Tupi also supports other authentication methods via plugins. Check Writing plugins.
Uploading files¶
To upload files a htpasswd file must be created first for authenticated access:
$ htpasswd -c -B /some/htpasswd/file some-user
And start the server using the htpasswd
param:
$ tupi -htpasswd -htpasswd /some/htpasswd/file
Danger
Your htpasswd MUST NOT be whithin the directory being served by tupi
To upload a file send a POST request to the “/u/” path in the server.
The request must have the multipart/form-data
Content-Type header and the
file must be in a input named file
.
Note
The upload path can be changed by a config param.
$ curl --user test:123 -F 'file=@/home/juca/powerreplica.jpg' http://localhost:8080/u/
A prefix
can be passed in the request so the file will be saved inside the prefix
directory
$ curl --user test:123 -F 'file=@/home/juca/powerreplica.jpg' http://localhost:8080/u/ -F 'prefix=something'
Upload and extract¶
Tupi can extract the contets of uploaded tar.gz files. The contents will be extracted in the root directory being served and the directory structure in the tar file will be preserved.
To upload and extract the contents o a file send a POST request to the
“/e/” path in the server. The request must also have the
multipart/form-data
Content-Type header and the file must be in
a input named file
.
Note
The extract path can be changed by a config param.
$ curl --user test:123 -F 'file=@/home/juca/package.tar.gz' http://localhost:8080/e/
HTTPS connections¶
To use an HTTPS connection, one must use the -certfile
and -keyfile
params:
$ tupi -certfile /some/cert.pem -keyfile /some/file.key
For all options available for tupi use the command tupi -h
$ tupi -h
Usage of tupi:
-auth-downloads
Autenticate downloads
-certfile string
Path for the tls certificate file
-conf string
Path for the configuration file
-default-to-index
Returns the index.html instead of listing a directory
-epath string
Path to extract files (default "/e/")
-host string
host to listen. (default "0.0.0.0")
-htpasswd string
Full path for a htpasswd file used for authentication
-keyfile string
Path for the tls key file
-loglevel string
Log level (default "info")
-maxupload int
Max size for uploaded files (default 10485760)
-port int
port to listen. (default 8080)
-prevent-overwrite
Prevents over writing existent files
-root string
The directory to serve files from (default ".")
-timeout int
Timeout in seconds for read/write (default 240)
-upath string
Path to upload files (default "/u/")
Config file¶
Instead of command line options one can also use a toml
configuration file by
using the -config
command line option or by setting the TUPI_CONFIG_FILE
environment variable.
Here is an example of a config file:
# all parameters here are optional
host = "0.0.0.0"
port = 1234
rootDir = "/some/dir"
# timeout in seconds
timeout = 500
htpasswdFile = "/some/htpasswd"
uploadPath = "/u/"
extractPath = "/e/"
# defaults to 10 MB
maxUploadSize = 10485760
certFilePath = "/some/cert.pem"
keyFilePath = "/some/file.key"
defaultToIndex = true
logLevel = "debug"
preventOverwrite = true
authMethods = ["POST"]
Alternative port¶
Settimg the alternativePort
option in the config file tupi
will also listen in a port other than default one.
...
port: 1234
alternativePort: 1235
...
Redir http to https¶
Setting the redirToHttps
option in the config file
tupi will redirect http requests to https.
The rules for the redirect are as follows:
The url schema will be changed from http
to https
.
If there is a port in the url, the port
(considered to be the alternivePort) will be replaced
by the port
config value.
Virtual Domains¶
To use virutal domains one need to configure the domains in the config file. Each different section of the config file corresponds to a virtual domain handled by tupi.
[default]
# port 8080
[adomain.net]
rootDir "/some/dir"
# timeout in seconds
timeout = 500
htpasswdFile = "/some/htpasswd"
uploadPath = "/u/"
extractPath = "/e/"
# defaults to 10 MB
maxUploadSize = 10485760
certFilePath = "/some/cert.pem"
keyFilePath = "/some/file.key"
defaultToIndex = true
logLevel = "debug"
[otherdomain.net]
rootDir "/other/dir"
# timeout in seconds
timeout = 500
htpasswdFile = "/other/htpasswd"
uploadPath = "/u/"
extractPath = "/e/"
# defaults to 10 MB
maxUploadSize = 10485760
certFilePath = "/other/cert.pem"
keyFilePath = "/other/file.key"
defaultToIndex = false
All options available ara supported by the virtual domains, except host
, port
and loglevel
that are only available for the default server.
Plugins¶
Tupi can be extended by plugins. Check the docs on how to write your own plugins