1
0
mirror of synced 2025-12-15 20:12:17 +01:00

Add files via upload

This commit is contained in:
d-two
2023-02-08 23:27:46 +01:00
committed by GitHub
parent 4228182fb8
commit c0fd42d532
36 changed files with 4465 additions and 0 deletions

158
mediaelch/Dockerfile Normal file
View File

@@ -0,0 +1,158 @@
ARG BUILD_FROM
ARG BUILD_ARCH
#
# baseimage-gui Dockerfile
#
# https://github.com/jlesage/docker-baseimage-gui
#
# Get Dockerfile cross-compilation helpers.
FROM --platform=$BUILD_ARCH tonistiigi/xx AS xx
# Build Nginx.
FROM --platform=$BUILD_ARCH ${BUILD_FROM} AS nginx
ARG TARGETPLATFORM
COPY --from=xx / /
COPY src/nginx/build.sh /tmp/build-nginx.sh
RUN chmod -R 755 /tmp/build-nginx.sh
RUN /tmp/build-nginx.sh
RUN xx-verify --static /tmp/nginx-install/sbin/nginx
# NOTE: Extended attributes are kept by buildx when using the COPY command.
# See https://wildwolf.name/multi-stage-docker-builds-and-xattrs/.
RUN apk --no-cache add libcap && setcap cap_net_bind_service=ep /tmp/nginx-install/sbin/nginx
# Build noVNC.
FROM --platform=$BUILD_ARCH ${BUILD_FROM} AS noVNC
ARG NOVNC_VERSION=1.3.0
ARG BOOTSTRAP_VERSION=5.1.3
ARG BOOTSTRAP_NIGHTSHADE_VERSION=1.1.3
ARG FONTAWESOME_VERSION=4.7.0
ARG NOVNC_URL=https://github.com/novnc/noVNC/archive/refs/tags/v${NOVNC_VERSION}.tar.gz
ARG BOOTSTRAP_URL=https://github.com/twbs/bootstrap/releases/download/v${BOOTSTRAP_VERSION}/bootstrap-${BOOTSTRAP_VERSION}-dist.zip
ARG BOOTSTRAP_NIGHTSHADE_URL=https://github.com/vinorodrigues/bootstrap-dark-5/archive/refs/tags/v${BOOTSTRAP_NIGHTSHADE_VERSION}.tar.gz
ARG FONTAWESOME_URL=https://fontawesome.com/v${FONTAWESOME_VERSION}/assets/font-awesome-${FONTAWESOME_VERSION}.zip
WORKDIR /tmp
COPY rootfs/opt/noVNC/index.html /opt/noVNC/index.html
RUN \
# Install required tools.
apk --no-cache add \
curl \
sed \
jq \
npm \
&& \
npm install clean-css-cli -g
RUN \
# Create required directories.
mkdir -p \
/opt/noVNC/app/styles \
/opt/noVNC/app/fonts
RUN \
# Install noVNC.
mkdir /tmp/noVNC && \
curl -# -L ${NOVNC_URL} | tar -xz --strip 1 -C /tmp/noVNC && \
cp -vr /tmp/noVNC/core /opt/noVNC/ && \
cp -vr /tmp/noVNC/vendor /opt/noVNC/
RUN \
# Install Bootstrap.
# NOTE: Only copy the JS bundle, since the CSS is taken from Bootstrap
# Nightshade.
curl -sS -L -O ${BOOTSTRAP_URL} && \
unzip bootstrap-${BOOTSTRAP_VERSION}-dist.zip && \
#cp -v bootstrap-${BOOTSTRAP_VERSION}-dist/css/bootstrap.min.css /opt/noVNC/app/styles/ && \
cp -v bootstrap-${BOOTSTRAP_VERSION}-dist/js/bootstrap.bundle.min.js* /opt/noVNC/app/
RUN \
# Install Bootstrap Nightshade.
mkdir /tmp/bootstrap-nightshade && \
curl -# -L ${BOOTSTRAP_NIGHTSHADE_URL} | tar -xz --strip 1 -C /tmp/bootstrap-nightshade && \
cleancss \
-O1 \
--format breakWith=lf \
--output /opt/noVNC/app/styles/bootstrap-nightshade.min.css \
/tmp/bootstrap-nightshade/dist/css/bootstrap-nightshade.css
RUN \
# Install Font Awesome.
curl -sS -L -O ${FONTAWESOME_URL} && \
unzip font-awesome-${FONTAWESOME_VERSION}.zip && \
cp -v font-awesome-${FONTAWESOME_VERSION}/fonts/fontawesome-webfont.* /opt/noVNC/app/fonts/ && \
cp -v font-awesome-${FONTAWESOME_VERSION}/css/font-awesome.min.css /opt/noVNC/app/styles/
RUN \
# Set version of CSS and JavaScript file URLs.
sed "s/UNIQUE_VERSION/$(date | md5sum | cut -c1-10)/g" -i /opt/noVNC/index.html
# Pull base image.
FROM ${BUILD_FROM} AS MediaElchBuild
WORKDIR /tmp
# Define software versions.
ARG REPO_TAG=v2.10.0
# Define software download URLs.
ARG REPO_URL=https://github.com/Komet/MediaElch
RUN \
apk add --update \
git \
build-base \
qtchooser \
qt5-qtbase-dev \
qt5-qtquickcontrols2-dev \
qt5-qtsvg-dev \
qt5-qtmultimedia-dev \
qt5-qttools-dev \
qt5-qtdeclarative-dev \
libmediainfo-dev
# Download MediaElch
RUN \
REPO_DIR=/tmp/$(basename $REPO_URL .git) && \
cd /tmp && \
git clone --single-branch $REPO_URL && \
git --work-tree=$REPO_DIR --git-dir=$REPO_DIR/.git checkout tags/$REPO_TAG
RUN \
cd /tmp/MediaElch && \
git submodule update --init && \
mkdir build && cd build && \
qmake .. CONFIG+=release && \
make install -j$(nproc)
# Pull base image.
FROM ${BUILD_FROM}
#zenity
ARG VNC_PKGS="ttf-dejavu tigervnc openbox"
ARG RUNTIME_PKG="qtchooser qt5-qtbase qt5-qtquickcontrols2 qt5-qtsvg qt5-qtmultimedia qt5-qttools qt5-qtbase-sqlite libmediainfo"
# Add files.
COPY rootfs/ /
COPY --from=nginx /tmp/nginx-install /opt/base/
COPY --from=noVNC /opt/noVNC /opt/noVNC
COPY --from=MediaElchBuild /usr/bin/MediaElch /app/
COPY --from=MediaElchBuild /usr/share/pixmaps/MediaElch.png /opt/noVNC/app/images/icons/master_icon.png
# Install dependencies.
RUN \
apk add --update \
${VNC_PKGS} \
${RUNTIME_PKG}
# Add files.
COPY rootfs/ /
# Set environment variables.
ENV APP_NAME="MediaElch" \
S6_KILL_GRACETIME=8000 \
USER_ID=0 \
GROUP_ID=0
# Corrects permissions for s6 v3
RUN if [ -d /etc/cont-init.d ]; then chmod -R 755 /etc/cont-init.d; fi && \
if [ -d /etc/services.d ]; then chmod -R 755 /etc/services.d; fi
WORKDIR /data
# Metadata.
LABEL \
org.label-schema.name="MediaElch" \
org.label-schema.description="Docker container for MediaElch"

