mirror of
https://github.com/falk-werner/webfuse-example
synced 2024-10-27 20:44:09 +00:00
Merge pull request #4 from falk-werner/nginx
Simplified Example - enhanced capabilities of example (most ca be viewed in browser) - added nginx to serve HTML, JS, CSS, CGI - added fcgiwrap to access CGI scripts - cleanup temporary npm files
This commit is contained in:
commit
22bac55d46
10
Dockerfile
10
Dockerfile
@ -3,6 +3,7 @@ ARG CODENAME=bionic
|
|||||||
|
|
||||||
FROM ${REGISTRY_PREFIX}ubuntu:${CODENAME} as builder
|
FROM ${REGISTRY_PREFIX}ubuntu:${CODENAME} as builder
|
||||||
|
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
RUN set -x \
|
RUN set -x \
|
||||||
&& apt update \
|
&& apt update \
|
||||||
&& apt upgrade -y \
|
&& apt upgrade -y \
|
||||||
@ -17,7 +18,9 @@ RUN set -x \
|
|||||||
uuid-dev \
|
uuid-dev \
|
||||||
wget \
|
wget \
|
||||||
libconfig-dev \
|
libconfig-dev \
|
||||||
libpam0g-dev
|
libpam0g-dev \
|
||||||
|
nginx \
|
||||||
|
fcgiwrap
|
||||||
|
|
||||||
ARG PARALLELMFLAGS=-j2
|
ARG PARALLELMFLAGS=-j2
|
||||||
|
|
||||||
@ -138,8 +141,11 @@ RUN set -x \
|
|||||||
&& cd /usr/local/src/www \
|
&& cd /usr/local/src/www \
|
||||||
&& npm update --no-save \
|
&& npm update --no-save \
|
||||||
&& npm run build \
|
&& npm run build \
|
||||||
|
&& rm -rf /tmp/npm-* \
|
||||||
|
&& rm -rf /tmp/v8-* \
|
||||||
&& mkdir -p /var/www \
|
&& mkdir -p /var/www \
|
||||||
&& cp -r ./dist/. /var/www/
|
&& cp -r ./dist/. /var/www/ \
|
||||||
|
&& chmod +x /var/www/cgi-bin/*
|
||||||
|
|
||||||
ARG USERID=1000
|
ARG USERID=1000
|
||||||
RUN set -x \
|
RUN set -x \
|
||||||
|
@ -13,9 +13,9 @@ Example of webfuse.
|
|||||||
--device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmor:unconfined \
|
--device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmor:unconfined \
|
||||||
webfuse
|
webfuse
|
||||||
|
|
||||||
Open a webbrowser and visit http://localhost:8080 and establish a connection.
|
Open a webbrowser, visit http://localhost:8080 and follow the instruction on the screen.
|
||||||
|
|
||||||
Once connected, you can display the provided filesystem inside the container.
|
Once connected, you can also display the provided filesystem inside the container.
|
||||||
|
|
||||||
cat /tmp/test/hello.txt
|
cat /tmp/test/hello.txt
|
||||||
|
|
||||||
|
21
etc/nginx/fcgi.conf
Normal file
21
etc/nginx/fcgi.conf
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
fastcgi_param QUERY_STRING $query_string;
|
||||||
|
fastcgi_param REQUEST_METHOD $request_method;
|
||||||
|
fastcgi_param CONTENT_TYPE $content_type;
|
||||||
|
fastcgi_param CONTENT_LENGTH $content_length;
|
||||||
|
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
|
||||||
|
fastcgi_param REQUEST_URI $request_uri;
|
||||||
|
fastcgi_param DOCUMENT_URI $document_uri;
|
||||||
|
fastcgi_param DOCUMENT_ROOT $document_root;
|
||||||
|
fastcgi_param SERVER_PROTOCOL $server_protocol;
|
||||||
|
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
|
||||||
|
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
|
||||||
|
fastcgi_param REMOTE_ADDR $remote_addr;
|
||||||
|
fastcgi_param REMOTE_PORT $remote_port;
|
||||||
|
fastcgi_param SERVER_ADDR $server_addr;
|
||||||
|
fastcgi_param SERVER_PORT $server_port;
|
||||||
|
fastcgi_param SERVER_NAME $server_name;
|
||||||
|
|
||||||
|
fastcgi_index index.php;
|
||||||
|
|
||||||
|
fastcgi_param REDIRECT_STATUS 200;
|
48
etc/nginx/mime.types
Normal file
48
etc/nginx/mime.types
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
types {
|
||||||
|
text/html html htm shtml;
|
||||||
|
text/css css;
|
||||||
|
text/xml xml rss;
|
||||||
|
image/gif gif;
|
||||||
|
image/jpeg jpeg jpg;
|
||||||
|
application/x-javascript js;
|
||||||
|
text/plain txt;
|
||||||
|
text/x-component htc;
|
||||||
|
text/mathml mml;
|
||||||
|
image/png png;
|
||||||
|
image/x-icon ico;
|
||||||
|
image/x-jng jng;
|
||||||
|
image/vnd.wap.wbmp wbmp;
|
||||||
|
application/java-archive jar war ear;
|
||||||
|
application/mac-binhex40 hqx;
|
||||||
|
application/pdf pdf;
|
||||||
|
application/x-cocoa cco;
|
||||||
|
application/x-java-archive-diff jardiff;
|
||||||
|
application/x-java-jnlp-file jnlp;
|
||||||
|
application/x-makeself run;
|
||||||
|
application/x-perl pl pm;
|
||||||
|
application/x-pilot prc pdb;
|
||||||
|
application/x-rar-compressed rar;
|
||||||
|
application/x-redhat-package-manager rpm;
|
||||||
|
application/x-sea sea;
|
||||||
|
application/x-shockwave-flash swf;
|
||||||
|
application/x-stuffit sit;
|
||||||
|
application/x-tcl tcl tk;
|
||||||
|
application/x-x509-ca-cert der pem crt;
|
||||||
|
application/x-xpinstall xpi;
|
||||||
|
application/zip zip;
|
||||||
|
application/octet-stream deb;
|
||||||
|
application/octet-stream bin exe dll;
|
||||||
|
application/octet-stream dmg;
|
||||||
|
application/octet-stream eot;
|
||||||
|
application/octet-stream iso img;
|
||||||
|
application/octet-stream msi msp msm;
|
||||||
|
audio/mpeg mp3;
|
||||||
|
audio/x-realaudio ra;
|
||||||
|
video/mpeg mpeg mpg;
|
||||||
|
video/quicktime mov;
|
||||||
|
video/x-flv flv;
|
||||||
|
video/x-msvideo avi;
|
||||||
|
video/x-ms-wmv wmv;
|
||||||
|
video/x-ms-asf asx asf;
|
||||||
|
video/x-mng mng;
|
||||||
|
}
|
37
etc/nginx/nginx.conf
Normal file
37
etc/nginx/nginx.conf
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
user user user;
|
||||||
|
worker_processes 1;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 8080;
|
||||||
|
server_name localhost;
|
||||||
|
|
||||||
|
root /var/www;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
index index.html;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /webfuse-api {
|
||||||
|
proxy_pass http://localhost:8081;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "Upgrade";
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /cgi-bin/ {
|
||||||
|
fastcgi_intercept_errors on;
|
||||||
|
include fcgi.conf;
|
||||||
|
|
||||||
|
fastcgi_pass unix:/tmp/fcgi.sock;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
4
etc/services.d/fcgi/run
Normal file
4
etc/services.d/fcgi/run
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/execlineb -P
|
||||||
|
|
||||||
|
s6-setuidgid user
|
||||||
|
/usr/sbin/fcgiwrap -s unix:/tmp/fcgi.sock
|
3
etc/services.d/nginx/run
Normal file
3
etc/services.d/nginx/run
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#!/usr/bin/execlineb -P
|
||||||
|
|
||||||
|
nginx -g "daemon off;"
|
@ -5,8 +5,8 @@ version = { major = 1, minor = 0 }
|
|||||||
server:
|
server:
|
||||||
{
|
{
|
||||||
vhost_name = "localhost"
|
vhost_name = "localhost"
|
||||||
port = 8080
|
port = 8081
|
||||||
document_root = "/var/www"
|
# document_root = "/var/www"
|
||||||
}
|
}
|
||||||
|
|
||||||
filesystems:
|
filesystems:
|
||||||
|
12
www/src/cgi-bin/get-contents
Executable file
12
www/src/cgi-bin/get-contents
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
echo "Content-Type: text/plain"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ -f /tmp/test/hello.txt ] ; then
|
||||||
|
cat /tmp/test/hello.txt
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "File Not Found"
|
||||||
|
exit 1
|
||||||
|
fi
|
7
www/src/cgi-bin/list-dir
Executable file
7
www/src/cgi-bin/list-dir
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
echo "Content-Type: text/plain"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
ls -1a /tmp/test
|
||||||
|
exit 0
|
@ -16,7 +16,7 @@ export class ConnectionView {
|
|||||||
|
|
||||||
this.urlTextbox = document.createElement("input");
|
this.urlTextbox = document.createElement("input");
|
||||||
this.urlTextbox.type = "text";
|
this.urlTextbox.type = "text";
|
||||||
this.urlTextbox.value = window.location.href.replace(/^http/, "ws");
|
this.urlTextbox.value = window.location.href.replace(/^http/, "ws") + 'webfuse-api';
|
||||||
connectBox.appendChild(this.urlTextbox);
|
connectBox.appendChild(this.urlTextbox);
|
||||||
|
|
||||||
this.connectButton = document.createElement("input");
|
this.connectButton = document.createElement("input");
|
||||||
@ -25,8 +25,8 @@ export class ConnectionView {
|
|||||||
this.connectButton.addEventListener("click", () => { this._onConnectButtonClicked(); });
|
this.connectButton.addEventListener("click", () => { this._onConnectButtonClicked(); });
|
||||||
connectBox.appendChild(this.connectButton);
|
connectBox.appendChild(this.connectButton);
|
||||||
|
|
||||||
|
|
||||||
const authenticateBox = document.createElement("div");
|
const authenticateBox = document.createElement("div");
|
||||||
|
authenticateBox.classList.add('hidden');
|
||||||
this.element.appendChild(authenticateBox);
|
this.element.appendChild(authenticateBox);
|
||||||
|
|
||||||
const authLabel = document.createElement("span");
|
const authLabel = document.createElement("span");
|
||||||
|
@ -12,6 +12,31 @@
|
|||||||
<div class="title">Connection</div>
|
<div class="title">Connection</div>
|
||||||
<div id="connection"></div>
|
<div id="connection"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="window">
|
||||||
|
<div class="title">Info</div>
|
||||||
|
<div>
|
||||||
|
<p>Please connect to start providing files. This page updates every 5 seconds.</p>
|
||||||
|
<p>There are two files provided in this example:
|
||||||
|
<ul>
|
||||||
|
<li><b>hello.txt:</b> a plain text file</li>
|
||||||
|
<li><b>sayhello.sh:</b> a shell script printing a text to stdout</li>
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
<p>To display the files, see /tmp/test directory inside the container.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="window">
|
||||||
|
<div class="title">/tmp/test</div>
|
||||||
|
<div id="directory"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="window">
|
||||||
|
<div class="title">/tmp/test/hello.txt</div>
|
||||||
|
<div id="contents"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= htmlWebpackPlugin.tags.bodyTage %>
|
<%= htmlWebpackPlugin.tags.bodyTage %>
|
||||||
|
@ -7,6 +7,22 @@ function mode(value) {
|
|||||||
return parseInt(value, 8);
|
return parseInt(value, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateContents() {
|
||||||
|
const directory = document.getElementById('directory');
|
||||||
|
fetch("cgi-bin/list-dir").then(response => response.text()).then((text) => {
|
||||||
|
directory.textContent = text;
|
||||||
|
})
|
||||||
|
.catch(() => { directory.innerHTML = ''; });
|
||||||
|
|
||||||
|
const contents = document.getElementById('contents');
|
||||||
|
fetch("cgi-bin/get-contents").then(response => response.text()).then((text) => {
|
||||||
|
contents.textContent = text;
|
||||||
|
})
|
||||||
|
.catch(() => { contents.innerHTML = ''; });
|
||||||
|
|
||||||
|
window.setTimeout(updateContents, 5 * 1000);
|
||||||
|
}
|
||||||
|
|
||||||
function startup() {
|
function startup() {
|
||||||
const provider = new FileSystemProvider({
|
const provider = new FileSystemProvider({
|
||||||
inode: 1,
|
inode: 1,
|
||||||
@ -20,6 +36,7 @@ function startup() {
|
|||||||
const client = new Client();
|
const client = new Client();
|
||||||
const connectionView = new ConnectionView(client, provider);
|
const connectionView = new ConnectionView(client, provider);
|
||||||
document.getElementById('connection').appendChild(connectionView.element);
|
document.getElementById('connection').appendChild(connectionView.element);
|
||||||
|
updateContents();
|
||||||
}
|
}
|
||||||
|
|
||||||
window.onload = startup;
|
window.onload = startup;
|
||||||
|
@ -15,7 +15,7 @@ html, body {
|
|||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
margin-bottom: 25px;
|
margin-bottom: 25px;
|
||||||
color: white;
|
color: #c0c0c0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window .title {
|
.window .title {
|
||||||
@ -45,3 +45,11 @@ html, body {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
#contents, #directory {
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
@ -18,7 +18,8 @@ module.exports = {
|
|||||||
template: "./src/index.html"
|
template: "./src/index.html"
|
||||||
}),
|
}),
|
||||||
new CopyWebpackPlugin([
|
new CopyWebpackPlugin([
|
||||||
{ from: './src/style', to: 'style' }
|
{ from: './src/style', to: 'style' },
|
||||||
|
{ from: './src/cgi-bin', to: 'cgi-bin', copyPermissions: true }
|
||||||
])
|
])
|
||||||
],
|
],
|
||||||
resolve: {
|
resolve: {
|
||||||
|
Loading…
Reference in New Issue
Block a user