22
mediaelch/LICENSE Normal file
View File

@@ -0,0 +1,22 @@
The MIT License (MIT)
Copyright (c) 2015 Cyrill Kulka
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

28
mediaelch/README.md Normal file
View File

@@ -0,0 +1,28 @@
# List of available Languages
| Code | language name | progress |
|:------ |:------ | ------:|
| bg | Bulgarian | 67% |
| cs-CZ | Czech (Czech Republic) | 64% |
| da | Danish | 2% |
| de | German | 100% |
| en | English | 100% |
| en-US | English (United States) | 86% |
| es-ES | Spanish (Spain) | 76% |
| et | Estonian | 90% |
| fi | Finnish | 86% |
| fr | French | 97% |
| it | Italian | 100% |
| ja | Japanese | 10% |
| ko | Korean | 62% |
| nl-NL | Dutch (Netherlands) | 79% |
| no | Norwegian | 72% |
| pl | Polish | 78% |
| pt-BR | Portuguese (Brazil) | 100% |
| pt-PT | Portuguese (Portugal) | 79% |
| ru | Russian | 100% |
| sv | Swedish | 73% |
| zh-CN | Chinese (China) | 97% |
Here you can see the progress of the translation and eventually help.
https://explore.transifex.com/komet/mediaelch/

7
mediaelch/build.yaml Normal file
View File

@@ -0,0 +1,7 @@
---
build_from:
armhf: ghcr.io/home-assistant/armhf-base:3.16
armv7: ghcr.io/home-assistant/armv7-base:3.16
aarch64: ghcr.io/home-assistant/aarch64-base:3.16
amd64: ghcr.io/home-assistant/amd64-base:3.16
i386: ghcr.io/home-assistant/i386-base:3.16

27
mediaelch/config.yaml Normal file
View File

@@ -0,0 +1,27 @@
---
name: MediaElch
slug: mediaelch
version: 2.10.0
stage: experimental
description: MediaElch is a MediaManager for Kodi. Information about Movies, TV Shows, Concerts and Music are stored as NFO files. Fanarts are downloaded automatically from fanart.tv.
url: https://github.com/d-two/hassio-addons
startup: application
init: false
panel_icon: mdi:multimedia
ingress: true
ingress_port: 5800
webui: "http://[HOST]:[PORT:5800]"
arch:
- aarch64
- amd64
- armhf
- i386
boot: auto
map:
- media:rw
schema:
app_lang: list(bg|cs-CZ|da|de|en|en-US|es-ES|et|fi|fr|it|ja|ko|nl-NL|no|pl|pt-BR|pt-PT|ru|sv|zh-CN)?
#ports:
# 5800/tcp: 5800
#ports_description:
# 5800/tcp: Web UI port

BIN
mediaelch/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

BIN
mediaelch/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This XML contains advanced settings for MediaElch (http://mediaelch.de/).
All tags contain MediaElch's default values unless stated otherwise.
-->
<advancedsettings>
<!--
Set the interface language. If it is set to "system", your system's
language will be used. Use the format "lang-COUNTRY" to specify your
language. Examples: "de-DE", "en-US", "pt-PT", "pt-BR"
If <locale> is not valid, your system's locale will be used.
If <locale> exists, but is not supported by MediaElch, English will be used.
-->
<locale>%%app_lang%%</locale>
</advancedsettings>

View File

@@ -0,0 +1,21 @@
#!/bin/sh
set -e # Exit immediately if a command exits with a non-zero status.
set -u # Treat unset variables as an error.
#
# Adjust nginx virtual server configuration.
#
NGINX_DIRS="\
/var/run/nginx \
/var/tmp/nginx \
/var/lib/nginx/logs
"
# Make sure required directories exist.
for DIR in $NGINX_DIRS; do
mkdir -p "$DIR"
done
# vim:ft=sh:ts=4:sw=4:et:sts=4

View File

@@ -0,0 +1,13 @@
#!/usr/bin/with-contenv bashio
# ==============================================================================
# Home Assistant Community Add-on: MediaElch
# Setup the application language
# ==============================================================================
declare app_lang="system"
if bashio::config.has_value 'app_lang'; then
app_lang=$(bashio::config 'app_lang')
fi
sed -i "s#%%app_lang%%#${app_lang}#g" /app/advancedsettings.xml

View File

@@ -0,0 +1,57 @@
#!/bin/sh
set -e # Exit immediately if a command exits with a non-zero status.
set -u # Treat unset variables as an error.
is_number() {
case "${1:-}" in
''|*[!0-9]*) return 1 ;;
*) return 0 ;;
esac
}
WEB_DATA_FILE="/opt/noVNC/app/webdata.js"
rm -f "$WEB_DATA_FILE"
# Beginning of the JavaScript file.
printf 'const WebData = {\n' >> "$WEB_DATA_FILE"
# Add application name.
printf ' applicationName: "%s"' "MediaElch" >> "$WEB_DATA_FILE"
# Add application version.
if [ -n "${APP_VERSION:-}" ]; then
printf ',\n applicationVersion: "%s"' "$APP_VERSION" >> "$WEB_DATA_FILE"
fi
# Add Docker image version.
if [ -n "${DOCKER_IMAGE_VERSION:-}" ]; then
printf ',\n dockerImageVersion: "%s"' "$DOCKER_IMAGE_VERSION" >> "$WEB_DATA_FILE"
fi
# Add dark mode.
#if is-bool-val-true "${DARK_MODE:-0}"; then
printf ',\n darkMode: true' >> "$WEB_DATA_FILE"
#else
# printf ',\n darkMode: false' >> "$WEB_DATA_FILE"
#fi
# Add application's window width.
if is_number "${DISPLAY_WIDTH:-}"; then
printf ',\n applicationWindowWidth: %s' "$DISPLAY_WIDTH" >> "$WEB_DATA_FILE"
fi
# Add application's window height.
if is_number "${DISPLAY_HEIGHT:-}"; then
printf ',\n applicationWindowHeight: %s' "$DISPLAY_HEIGHT" >> "$WEB_DATA_FILE"
fi
# End of the JavaScript file.
printf '\n};\n' >> "$WEB_DATA_FILE"
printf 'export default WebData;\n' >> "$WEB_DATA_FILE"
# Make sure the file has the right permissions.
chmod 444 "$WEB_DATA_FILE"
# vim:ft=sh:ts=4:sw=4:et:sts=4

View File

@@ -0,0 +1,17 @@
# This is the default stream configuration. This is used to terminate the SSL
# connection for the VNC session.
server {
listen 5900 ssl;
proxy_pass unix:/tmp/vnc.sock;
# Path to certificate files.
ssl_certificate /config/certs/vnc-fullchain.pem;
ssl_certificate_key /config/certs/vnc-privkey.pem;
# Path of the file with Diffie-Hellman parameters for EDH ciphers.
ssl_dhparam /config/certs/dhparam.pem;
# SSL handshake timeout.
ssl_handshake_timeout 10s;
}

View File

@@ -0,0 +1,96 @@
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
font/woff woff;
font/woff2 woff2;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/x-7z-compressed 7z;
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/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}

View File

@@ -0,0 +1,15 @@
proxy_http_version 1.1;
proxy_ignore_client_abort off;
proxy_read_timeout 86400s;
proxy_redirect off;
proxy_send_timeout 86400s;
proxy_max_temp_file_size 0;
proxy_set_header Accept-Encoding "";
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Real-IP $remote_addr;

View File

@@ -0,0 +1,7 @@
root /opt/noVNC;
index index.html;
server_name $hostname;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;

View File

@@ -0,0 +1,9 @@
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;

View File

@@ -0,0 +1,102 @@
# Run nginx in foreground.
daemon off;
# This is run inside Docker.
user root;
# Pid storage location.
pid /var/run/nginx.pid;
# Set number of worker processes.
worker_processes 1;
# Enables the use of JIT for regular expressions to speed-up their processing.
pcre_jit on;
# Write error log to the add-on log.
error_log /proc/1/fd/1 error;
# Max num of simultaneous connections by a worker process.
events {
worker_connections 512;
}
http {
# Includes mapping of file name extensions to MIME types of responses
# and defines the default type.
include /etc/nginx/includes/mime.types;
log_format homeassistant '[$time_local] $status '
'$http_x_forwarded_for($remote_addr) '
'$request ($http_user_agent)';
access_log /proc/1/fd/1 homeassistant;
default_type application/octet-stream;
# Name servers used to resolve names of upstream servers into addresses.
# It's also needed when using tcpsocket and udpsocket in Lua modules.
#resolver 208.67.222.222 208.67.220.220;
# Don't tell nginx version to clients.
server_tokens off;
# Specifies the maximum accepted body size of a client request, as
# indicated by the request header Content-Length. If the stated content
# length is greater than this size, then the client receives the HTTP
# error code 413. Set to 0 to disable.
client_max_body_size 1m;
# Timeout for keep-alive connections. Server will close connections after
# this time.
keepalive_timeout 65;
# Sendfile copies data between one FD and other from within the kernel,
# which is more efficient than read() + write().
sendfile on;
# Don't buffer data-sends (disable Nagle algorithm).
# Good for sending frequent small bursts of data in real time.
tcp_nodelay on;
# Causes nginx to attempt to send its HTTP response head in one packet,
# instead of using partial frames.
#tcp_nopush on;
# # Specifies that our cipher suits should be preferred over client ciphers.
# ssl_prefer_server_ciphers on;
#
# # Protocol and ciphers.
# # This is what Mozilla calls "Modern configuration".
# ssl_protocols TLSv1.2;
# ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
#
# # Enables a shared SSL cache with size that can hold around 8000 sessions.
# ssl_session_cache shared:SSL:2m;
# Enable checking the existence of precompressed files.
#gzip_static on;
# # Specifies the main log format.
# log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# # Sets the path, format, and configuration for a buffered log write.
# access_log /config/log/nginx/access.log main;
## include /etc/nginx/includes/resolver.conf;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# Includes virtual host config.
include /etc/nginx/servers/*.conf;
}
#stream {
# # Include optional stream to handle encrypted VNC connection.
# include /etc/nginx/includes/default_stream.conf;
#}

View File

@@ -0,0 +1,35 @@
# This is a default site configuration.
server {
listen 5800 ssl default_server;
listen [::]:5800 ssl default_server;
include /etc/nginx/includes/ssl_params.conf;
include /etc/nginx/includes/server_params.conf;
include /etc/nginx/includes/proxy_params.conf;
ssl on;
ssl_certificate /ssl/%%certfile%%;
ssl_certificate_key /ssl/%%keyfile%%;
# Redirect HTTP traffic.
# https://serverfault.com/a/664936
error_page 497 301 =307 https://$http_host$request_uri;
# https://github.com/novnc/noVNC/blob/master/docs/EMBEDDING.md#browser-cache-issue
add_header Cache-Control no-cache;
location /websockify {
websockify_pass unix:/tmp/vnc.sock;
websockify_read_timeout 5d;
websockify_send_timeout 5d;
}
# Access to favicons.
location ~* ^/(browserconfig.xml|site.webmanifest|safari-pinned-tab.svg|((favicon|apple-touch-icon|android-chrome|mstile)(.*)\.(ico|png)))$ {
root /opt/noVNC/app/images/icons;
# Uncomment if access to favicon.ico generates too many logs.
#log_not_found off;
#access_log off;
}
}

View File

@@ -0,0 +1,30 @@
# This is a default site configuration.
server {
listen 5800 default_server;
listen [::]:5800 default_server;
include /etc/nginx/includes/server_params.conf;
include /etc/nginx/includes/proxy_params.conf;
# Redirect HTTP traffic.
# https://serverfault.com/a/664936
error_page 497 301 =307 https://$http_host$request_uri;
# https://github.com/novnc/noVNC/blob/master/docs/EMBEDDING.md#browser-cache-issue
add_header Cache-Control no-cache;
location /websockify {
websockify_pass unix:/tmp/vnc.sock;
websockify_read_timeout 5d;
websockify_send_timeout 5d;
}
# Access to favicons.
location ~* ^/(browserconfig.xml|site.webmanifest|safari-pinned-tab.svg|((favicon|apple-touch-icon|android-chrome|mstile)(.*)\.(ico|png)))$ {
root /opt/noVNC/app/images/icons;
# Uncomment if access to favicon.ico generates too many logs.
#log_not_found off;
#access_log off;
}
}

View File

@@ -0,0 +1,4 @@
#!/command/with-contenv bashio
bashio::log.info "Starting Nginx...."
exec /opt/base/sbin/nginx

View File

@@ -0,0 +1,16 @@
#!/command/with-contenv bashio
export DISPLAY=":0"
export XDG_DATA_HOME="/data/xdg/data"
export XDG_CONFIG_HOME="/data/xdg/config"
export XDG_CACHE_HOME="/data/xdg/cache"
export XDG_STATE_HOME="/data/xdg/state"
export XDG_RUNTIME_DIR="/data/runtime-root"
export HOME="/data/home"
mkdir -p ${XDG_DATA_HOME} ${XDG_CONFIG_HOME} ${XDG_CACHE_HOME} ${XDG_STATE_HOME} ${XDG_RUNTIME_DIR} ${HOME}
# Fix permissions
chmod 0700 ${XDG_RUNTIME_DIR}
bashio::log.info "Starting OpenBox...."
exec /usr/bin/openbox-session

View File

@@ -0,0 +1,4 @@
#!/command/with-contenv bashio
bashio::log.info "Starting Xvnc...."
exec /usr/bin/Xvnc -nolisten tcp -nolisten local -listen unix -geometry 1024x768 -depth 24 -rfbunixpath=/tmp/vnc.sock -SecurityTypes=None -desktop="MediaElch" :0

View File

@@ -0,0 +1 @@
/app/MediaElch &

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<openbox_menu xmlns="http://openbox.org/3.4/menu">
</openbox_menu>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<openbox_config xmlns="http://openbox.org/3.4/rc" xmlns:xi="http://www.w3.org/2001/XInclude">
<!--
<theme>
<titleLayout>NLC</titleLayout>
</theme>
-->
<applications>
<application type="normal" title="MediaElch">
<decor>no</decor>
<maximized>true</maximized>
<layer>below</layer>
</application>
</applications>
</openbox_config>

View File

@@ -0,0 +1,66 @@
/*
* noVNC: HTML5 VNC client
* Copyright (C) 2019 The noVNC Authors
* Licensed under MPL 2.0 (see LICENSE.txt)
*
* See README.md for usage and integration instructions.
*/
// NB: this should *not* be included as a module until we have
// native support in the browsers, so that our error handler
// can catch script-loading errors.
// No ES6 can be used in this file since it's used for the translation
/* eslint-disable prefer-arrow-callback */
(function _scope() {
"use strict";
// Fallback for all uncought errors
function handleError(event, err) {
try {
const msg = document.getElementById('noVNC_fallback_errormsg');
// Only show the initial error
if (msg.hasChildNodes()) {
return false;
}
let div = document.createElement("div");
div.classList.add('noVNC_message');
div.appendChild(document.createTextNode(event.message));
msg.appendChild(div);
if (event.filename) {
div = document.createElement("div");
div.className = 'noVNC_location';
let text = event.filename;
if (event.lineno !== undefined) {
text += ":" + event.lineno;
if (event.colno !== undefined) {
text += ":" + event.colno;
}
}
div.appendChild(document.createTextNode(text));
msg.appendChild(div);
}
if (err && err.stack) {
div = document.createElement("div");
div.className = 'noVNC_stack';
div.appendChild(document.createTextNode(err.stack));
msg.appendChild(div);
}
document.getElementById('noVNC_fallback_error')
.classList.add("noVNC_open");
} catch (exc) {
document.write("Unexpected error encountered.");
}
// Don't return true since this would prevent the error
// from being printed to the browser console.
return false;
}
window.addEventListener('error', function onerror(evt) { handleError(evt, evt.error); });
window.addEventListener('unhandledrejection', function onreject(evt) { handleError(evt.reason, evt.reason); });
})();

View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="25"
height="25"
viewBox="0 0 25 25"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="error.svg"
inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#959595"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="14.00357"
inkscape:cy="12.443398"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:object-paths="true"
showguides="true"
inkscape:window-width="1920"
inkscape:window-height="1136"
inkscape:window-x="1920"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:snap-smooth-nodes="true"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-nodes="true"
inkscape:snap-global="true">
<inkscape:grid
type="xygrid"
id="grid4136" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1027.3622)">
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 7 3 C 4.7839905 3 3 4.7839905 3 7 L 3 18 C 3 20.21601 4.7839905 22 7 22 L 18 22 C 20.21601 22 22 20.21601 22 18 L 22 7 C 22 4.7839905 20.21601 3 18 3 L 7 3 z M 7.6992188 6 A 1.6916875 1.6924297 0 0 1 8.9121094 6.5117188 L 12.5 10.101562 L 16.087891 6.5117188 A 1.6916875 1.6924297 0 0 1 17.251953 6 A 1.6916875 1.6924297 0 0 1 18.480469 8.90625 L 14.892578 12.496094 L 18.480469 16.085938 A 1.6916875 1.6924297 0 1 1 16.087891 18.478516 L 12.5 14.888672 L 8.9121094 18.478516 A 1.6916875 1.6924297 0 1 1 6.5214844 16.085938 L 10.109375 12.496094 L 6.5214844 8.90625 A 1.6916875 1.6924297 0 0 1 7.6992188 6 z "
transform="translate(0,1027.3622)"
id="rect4135" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="25"
height="25"
viewBox="0 0 25 25"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="info.svg"
inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#959595"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="15.720838"
inkscape:cy="8.9111233"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:object-paths="true"
showguides="false"
inkscape:window-width="1920"
inkscape:window-height="1136"
inkscape:window-x="1920"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:snap-smooth-nodes="true"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-nodes="true"
inkscape:snap-global="true">
<inkscape:grid
type="xygrid"
id="grid4136" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1027.3622)">
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 12.5 3 A 9.5 9.4999914 0 0 0 3 12.5 A 9.5 9.4999914 0 0 0 12.5 22 A 9.5 9.4999914 0 0 0 22 12.5 A 9.5 9.4999914 0 0 0 12.5 3 z M 12.5 5 A 1.5 1.5000087 0 0 1 14 6.5 A 1.5 1.5000087 0 0 1 12.5 8 A 1.5 1.5000087 0 0 1 11 6.5 A 1.5 1.5000087 0 0 1 12.5 5 z M 10.521484 8.9785156 L 12.521484 8.9785156 A 1.50015 1.50015 0 0 1 14.021484 10.478516 L 14.021484 15.972656 A 1.50015 1.50015 0 0 1 14.498047 18.894531 C 14.498047 18.894531 13.74301 19.228309 12.789062 18.912109 C 12.312092 18.754109 11.776235 18.366625 11.458984 17.828125 C 11.141734 17.289525 11.021484 16.668469 11.021484 15.980469 L 11.021484 11.980469 L 10.521484 11.980469 A 1.50015 1.50015 0 1 1 10.521484 8.9804688 L 10.521484 8.9785156 z "
transform="translate(0,1027.3622)"
id="path4136" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="25"
height="25"
viewBox="0 0 25 25"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="warning.svg"
inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#959595"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="16.457343"
inkscape:cy="12.179552"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:object-paths="true"
showguides="false"
inkscape:window-width="1920"
inkscape:window-height="1136"
inkscape:window-x="1920"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:snap-smooth-nodes="true"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-nodes="true"
inkscape:snap-global="true">
<inkscape:grid
type="xygrid"
id="grid4136" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1027.3622)">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 12.513672 3.0019531 C 11.751609 2.9919531 11.052563 3.4242687 10.710938 4.1054688 L 3.2109375 19.105469 C 2.5461937 20.435369 3.5132277 21.9999 5 22 L 20 22 C 21.486772 21.9999 22.453806 20.435369 21.789062 19.105469 L 14.289062 4.1054688 C 13.951849 3.4330688 13.265888 3.0066531 12.513672 3.0019531 z M 12.478516 6.9804688 A 1.50015 1.50015 0 0 1 14 8.5 L 14 14.5 A 1.50015 1.50015 0 1 1 11 14.5 L 11 8.5 A 1.50015 1.50015 0 0 1 12.478516 6.9804688 z M 12.5 17 A 1.5 1.5 0 0 1 14 18.5 A 1.5 1.5 0 0 1 12.5 20 A 1.5 1.5 0 0 1 11 18.5 A 1.5 1.5 0 0 1 12.5 17 z "
transform="translate(0,1027.3622)"
id="path4208" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -0,0 +1,548 @@
/*
* noVNC base CSS
* Copyright (C) 2019 The noVNC Authors
* noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
* This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
*/
/*
* Z index layers:
*
* 0: Main screen
* 10: Control bar
* 50: Transition blocker
* 60: Connection popups
* 100: Status bar
* ...
* 1000: Javascript crash
* ...
* 10000: Max (used for polyfills)
*/
html {
height: 100%;
}
body {
margin: 0;
padding: 0;
background-color: #313131;
height: 100%;
touch-action: none;
}
.noVNC_only_touch.noVNC_hidden {
display: none;
}
/* ----------------------------------------
* Spinner
* ----------------------------------------
*/
.noVNC_spinner {
position: relative;
}
.noVNC_spinner, .noVNC_spinner::before, .noVNC_spinner::after {
width: 10px;
height: 10px;
border-radius: 2px;
box-shadow: -60px 10px 0 rgba(255, 255, 255, 0);
animation: noVNC_spinner 1.0s linear infinite;
}
.noVNC_spinner::before {
content: "";
position: absolute;
left: 0px;
top: 0px;
animation-delay: -0.1s;
}
.noVNC_spinner::after {
content: "";
position: absolute;
top: 0px;
left: 0px;
animation-delay: 0.1s;
}
@keyframes noVNC_spinner {
0% { box-shadow: -60px 10px 0 rgba(255, 255, 255, 0); width: 20px; }
25% { box-shadow: 20px 10px 0 rgba(255, 255, 255, 1); width: 10px; }
50% { box-shadow: 60px 10px 0 rgba(255, 255, 255, 0); width: 10px; }
}
/* ----------------------------------------
* WebKit centering hacks
* ----------------------------------------
*/
.noVNC_center {
/*
* This is a workaround because webkit misrenders transforms and
* uses non-integer coordinates, resulting in blurry content.
* Ideally we'd use "top: 50%; transform: translateY(-50%);" on
* the objects instead.
*/
display: flex;
align-items: center;
justify-content: center;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
}
.noVNC_center > * {
pointer-events: auto;
}
.noVNC_vcenter {
display: flex;
flex-direction: column;
justify-content: center;
position: fixed;
top: 0;
left: 0;
height: 100%;
pointer-events: none;
}
.noVNC_vcenter > * {
pointer-events: auto;
}
/* ----------------------------------------
* Layering
* ----------------------------------------
*/
.noVNC_connect_layer {
z-index: 60;
}
/* ----------------------------------------
* Fallback error
* ----------------------------------------
*/
#noVNC_fallback_error {
z-index: 1000;
visibility: hidden;
}
#noVNC_fallback_error.noVNC_open {
visibility: visible;
}
#noVNC_fallback_error > div {
max-width: 90%;
padding: 15px;
transition: 0.5s ease-in-out;
transform: translateY(-50px);
opacity: 0;
text-align: center;
font-weight: bold;
color: #fff;
border-radius: 10px;
box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.5);
background: rgba(200,55,55,0.8);
}
#noVNC_fallback_error.noVNC_open > div {
transform: translateY(0);
opacity: 1;
}
#noVNC_fallback_errormsg {
font-weight: normal;
}
#noVNC_fallback_errormsg .noVNC_message {
display: inline-block;
text-align: left;
font-family: monospace;
white-space: pre-wrap;
}
#noVNC_fallback_error .noVNC_location {
font-style: italic;
font-size: 0.8em;
color: rgba(255, 255, 255, 0.8);
}
#noVNC_fallback_error .noVNC_stack {
max-height: 50vh;
padding: 10px;
margin: 10px;
font-size: 0.8em;
text-align: left;
font-family: monospace;
white-space: pre;
border: 1px solid rgba(0, 0, 0, 0.5);
background: rgba(0, 0, 0, 0.2);
overflow: auto;
}
/* ----------------------------------------
* Control Bar
* ----------------------------------------
*/
#noVNC_control_bar_anchor {
/* The anchor is needed to get z-stacking to work */
position: fixed;
z-index: 10;
transition: 0.5s ease-in-out;
/* Edge misrenders animations without this */
transform: translateX(0);
}
#noVNC_control_bar_anchor.noVNC_right {
left: auto;
right: 0;
}
:root.noVNC_connected #noVNC_control_bar_anchor.noVNC_idle {
/* reduce opacity of the control bar when idle */
opacity: 0.8;
}
#noVNC_control_bar {
position: relative;
left: calc(-100% + 15px);
right: auto;
transition: 0.5s ease-in-out;
}
#noVNC_control_bar.noVNC_open {
left: 0;
right: auto;
}
.noVNC_right #noVNC_control_bar {
left: auto;
right: calc(-100% + 15px);
}
.noVNC_right #noVNC_control_bar.noVNC_open {
left: auto;
right: 0;
}
#noVNC_control_bar .noVNC_scroll {
max-height: 90vh;
overflow-x: hidden;
overflow-y: auto;
}
/* Control bar content */
/* noVNC Touch Device only buttons */
:root:not(.noVNC_touch) #noVNC_keyboard_button {
display: none;
}
/* Control bar hint */
#noVNC_control_bar_hint {
position: fixed;
left: calc(100vw - 50px);
right: auto;
top: 50%;
transform: translateY(-50%) scale(0);
width: 100px;
height: 50%;
max-height: 600px;
visibility: hidden;
opacity: 0;
transition: 0.2s ease-in-out;
background: transparent;
box-shadow: 0 0 10px black, inset 0 0 10px 10px rgba(110, 132, 163, 0.8);
border-radius: 10px;
transition-delay: 0s;
}
#noVNC_control_bar_anchor.noVNC_right #noVNC_control_bar_hint{
left: auto;
right: calc(100vw - 50px);
}
#noVNC_control_bar_hint.noVNC_active {
visibility: visible;
opacity: 1;
transition-delay: 0.2s;
transform: translateY(-50%) scale(1);
}
/* ----------------------------------------
* Status Dialog
* ----------------------------------------
*/
#noVNC_status {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 100;
transform: translateY(-100%);
cursor: pointer;
transition: 0.5s ease-in-out;
visibility: hidden;
opacity: 0;
padding: 5px;
display: flex;
flex-direction: row;
justify-content: center;
align-content: center;
line-height: 25px;
word-wrap: break-word;
color: #fff;
border-bottom: 1px solid rgba(0, 0, 0, 0.9);
}
#noVNC_status.noVNC_open {
transform: translateY(0);
visibility: visible;
opacity: 1;
}
#noVNC_status::before {
content: "";
display: inline-block;
width: 25px;
height: 25px;
margin-right: 5px;
}
#noVNC_status.noVNC_status_normal {
background: rgba(128,128,128,0.9);
}
#noVNC_status.noVNC_status_normal::before {
content: url("../images/info.svg") " ";
}
#noVNC_status.noVNC_status_error {
background: rgba(200,55,55,0.9);
}
#noVNC_status.noVNC_status_error::before {
content: url("../images/error.svg") " ";
}
#noVNC_status.noVNC_status_warn {
/*background: rgba(180,180,30,0.9);*/
background: rgba(255,193,7,0.9);
}
#noVNC_status.noVNC_status_warn::before {
content: url("../images/warning.svg") " ";
}
/* ----------------------------------------
* Password Dialog
* ----------------------------------------
*/
#noVNC_credentials_dlg {
position: relative;
transform: translateY(-50px);
visibility: hidden;
opacity: 0;
transition: 0.5s ease-in-out;
}
#noVNC_credentials_dlg.noVNC_open {
transform: translateY(0);
visibility: visible;
opacity: 1;
}
.noVNC_hidden {
display: none;
}
/* ----------------------------------------
* Main Area
* ----------------------------------------
*/
/* Transition screen */
#noVNC_transition {
display: none;
position: fixed;
top: 0;
left: 0;
bottom: 0;
right: 0;
color: white;
background: rgba(0, 0, 0, 0.5);
z-index: 50;
/*display: flex;*/
align-items: center;
justify-content: center;
flex-direction: column;
}
:root.noVNC_loading #noVNC_transition,
:root.noVNC_connecting #noVNC_transition,
:root.noVNC_disconnecting #noVNC_transition,
#noVNC_transition_text {
font-size: 1.5em;
}
/* Main container */
#noVNC_container {
width: 100%;
height: 100%;
}
#noVNC_keyboardinput {
width: 1px;
height: 1px;
background-color: #fff;
color: #fff;
border: 0;
position: absolute;
left: -40px;
z-index: -1;
ime-mode: disabled;
}
/* ----------------------------------------
* Action Button
* ----------------------------------------
*/
.btn.noVNC_selected {
background: #E9ECEF;
border: 1px solid;
border-color: #CED4DA;
}
html.dark .btn.noVNC_selected {
background: #3B3B3B;
border: 1px solid;
border-color: #525151;
}
/* ----------------------------------------
* Accordion Button
* ----------------------------------------
*/
.custom-accordion-button {
display: flex;
cursor: pointer;
}
.custom-accordion-button::after {
content: "\276F";
margin-left: 0.5rem;
transition: transform 0.2s ease-in-out;
}
.custom-accordion-button:not(.collapsed)::after {
content: "\276F";
transform: rotate(90deg);
}
/* ----------------------------------------
* Control Bar Handle
* ----------------------------------------
*/
:root {
--control-bar-handle-color: #E9ECEF;
--control-bar-handle-border-color: #CED4DA;
--control-bar-handle-height: 50px;
--control-bar-handle-width: 15px;
--control-bar-handle-dot-size: 4px;
--control-bar-handle-dot-color: #6C757D;
}
.handle {
display: block;
position: relative;
width: var(--control-bar-handle-width);
height: var(--control-bar-handle-height);
background: var(--control-bar-handle-color);
border: 1px solid;
border-left: 0px none;
border-color: var(--control-bar-handle-border-color);
border-radius: 0px 5px 5px 0px;
cursor: pointer;
transform: translateY(35px); /* position the handle 35px from the top of the control bar */
/*width: calc(100% + 15px);*/
/* left: 100%;*/
/*box-shadow: 5px 5px 8px 0px rgba(0,0,0,0.15);*/
/*outline: 1px solid;*/
/* uncomment this when moving the whole handle:
transition: all 0.1s ease-in-out;*/
}
.noVNC_right .handle {
border: 1px solid;
border-right: 0px none;
border-color: var(--control-bar-handle-border-color);
border-radius: 5px 0px 0px 5px;
}
.handle:hover {
filter: brightness(0.95);
}
/* This create the main/middle dot */
.handle .dots {
position: absolute;
top: calc(50% - calc(var(--control-bar-handle-dot-size) / 2));
left: calc(50% - calc(var(--control-bar-handle-dot-size) / 2));
display: block;
width: var(--control-bar-handle-dot-size);
height: var(--control-bar-handle-dot-size);
border-radius: calc(var(--control-bar-handle-dot-size) / 2);
background-color: var(--control-bar-handle-dot-color);
/* not needed since the middle dot doesn't move
transition: all 0.1s ease-in-out;*/
}
/* This creates 2 additional dots: top and bottom. */
.handle .dots::before, .handle .dots::after {
content: "";
position: absolute;
width: var(--control-bar-handle-dot-size);
height: var(--control-bar-handle-dot-size);
border-radius: calc(var(--control-bar-handle-dot-size) / 2);
background-color: var(--control-bar-handle-dot-color);
transition: all 0.1s ease-in-out;
}
/* Move the bottom dot to its place */
.handle .dots::before {
transform: translateY(calc(var(--control-bar-handle-dot-size) * 2));
}
/* Move the top dot to its place*/
.handle .dots::after {
transform: translateY(calc(var(--control-bar-handle-dot-size) * -2));
}
/* Transform the bottom dot to a line and rotate it to form one side of an 'X' */
#noVNC_control_bar.noVNC_open .handle .dots::before {
width: var(--control-bar-handle-width);
/* Previous transform is cancelled so we are starting with a dot in the middle. */
transform: translateX(calc(var(--control-bar-handle-width) / -2 + calc(var(--control-bar-handle-dot-size) / 2))) rotate(-45deg);
}
/* Transform the top dot to a line and rotate it to form the other side of an 'X' */
#noVNC_control_bar.noVNC_open .handle .dots::after {
width: var(--control-bar-handle-width);
/* Previous transform is cancelled so we are starting with a dot in the middle. */
transform: translateX(calc(var(--control-bar-handle-width) / -2 + calc(var(--control-bar-handle-dot-size) / 2))) rotate(45deg);
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,186 @@
/*
* noVNC: HTML5 VNC client
* Copyright (C) 2019 The noVNC Authors
* Licensed under MPL 2.0 (see LICENSE.txt)
*
* See README.md for usage and integration instructions.
*/
import { initLogging as mainInitLogging } from '../core/util/logging.js';
// init log level reading the logging HTTP param
export function initLogging(level) {
"use strict";
if (typeof level !== "undefined") {
mainInitLogging(level);
} else {
const param = document.location.href.match(/logging=([A-Za-z0-9._-]*)/);
mainInitLogging(param || undefined);
}
}
// Read a query string variable
// A URL with a query parameter can look like this (But will most probably get logged on the http server):
// https://www.example.com?myqueryparam=myvalue
//
// For privacy (Using a hastag #, the parameters will not be sent to the server)
// the url can be requested in the following way:
// https://www.example.com#myqueryparam=myvalue&password=secreatvalue
//
// Even Mixing public and non public parameters will work:
// https://www.example.com?nonsecretparam=example.com#password=secreatvalue
export function getQueryVar(name, defVal) {
"use strict";
const re = new RegExp('.*[?&]' + name + '=([^&#]*)'),
match = ''.concat(document.location.href, window.location.hash).match(re);
if (typeof defVal === 'undefined') { defVal = null; }
if (match) {
return decodeURIComponent(match[1]);
}
return defVal;
}
// Read a hash fragment variable
export function getHashVar(name, defVal) {
"use strict";
const re = new RegExp('.*[&#]' + name + '=([^&]*)'),
match = document.location.hash.match(re);
if (typeof defVal === 'undefined') { defVal = null; }
if (match) {
return decodeURIComponent(match[1]);
}
return defVal;
}
// Read a variable from the fragment or the query string
// Fragment takes precedence
export function getConfigVar(name, defVal) {
"use strict";
const val = getHashVar(name);
if (val === null) {
return getQueryVar(name, defVal);
}
return val;
}
/*
* Cookie handling. Dervied from: http://www.quirksmode.org/js/cookies.html
*/
// No days means only for this browser session
export function createCookie(name, value, days) {
"use strict";
let date, expires;
if (days) {
date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toGMTString();
} else {
expires = "";
}
let secure;
if (document.location.protocol === "https:") {
secure = "; secure";
} else {
secure = "";
}
document.cookie = name + "=" + value + expires + "; path=/" + secure;
}
export function readCookie(name, defaultValue) {
"use strict";
const nameEQ = name + "=";
const ca = document.cookie.split(';');
for (let i = 0; i < ca.length; i += 1) {
let c = ca[i];
while (c.charAt(0) === ' ') {
c = c.substring(1, c.length);
}
if (c.indexOf(nameEQ) === 0) {
return c.substring(nameEQ.length, c.length);
}
}
return (typeof defaultValue !== 'undefined') ? defaultValue : null;
}
export function eraseCookie(name) {
"use strict";
createCookie(name, "", -1);
}
/*
* Setting handling.
*/
let settings = {};
export function initSettings() {
if (!window.chrome || !window.chrome.storage) {
settings = {};
return Promise.resolve();
}
return new Promise(resolve => window.chrome.storage.sync.get(resolve))
.then((cfg) => { settings = cfg; });
}
// Update the settings cache, but do not write to permanent storage
export function setSetting(name, value) {
settings[name] = value;
}
// No days means only for this browser session
export function writeSetting(name, value) {
"use strict";
if (settings[name] === value) return;
settings[name] = value;
if (window.chrome && window.chrome.storage) {
window.chrome.storage.sync.set(settings);
} else {
localStorage.setItem(name, value);
}
}
export function readSetting(name, defaultValue) {
"use strict";
let value;
if ((name in settings) || (window.chrome && window.chrome.storage)) {
value = settings[name];
} else {
value = localStorage.getItem(name);
settings[name] = value;
}
if (typeof value === "undefined") {
value = null;
}
if (value === null && typeof defaultValue !== "undefined") {
return defaultValue;
}
return value;
}
export function eraseSetting(name) {
"use strict";
// Deleting here means that next time the setting is read when using local
// storage, it will be pulled from local storage again.
// If the setting in local storage is changed (e.g. in another tab)
// between this delete and the next read, it could lead to an unexpected
// value change.
delete settings[name];
if (window.chrome && window.chrome.storage) {
window.chrome.storage.sync.remove(name);
} else {
localStorage.removeItem(name);
}
}

View File

@@ -0,0 +1,182 @@
<!DOCTYPE html>
<html lang="en" class="noVNC_loading">
<head>
<!--
noVNC example: simple example using default UI
Copyright (C) 2019 The noVNC Authors
noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
-->
<title></title>
<meta charset="utf-8">
<!-- BEGIN Favicons -->
<!-- END Favicons -->
<!-- Always force latest IE rendering engine -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Apple iOS Safari settings -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<!-- Stylesheets -->
<link rel="stylesheet" href="app/styles/font-awesome.min.css?v=UNIQUE_VERSION">
<link rel="stylesheet" href="app/styles/bootstrap-nightshade.min.css?v=UNIQUE_VERSION">
<link rel="stylesheet" href="app/styles/base.css?v=UNIQUE_VERSION">
<!-- Images that will later appear via CSS -->
<link rel="preload" as="image" href="app/images/info.svg">
<link rel="preload" as="image" href="app/images/error.svg">
<link rel="preload" as="image" href="app/images/warning.svg">
<!-- Scripts -->
<script src="app/bootstrap.bundle.min.js?v=UNIQUE_VERSION"></script>
<script src="app/error-handler.js?v=UNIQUE_VERSION"></script>
<script type="module" crossorigin="anonymous" src="app/ui.js?v=UNIQUE_VERSION"></script>
</head>
<body>
<!-- Fatal error message box -->
<div id="noVNC_fallback_error" class="noVNC_center">
<div>
<div>Unexpected error encountered:</div>
<br>
<div id="noVNC_fallback_errormsg"></div>
</div>
</div>
<!-- Control Bar -->
<div id="noVNC_control_bar_anchor" class="noVNC_vcenter noVNC_hidden">
<div id="noVNC_control_bar" class="d-flex flex-row">
<!-- Control bar content. -->
<div class="card noVNC_scroll" style="width: 21rem; font-size: 14px;">
<!-- Control bar header -->
<div class="card-header d-flex align-items-center">
<img class="pe-2" style="height: 25px;" src="app/images/icons/master_icon.png?v=UNIQUE_VERSION" id="noVNC_app_logo">
<h5 class="m-0" name="noVNC_app_name">DockerApp</h5>
<div class="ms-auto"><!--<i class="fa fa-unlock-alt fs-4"></i>--></div>
</div>
<!-- Control bar body -->
<ul class="list-group list-group-flush">
<!-- Action icons -->
<li class="list-group-item" id="noVNC_action_icons_section">
<div class="d-flex justify-content-around align-items-center">
<a class="btn shadow-none p-0" href="#" title="Show Keyboard" id="noVNC_keyboard_button"><i class="fa fa-keyboard-o fa-fw fs-4"></i></a>
<a class="btn shadow-none p-0 noVNC_hidden" href="#" title="Fullscreen" id="noVNC_fullscreen_button"><i class="fa fa-arrows-alt fa-fw fs-4"></i></a>
<a class="btn shadow-none p-0 noVNC_hidden" href="#" title="Move/Drag Viewport" id="noVNC_view_drag_button"><i class="fa fa-hand-rock-o fa-fw fs-4"></i></a>
</div>
</li>
<!-- Clipboard -->
<li class="list-group-item">
<!-- <label for="noVNC_clipboard_text" class="custom-accordion-button text-nowrap" data-bs-toggle="collapse" data-bs-target="#clipboardCollapse">Clipboard</label>-->
<label class="custom-accordion-button text-nowrap" data-bs-toggle="collapse" data-bs-target="#clipboardCollapse">Clipboard</label>
<div class="input-group input-group-sm collapse show" id="clipboardCollapse">
<textarea class="form-control" wrap="off" rows="3" id="noVNC_clipboard_text"></textarea>
<button class="btn btn-outline-secondary" type="button" id="noVNC_clipboard_clear_button">Clear</button>
</div>
</li>
<!-- Settings -->
<li class="list-group-item">
<label class="custom-accordion-button text-nowrap" data-bs-toggle="collapse" data-bs-target="#settingsCollapse">Settings</label>
<div class="collapse show" id="settingsCollapse">
<!-- Clip to window -->
<div class="form-check form-switch mb-2">
<input class="form-check-input" type="checkbox" role="switch" id="noVNC_setting_view_clip">
<label class="form-check-label text-nowrap" for="noVNC_setting_view_clip">Clip to Window</label>
</div>
<!-- Scaling mode -->
<div class="input-group input-group-sm mb-2">
<label class="input-group-text" for="noVNC_setting_resize">Scaling Mode</label>
<select class="form-select" id="noVNC_setting_resize">
<option value="off">None</option>
<option value="scale">Local Scaling</option>
<option value="remote">Remote Resizing</option>
</select>
</div>
<!-- Quality -->
<div>
<label for="noVNC_setting_quality" class="text-nowrap">Quality</label>
<input type="range" min="0" max="9" value="6" class="form-range" id="noVNC_setting_quality">
</div>
<!-- Compression level -->
<div class="mb-1">
<label for="noVNC_setting_compression" class="text-nowrap">Compression Level</label>
<input type="range" min="0" max="9" value="2" class="form-range" id="noVNC_setting_compression">
</div>
<!-- Logging -->
<div class="input-group input-group-sm">
<label class="input-group-text" for="noVNC_setting_logging">Logging</label>
<select class="form-select" id="noVNC_setting_logging">
<option value="error">Error</option>
<option value="warn">Warning</option>
<option value="info">Info</option>
<option value="debug">Debug</option>
</select>
</div>
</div>
</li>
</ul>
<!-- Control bar footer -->
<div id="noVNC_version_footer" class="card-footer noVNC_hidden">
<div id="noVNC_version_app" class="noVNC_hidden"><small class="text-muted text-nowrap">Application vX.Y.Z</small></div>
<div id="noVNC_version_docker_image" class="noVNC_hidden"><small class="text-muted text-nowrap">Docker Image vX.Y.Z</small></div>
</div>
</div>
<!-- Control bar handle -->
<div id="noVNC_control_bar_handle" class="handle">
<div class="dots"></div>
</div>
</div>
<!-- Control bar hint -->
<div id="noVNC_control_bar_hint"></div>
</div> <!-- End of Control Bar -->
<!-- Status Dialog -->
<div id="noVNC_status"></div>
<!-- Password Dialog -->
<div class="noVNC_center noVNC_connect_layer">
<div id="noVNC_credentials_dlg">
<div class="card">
<div class="card-header" name="noVNC_app_name">DockerApp</div>
<div class="card-body">
<h5 class="card-title">Credentials needed</h5>
<p class="card-text">Please enter the credentials to connect.</p>
<form>
<div id="noVNC_username_block" mclass="mb-3">
<input type="text" class="form-control" placeholder="Username" id="noVNC_username_input">
</div>
<div id="noVNC_password_block" class="mb-3">
<input type="password" class="form-control" placeholder="Password" id="noVNC_password_input">
</div>
<button type="submit" id="noVNC_credentials_button" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
</div>
</div>
</div>
<!-- Transition Screens -->
<div id="noVNC_transition">
<div id="noVNC_transition_text"></div>
<div class="noVNC_spinner"></div>
</div>
<!-- This is where the RFB elements will attach -->
<div id="noVNC_container">
<!-- Note that Google Chrome on Android doesn't respect any of these,
html attributes which attempt to disable text suggestions on the
on-screen keyboard. Let's hope Chrome implements the ime-mode
style for example -->
<textarea id="noVNC_keyboardinput" autocapitalize="off"
autocomplete="off" spellcheck="false" tabindex="-1"></textarea>
</div>
</body>
</html>

View File

@@ -0,0 +1 @@
/tmp/.web_data.json

View File

@@ -0,0 +1,135 @@
#!/bin/sh
#
# Helper script that builds the TigerVNC server as a static binary.
#
# NOTE: This script is expected to be run under Alpine Linux.
#
set -e # Exit immediately if a command exits with a non-zero status.
set -u # Treat unset variables as an error.
# Define software versions.
NGINX_VERSION=1.20.1
NGINXWEBSOCKIFYMOD_VERSION=0.0.3
# Define software download URLs.
NGINX_URL=http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz
NGINXWEBSOCKIFYMOD_URL=https://github.com/tg123/websockify-nginx-module/archive/v${NGINXWEBSOCKIFYMOD_VERSION}.tar.gz
function log {
echo ">>> $*"
}
#
# Install required packages.
#
log "Installing required Alpine packages..."
apk --no-cache add \
build-base \
curl \
clang \
xx-apk --no-cache --no-scripts add \
gcc \
musl-dev \
linux-headers \
openssl-dev \
openssl-libs-static \
pcre-dev \
mkdir /tmp/nginx
log "Downloading Nginx..."
curl -# -L ${NGINX_URL} | tar -xz --strip 1 -C /tmp/nginx
log "Downloading WebSockify Nginx module..."
mkdir /tmp/websockify-nginx-module
curl -# -L ${NGINXWEBSOCKIFYMOD_URL} | tar xz --strip 1 -C /tmp/websockify-nginx-module
# See the Yocto Nginx recipe: https://github.com/openembedded/meta-openembedded/tree/master/meta-webserver/recipes-httpd/nginx
echo "Patching Nginx for cross-compile support..."
curl -# -L https://github.com/openembedded/meta-openembedded/raw/master/meta-webserver/recipes-httpd/nginx/files/nginx-cross.patch | patch -p1 -d /tmp/nginx
curl -# -L https://github.com/openembedded/meta-openembedded/raw/master/meta-webserver/recipes-httpd/nginx/files/0001-Allow-the-overriding-of-the-endianness-via-the-confi.patch | patch -p1 -d /tmp/nginx
case "$(xx-info arch)" in
x86_64|aarch64) PTRSIZE=8 ;;
*) PTRSIZE=4 ;;
esac
log "Configuring Nginx..."
(
cd /tmp/nginx && ./configure \
--crossbuild=Linux:$(xx-info arch) \
--with-cc="xx-clang" \
--with-cc-opt="-Os -fomit-frame-pointer -Wno-sign-compare" \
--with-ld-opt="-Wl,--as-needed -static -Wl,--strip-all" \
--prefix=/var/lib/nginx \
--sbin-path=/sbin/nginx \
--modules-path=/usr/lib/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/run/nginx/nginx.lock \
\
--with-int=4 \
--with-long=${PTRSIZE} \
--with-long-long=8 \
--with-ptr-size=${PTRSIZE} \
--with-sig-atomic-t=${PTRSIZE} \
--with-size-t=${PTRSIZE} \
--with-off-t=8 \
--with-time-t=${PTRSIZE} \
--with-sys-nerr=132 \
\
--http-client-body-temp-path=/var/tmp/nginx/client_body \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
\
--user=app \
--group=app \
\
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-pcre \
--with-pcre-jit \
\
--without-http_charset_module \
--without-http_gzip_module \
--without-http_ssi_module \
--without-http_userid_module \
--without-http_access_module \
--without-http_auth_basic_module \
--without-http_mirror_module \
--without-http_autoindex_module \
--without-http_geo_module \
--without-http_split_clients_module \
--without-http_referer_module \
--without-http_rewrite_module \
--without-http_fastcgi_module \
--without-http_uwsgi_module \
--without-http_scgi_module \
--without-http_grpc_module \
--without-http_memcached_module \
--without-http_limit_conn_module \
--without-http_limit_req_module \
--without-http_empty_gif_module \
--without-http_browser_module \
--without-http_upstream_hash_module \
--without-http_upstream_ip_hash_module \
--without-http_upstream_least_conn_module \
--without-http_upstream_keepalive_module \
--without-http_upstream_zone_module \
\
--with-stream \
--with-stream_ssl_module \
\
--add-module=/tmp/websockify-nginx-module \
)
log "Compiling Nginx..."
make -C /tmp/nginx -j$(nproc) && \
log "Installing Nginx..."
make DESTDIR=/tmp/nginx-install -C /tmp/nginx install
find /tmp/nginx-install/etc/nginx ! -name "mime.types" -type f -exec rm -v {} ';'
rm -r \
/tmp/nginx-install/var