mirror of
https://github.com/AuxXxilium/arv-v-dsm.git
synced 2024-11-23 15:00:57 +07:00
feat: Display progress via web (#584)
This commit is contained in:
parent
fc92b66ff4
commit
2c7cea042f
@ -24,7 +24,7 @@ RUN if [ "$TARGETPLATFORM" != "linux/amd64" ]; then extra="qemu-user"; fi \
|
|||||||
wget \
|
wget \
|
||||||
fdisk \
|
fdisk \
|
||||||
unzip \
|
unzip \
|
||||||
socat \
|
nginx \
|
||||||
procps \
|
procps \
|
||||||
xz-utils \
|
xz-utils \
|
||||||
iptables \
|
iptables \
|
||||||
@ -39,11 +39,16 @@ RUN if [ "$TARGETPLATFORM" != "linux/amd64" ]; then extra="qemu-user"; fi \
|
|||||||
qemu-system-x86 \
|
qemu-system-x86 \
|
||||||
"$extra" \
|
"$extra" \
|
||||||
&& apt-get clean \
|
&& apt-get clean \
|
||||||
|
&& unlink /etc/nginx/sites-enabled/default \
|
||||||
|
&& sed -i 's/^worker_processes.*/worker_processes 1;/' /etc/nginx/nginx.conf \
|
||||||
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||||
|
|
||||||
COPY ./src /run/
|
COPY ./src /run/
|
||||||
|
COPY ./web /var/www/
|
||||||
COPY --from=builder /qemu-host.bin /run/host.bin
|
COPY --from=builder /qemu-host.bin /run/host.bin
|
||||||
|
|
||||||
RUN chmod +x /run/*.sh && chmod +x /run/*.bin
|
RUN chmod +x /run/*.sh && chmod +x /run/*.bin
|
||||||
|
RUN mv /var/www/nginx.conf /etc/nginx/sites-enabled/web.conf
|
||||||
|
|
||||||
VOLUME /storage
|
VOLUME /storage
|
||||||
EXPOSE 22 139 445 5000
|
EXPOSE 22 139 445 5000
|
||||||
|
25
src/disk.sh
25
src/disk.sh
@ -61,8 +61,8 @@ getSize() {
|
|||||||
local DISK_FILE=$1
|
local DISK_FILE=$1
|
||||||
local DISK_EXT DISK_FMT
|
local DISK_EXT DISK_FMT
|
||||||
|
|
||||||
DISK_EXT="$(echo "${DISK_FILE//*./}" | sed 's/^.*\.//')"
|
DISK_EXT=$(echo "${DISK_FILE//*./}" | sed 's/^.*\.//')
|
||||||
DISK_FMT="$(ext2fmt "$DISK_EXT")"
|
DISK_FMT=$(ext2fmt "$DISK_EXT")
|
||||||
|
|
||||||
case "${DISK_FMT,,}" in
|
case "${DISK_FMT,,}" in
|
||||||
raw)
|
raw)
|
||||||
@ -112,7 +112,9 @@ createDisk() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
info "Creating a $DISK_TYPE $DISK_DESC image in $DISK_FMT format with a size of $DISK_SPACE..."
|
MSG="Creating a $DISK_TYPE $DISK_DESC image in $DISK_FMT format with a size of $DISK_SPACE..."
|
||||||
|
info "$MSG" && html "$MSG"
|
||||||
|
|
||||||
local FAIL="Could not create a $DISK_TYPE $DISK_FMT $DISK_DESC image of $DISK_SPACE ($DISK_FILE)"
|
local FAIL="Could not create a $DISK_TYPE $DISK_FMT $DISK_DESC image of $DISK_SPACE ($DISK_FILE)"
|
||||||
|
|
||||||
case "${DISK_FMT,,}" in
|
case "${DISK_FMT,,}" in
|
||||||
@ -195,7 +197,9 @@ resizeDisk() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
local GB=$(( (CUR_SIZE + 1073741823)/1073741824 ))
|
local GB=$(( (CUR_SIZE + 1073741823)/1073741824 ))
|
||||||
info "Resizing $DISK_DESC from ${GB}G to $DISK_SPACE..."
|
MSG="Resizing $DISK_DESC from ${GB}G to $DISK_SPACE..."
|
||||||
|
info "$MSG" && html "$MSG"
|
||||||
|
|
||||||
local FAIL="Could not resize the $DISK_TYPE $DISK_FMT $DISK_DESC image from ${GB}G to $DISK_SPACE ($DISK_FILE)"
|
local FAIL="Could not resize the $DISK_TYPE $DISK_FMT $DISK_DESC image from ${GB}G to $DISK_SPACE ($DISK_FILE)"
|
||||||
|
|
||||||
case "${DISK_FMT,,}" in
|
case "${DISK_FMT,,}" in
|
||||||
@ -262,7 +266,8 @@ convertDisk() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
info "Converting $DISK_DESC to $DST_FMT, please wait until completed..."
|
MSG="Converting $DISK_DESC to $DST_FMT, please wait until completed..."
|
||||||
|
info "$MSG" && html "$MSG"
|
||||||
|
|
||||||
local CONV_FLAGS="-p"
|
local CONV_FLAGS="-p"
|
||||||
local DISK_PARAM="$DISK_ALLOC"
|
local DISK_PARAM="$DISK_ALLOC"
|
||||||
@ -301,7 +306,8 @@ convertDisk() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
info "Conversion of $DISK_DESC to $DST_FMT completed succesfully!"
|
MSG="Conversion of $DISK_DESC to $DST_FMT completed succesfully!"
|
||||||
|
info "$MSG" && html "$MSG"
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@ -372,7 +378,7 @@ addDisk () {
|
|||||||
else
|
else
|
||||||
PREV_FMT="qcow2"
|
PREV_FMT="qcow2"
|
||||||
fi
|
fi
|
||||||
PREV_EXT="$(fmt2ext "$PREV_FMT")"
|
PREV_EXT=$(fmt2ext "$PREV_FMT")
|
||||||
|
|
||||||
if [ -f "$DISK_BASE.$PREV_EXT" ] ; then
|
if [ -f "$DISK_BASE.$PREV_EXT" ] ; then
|
||||||
convertDisk "$DISK_BASE.$PREV_EXT" "$PREV_FMT" "$DISK_FILE" "$DISK_FMT" "$DISK_BASE" "$DISK_DESC" "$FS" || exit $?
|
convertDisk "$DISK_BASE.$PREV_EXT" "$PREV_FMT" "$DISK_FILE" "$DISK_FMT" "$DISK_BASE" "$DISK_DESC" "$FS" || exit $?
|
||||||
@ -420,7 +426,9 @@ addDevice () {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
DISK_EXT="$(fmt2ext "$DISK_FMT")" || exit $?
|
html "Initializing disks..."
|
||||||
|
|
||||||
|
DISK_EXT=$(fmt2ext "$DISK_FMT")
|
||||||
|
|
||||||
if [ -z "$ALLOCATE" ]; then
|
if [ -z "$ALLOCATE" ]; then
|
||||||
if [[ "${DISK_FMT,,}" == "raw" ]]; then
|
if [[ "${DISK_FMT,,}" == "raw" ]]; then
|
||||||
@ -505,4 +513,5 @@ else
|
|||||||
addDisk "userdata4" "$DISK4_FILE" "$DISK_EXT" "disk4" "$DISK4_SIZE" "6" "0xf" "$DISK_FMT" || exit $?
|
addDisk "userdata4" "$DISK4_FILE" "$DISK_EXT" "disk4" "$DISK4_SIZE" "6" "0xf" "$DISK_FMT" || exit $?
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
html "Initialized disks successfully..."
|
||||||
return 0
|
return 0
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
|
|
||||||
echo "❯ Starting Virtual DSM for Docker v$(</run/version)..."
|
APP="Virtual DSM"
|
||||||
echo "❯ For support visit https://github.com/vdsm/virtual-dsm"
|
SUPPORT="https://github.com/vdsm/virtual-dsm"
|
||||||
echo
|
|
||||||
|
|
||||||
cd /run
|
cd /run
|
||||||
|
|
||||||
|
@ -23,8 +23,7 @@ if [[ -f "$STORAGE/$BASE.boot.img" ]] && [[ -f "$STORAGE/$BASE.system.img" ]]; t
|
|||||||
return 0 # Previous installation found
|
return 0 # Previous installation found
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Display wait message
|
html "Please wait while Virtual DSM is being installed..."
|
||||||
/run/server.sh 5000 install &
|
|
||||||
|
|
||||||
DL=""
|
DL=""
|
||||||
DL_CHINA="https://cndl.synology.cn/download/DSM"
|
DL_CHINA="https://cndl.synology.cn/download/DSM"
|
||||||
@ -105,7 +104,8 @@ RDC="$STORAGE/dsm.rd"
|
|||||||
|
|
||||||
if [ ! -f "$RDC" ]; then
|
if [ ! -f "$RDC" ]; then
|
||||||
|
|
||||||
info "Install: Downloading installer..."
|
MSG="Downloading installer..."
|
||||||
|
info "Install: $MSG" && html "$MSG"
|
||||||
|
|
||||||
RD="$TMP/rd.gz"
|
RD="$TMP/rd.gz"
|
||||||
POS="65627648-71021835"
|
POS="65627648-71021835"
|
||||||
@ -174,7 +174,8 @@ fi
|
|||||||
|
|
||||||
rm -rf "$TMP" && mkdir -p "$TMP"
|
rm -rf "$TMP" && mkdir -p "$TMP"
|
||||||
|
|
||||||
info "Install: Downloading $BASE.pat..."
|
MSG="Downloading $BASE.pat..."
|
||||||
|
info "Install: $MSG" && html "$MSG"
|
||||||
|
|
||||||
PAT="/$BASE.pat"
|
PAT="/$BASE.pat"
|
||||||
rm -f "$PAT"
|
rm -f "$PAT"
|
||||||
@ -198,7 +199,8 @@ if ((SIZE<250000000)); then
|
|||||||
error "The specified PAT file is probably an update pack as it's too small." && exit 62
|
error "The specified PAT file is probably an update pack as it's too small." && exit 62
|
||||||
fi
|
fi
|
||||||
|
|
||||||
info "Install: Extracting downloaded image..."
|
MSG="Extracting downloaded image..."
|
||||||
|
info "Install: $MSG" && html "$MSG"
|
||||||
|
|
||||||
if { tar tf "$PAT"; } >/dev/null 2>&1; then
|
if { tar tf "$PAT"; } >/dev/null 2>&1; then
|
||||||
|
|
||||||
@ -221,7 +223,9 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
rm -rf /run/extract
|
rm -rf /run/extract
|
||||||
info "Install: Preparing system partition..."
|
|
||||||
|
MSG="Preparing system partition..."
|
||||||
|
info "Install: $MSG" && html "$MSG"
|
||||||
|
|
||||||
BOOT=$(find "$TMP" -name "*.bin.zip")
|
BOOT=$(find "$TMP" -name "*.bin.zip")
|
||||||
[ ! -f "$BOOT" ] && error "The PAT file contains no boot image." && exit 67
|
[ ! -f "$BOOT" ] && error "The PAT file contains no boot image." && exit 67
|
||||||
@ -277,7 +281,8 @@ sfdisk -q "$SYSTEM" < "$PART"
|
|||||||
MOUNT="$TMP/system"
|
MOUNT="$TMP/system"
|
||||||
rm -rf "$MOUNT" && mkdir -p "$MOUNT"
|
rm -rf "$MOUNT" && mkdir -p "$MOUNT"
|
||||||
|
|
||||||
info "Install: Extracting system partition..."
|
MSG="Extracting system partition..."
|
||||||
|
info "Install: $MSG" && html "$MSG"
|
||||||
|
|
||||||
HDA="$TMP/hda1"
|
HDA="$TMP/hda1"
|
||||||
IDB="$TMP/indexdb"
|
IDB="$TMP/indexdb"
|
||||||
@ -301,12 +306,13 @@ fi
|
|||||||
LABEL="1.44.1-42218"
|
LABEL="1.44.1-42218"
|
||||||
OFFSET="1048576" # 2048 * 512
|
OFFSET="1048576" # 2048 * 512
|
||||||
NUMBLOCKS="622560" # (4980480 * 512) / 4096
|
NUMBLOCKS="622560" # (4980480 * 512) / 4096
|
||||||
|
MSG="Installing system partition..."
|
||||||
|
|
||||||
if [[ "$ROOT" != [Nn]* ]]; then
|
if [[ "$ROOT" != [Nn]* ]]; then
|
||||||
|
|
||||||
tar xpfJ "$HDA.txz" --absolute-names --skip-old-files -C "$MOUNT/"
|
tar xpfJ "$HDA.txz" --absolute-names --skip-old-files -C "$MOUNT/"
|
||||||
|
|
||||||
info "Install: Installing system partition..."
|
info "Install: $MSG" && html "$MSG"
|
||||||
|
|
||||||
mke2fs -q -t ext4 -b 4096 -d "$MOUNT/" -L "$LABEL" -F -E "offset=$OFFSET" "$SYSTEM" "$NUMBLOCKS"
|
mke2fs -q -t ext4 -b 4096 -d "$MOUNT/" -L "$LABEL" -F -E "offset=$OFFSET" "$SYSTEM" "$NUMBLOCKS"
|
||||||
|
|
||||||
@ -314,7 +320,7 @@ else
|
|||||||
|
|
||||||
fakeroot -- bash -c "set -Eeu;\
|
fakeroot -- bash -c "set -Eeu;\
|
||||||
tar xpfJ $HDA.txz --absolute-names --skip-old-files -C $MOUNT/;\
|
tar xpfJ $HDA.txz --absolute-names --skip-old-files -C $MOUNT/;\
|
||||||
printf '%b%s%b' '\E[1;34m❯ \E[1;36m' 'Install: Installing system partition...' '\E[0m\n';\
|
printf '%b%s%b' '\E[1;34m❯ \E[1;36m' 'Install: $MSG' '\E[0m\n';\
|
||||||
mke2fs -q -t ext4 -b 4096 -d $MOUNT/ -L $LABEL -F -E offset=$OFFSET $SYSTEM $NUMBLOCKS"
|
mke2fs -q -t ext4 -b 4096 -d $MOUNT/ -L $LABEL -F -E offset=$OFFSET $SYSTEM $NUMBLOCKS"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
@ -334,4 +340,5 @@ rm -rf "$TMP"
|
|||||||
{ set +x; } 2>/dev/null
|
{ set +x; } 2>/dev/null
|
||||||
[[ "$DEBUG" == [Yy1]* ]] && echo
|
[[ "$DEBUG" == [Yy1]* ]] && echo
|
||||||
|
|
||||||
|
html "Installation finished successfully..."
|
||||||
return 0
|
return 0
|
||||||
|
@ -173,14 +173,17 @@ closeNetwork() {
|
|||||||
|
|
||||||
if [[ "$DHCP" == [Yy1]* ]]; then
|
if [[ "$DHCP" == [Yy1]* ]]; then
|
||||||
|
|
||||||
fKill "server.sh"
|
# Shutdown nginx
|
||||||
|
nginx -s stop 2> /dev/null
|
||||||
|
fWait "nginx"
|
||||||
|
|
||||||
ip link set "$VM_NET_TAP" down || true
|
ip link set "$VM_NET_TAP" down || true
|
||||||
ip link delete "$VM_NET_TAP" || true
|
ip link delete "$VM_NET_TAP" || true
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
fKill "dnsmasq"
|
local pid="/var/run/dnsmasq.pid"
|
||||||
|
[ -f "$pid" ] && pKill "$(<"$pid")"
|
||||||
|
|
||||||
ip link set "$VM_NET_TAP" down promisc off || true
|
ip link set "$VM_NET_TAP" down promisc off || true
|
||||||
ip link delete "$VM_NET_TAP" || true
|
ip link delete "$VM_NET_TAP" || true
|
||||||
@ -227,8 +230,6 @@ getInfo() {
|
|||||||
# Configure Network
|
# Configure Network
|
||||||
# ######################################
|
# ######################################
|
||||||
|
|
||||||
fKill "server.sh"
|
|
||||||
|
|
||||||
if [ ! -c /dev/vhost-net ]; then
|
if [ ! -c /dev/vhost-net ]; then
|
||||||
if mknod /dev/vhost-net c 10 238; then
|
if mknod /dev/vhost-net c 10 238; then
|
||||||
chmod 660 /dev/vhost-net
|
chmod 660 /dev/vhost-net
|
||||||
@ -236,6 +237,7 @@ if [ ! -c /dev/vhost-net ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
getInfo
|
getInfo
|
||||||
|
html "Initializing network..."
|
||||||
|
|
||||||
if [[ "$DEBUG" == [Yy1]* ]]; then
|
if [[ "$DEBUG" == [Yy1]* ]]; then
|
||||||
info "Container IP is $IP with gateway $GATEWAY on interface $VM_NET_DEV" && echo
|
info "Container IP is $IP with gateway $GATEWAY on interface $VM_NET_DEV" && echo
|
||||||
@ -252,11 +254,15 @@ if [[ "$DHCP" == [Yy1]* ]]; then
|
|||||||
# Configuration for DHCP IP
|
# Configuration for DHCP IP
|
||||||
configureDHCP
|
configureDHCP
|
||||||
|
|
||||||
# Display IP on port 80 and 5000
|
MSG="Please wait while discovering IP..."
|
||||||
/run/server.sh 5000 /run/ip.sh &
|
html "$MSG" "2000"
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
|
# Shutdown nginx
|
||||||
|
nginx -s stop 2> /dev/null
|
||||||
|
fWait "nginx"
|
||||||
|
|
||||||
# Configuration for static IP
|
# Configuration for static IP
|
||||||
configureNAT
|
configureNAT
|
||||||
|
|
||||||
|
14
src/print.sh
14
src/print.sh
@ -7,8 +7,10 @@ info () { printf "%b%s%b" "\E[1;34m❯ \E[1;36m" "$1" "\E[0m\n" >&2; }
|
|||||||
error () { printf "%b%s%b" "\E[1;31m❯ " "ERROR: $1" "\E[0m\n" >&2; }
|
error () { printf "%b%s%b" "\E[1;31m❯ " "ERROR: $1" "\E[0m\n" >&2; }
|
||||||
|
|
||||||
file="/run/shm/dsm.url"
|
file="/run/shm/dsm.url"
|
||||||
|
page="/run/shm/index.html"
|
||||||
address="/run/shm/qemu.ip"
|
address="/run/shm/qemu.ip"
|
||||||
shutdown="/run/shm/qemu.end"
|
shutdown="/run/shm/qemu.end"
|
||||||
|
template="/var/www/index.html"
|
||||||
url="http://127.0.0.1:2210/read?command=10"
|
url="http://127.0.0.1:2210/read?command=10"
|
||||||
|
|
||||||
resp_err="Guest returned an invalid response:"
|
resp_err="Guest returned an invalid response:"
|
||||||
@ -66,6 +68,18 @@ location=$(<"$file")
|
|||||||
if [[ "$location" != "20.20"* ]]; then
|
if [[ "$location" != "20.20"* ]]; then
|
||||||
|
|
||||||
msg="http://$location"
|
msg="http://$location"
|
||||||
|
title="<title>Virtual DSM</title>"
|
||||||
|
body="The location of DSM is <a href='http://$location'>http://$location</a>"
|
||||||
|
script="<script>setTimeout(function(){ window.location.assign('http://$location'); }, 3000);</script>"
|
||||||
|
|
||||||
|
HTML=$(<"$template")
|
||||||
|
HTML="${HTML/\[1\]/$title}"
|
||||||
|
HTML="${HTML/\[2\]/$script}"
|
||||||
|
HTML="${HTML/\[3\]/$body}"
|
||||||
|
HTML="${HTML/\[4\]/}"
|
||||||
|
HTML="${HTML/\[5\]/}"
|
||||||
|
|
||||||
|
echo "$HTML" > "$page"
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
|
80
src/reset.sh
80
src/reset.sh
@ -10,6 +10,10 @@ trap 'error "Status $? while: $BASH_COMMAND (line $LINENO/$BASH_LINENO)"' ERR
|
|||||||
[ ! -f "/run/entry.sh" ] && error "Script must run inside Docker container!" && exit 11
|
[ ! -f "/run/entry.sh" ] && error "Script must run inside Docker container!" && exit 11
|
||||||
[ "$(id -u)" -ne "0" ] && error "Script must be executed with root privileges." && exit 12
|
[ "$(id -u)" -ne "0" ] && error "Script must be executed with root privileges." && exit 12
|
||||||
|
|
||||||
|
echo "❯ Starting $APP for Docker v$(</run/version)..."
|
||||||
|
echo "❯ For support visit $SUPPORT"
|
||||||
|
echo
|
||||||
|
|
||||||
# Docker environment variables
|
# Docker environment variables
|
||||||
|
|
||||||
: "${TZ:=""}" # System local timezone
|
: "${TZ:=""}" # System local timezone
|
||||||
@ -24,6 +28,12 @@ trap 'error "Status $? while: $BASH_COMMAND (line $LINENO/$BASH_LINENO)"' ERR
|
|||||||
|
|
||||||
# Helper variables
|
# Helper variables
|
||||||
|
|
||||||
|
STORAGE="/storage"
|
||||||
|
PAGE="/run/shm/index.html"
|
||||||
|
TEMPLATE="/var/www/index.html"
|
||||||
|
FOOTER1="$APP for Docker v$(</run/version)"
|
||||||
|
FOOTER2="<a href='$SUPPORT'>$SUPPORT</a>"
|
||||||
|
|
||||||
KERNEL=$(uname -r | cut -b 1)
|
KERNEL=$(uname -r | cut -b 1)
|
||||||
MINOR=$(uname -r | cut -d '.' -f2)
|
MINOR=$(uname -r | cut -d '.' -f2)
|
||||||
ARCH=$(dpkg --print-architecture)
|
ARCH=$(dpkg --print-architecture)
|
||||||
@ -31,7 +41,6 @@ VERS=$(qemu-system-x86_64 --version | head -n 1 | cut -d '(' -f 1)
|
|||||||
|
|
||||||
# Check folder
|
# Check folder
|
||||||
|
|
||||||
STORAGE="/storage"
|
|
||||||
if [ ! -d "$STORAGE" ]; then
|
if [ ! -d "$STORAGE" ]; then
|
||||||
error "Storage folder ($STORAGE) not found!" && exit 13
|
error "Storage folder ($STORAGE) not found!" && exit 13
|
||||||
fi
|
fi
|
||||||
@ -45,7 +54,6 @@ if [ ! -d "/run/shm" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Cleanup files
|
# Cleanup files
|
||||||
rm -f /tmp/server.*
|
|
||||||
rm -f /run/shm/qemu.*
|
rm -f /run/shm/qemu.*
|
||||||
rm -f /run/shm/dsm.url
|
rm -f /run/shm/dsm.url
|
||||||
|
|
||||||
@ -71,7 +79,17 @@ pKill() {
|
|||||||
{ kill -15 "$pid" || true; } 2>/dev/null
|
{ kill -15 "$pid" || true; } 2>/dev/null
|
||||||
|
|
||||||
while isAlive "$pid"; do
|
while isAlive "$pid"; do
|
||||||
sleep 0.1
|
sleep 0.2
|
||||||
|
done
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fWait() {
|
||||||
|
local name=$1
|
||||||
|
|
||||||
|
while pgrep -f -l "$name" >/dev/null; do
|
||||||
|
sleep 0.2
|
||||||
done
|
done
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
@ -81,14 +99,54 @@ fKill() {
|
|||||||
local name=$1
|
local name=$1
|
||||||
|
|
||||||
{ pkill -f "$name" || true; } 2>/dev/null
|
{ pkill -f "$name" || true; } 2>/dev/null
|
||||||
|
fWait "$name"
|
||||||
while pgrep -f -l "$name" >/dev/null; do
|
|
||||||
sleep 0.1
|
|
||||||
done
|
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
escape () {
|
||||||
|
local s
|
||||||
|
s=${1//&/\&}
|
||||||
|
s=${s//</\<}
|
||||||
|
s=${s//>/\>}
|
||||||
|
s=${s//'"'/\"}
|
||||||
|
printf -- %s "$s"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
html()
|
||||||
|
{
|
||||||
|
local title
|
||||||
|
local body
|
||||||
|
local footer
|
||||||
|
|
||||||
|
title=$(escape "$APP")
|
||||||
|
title="<title>$title</title>"
|
||||||
|
footer=$(escape "$FOOTER1")
|
||||||
|
|
||||||
|
body=$(escape "$1")
|
||||||
|
if [[ "$body" == *"..." ]]; then
|
||||||
|
body="<p class=\"loading\">${body/.../}</p>"
|
||||||
|
fi
|
||||||
|
|
||||||
|
local timeout="4999"
|
||||||
|
[ -n "${2:-}" ] && timeout="$2"
|
||||||
|
local script="<script>setTimeout(() => { document.location.reload(); }, $timeout);</script>"
|
||||||
|
[[ "$timeout" == "0" ]] && script=""
|
||||||
|
|
||||||
|
local HTML
|
||||||
|
HTML=$(<"$TEMPLATE")
|
||||||
|
HTML="${HTML/\[1\]/$title}"
|
||||||
|
HTML="${HTML/\[2\]/$script}"
|
||||||
|
HTML="${HTML/\[3\]/$body}"
|
||||||
|
HTML="${HTML/\[4\]/$footer}"
|
||||||
|
HTML="${HTML/\[5\]/$FOOTER2}"
|
||||||
|
|
||||||
|
echo "$HTML" > "$PAGE"
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
getCountry() {
|
getCountry() {
|
||||||
local url=$1
|
local url=$1
|
||||||
local query=$2
|
local query=$2
|
||||||
@ -134,7 +192,8 @@ addPackage() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
info "Installing $desc..."
|
MSG="Installing $desc..."
|
||||||
|
info "$MSG" && html "$MSG"
|
||||||
|
|
||||||
[ -z "$COUNTRY" ] && setCountry
|
[ -z "$COUNTRY" ] && setCountry
|
||||||
|
|
||||||
@ -148,4 +207,9 @@ addPackage() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Start webserver
|
||||||
|
cp -r /var/www/* /run/shm
|
||||||
|
html "Starting $APP for Docker..."
|
||||||
|
nginx -e stderr
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
@ -1,66 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
TMP_FILE=$(mktemp -q /tmp/server.XXXXXX)
|
|
||||||
|
|
||||||
stop() {
|
|
||||||
trap - SIGINT EXIT
|
|
||||||
{ pkill -f socat || true; } 2>/dev/null
|
|
||||||
[ -f "$TMP_FILE" ] && rm -f "$TMP_FILE"
|
|
||||||
}
|
|
||||||
|
|
||||||
trap 'stop' EXIT SIGINT SIGTERM SIGHUP
|
|
||||||
|
|
||||||
html()
|
|
||||||
{
|
|
||||||
local h="<!DOCTYPE html><HTML><HEAD><TITLE>VirtualDSM</TITLE>"
|
|
||||||
h="$h<STYLE>body { color: white; background-color: #125bdb; font-family: Verdana,"
|
|
||||||
h="$h Arial,sans-serif; } a, a:hover, a:active, a:visited { color: white; }</STYLE></HEAD>"
|
|
||||||
h="$h<BODY><BR><BR><H1><CENTER>$1</CENTER></H1></BODY></HTML>"
|
|
||||||
|
|
||||||
echo "$h"
|
|
||||||
}
|
|
||||||
|
|
||||||
if [[ "$2" != "/"* ]]; then
|
|
||||||
|
|
||||||
BODY="$2"
|
|
||||||
|
|
||||||
if [[ "$BODY" == "install" ]]; then
|
|
||||||
BODY="Please wait while Virtual DSM is being installed..."
|
|
||||||
BODY="$BODY<script>setTimeout(() => { document.location.reload(); }, 9999);</script>"
|
|
||||||
fi
|
|
||||||
|
|
||||||
HTML=$(html "$BODY")
|
|
||||||
printf '%b' "HTTP/1.1 200 OK\nContent-Length: ${#HTML}\nConnection: close\n\n$HTML" > "$TMP_FILE"
|
|
||||||
|
|
||||||
socat TCP4-LISTEN:80,reuseaddr,fork,crlf SYSTEM:"cat $TMP_FILE" 2> /dev/null &
|
|
||||||
socat TCP4-LISTEN:"${1:-5000}",reuseaddr,fork,crlf SYSTEM:"cat $TMP_FILE" 2> /dev/null & wait $!
|
|
||||||
|
|
||||||
exit
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$2" != "/run/ip.sh" ]]; then
|
|
||||||
|
|
||||||
cp "$2" "$TMP_FILE"
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
BODY="The location of DSM is <a href='http://\$LOCATION'>http://\$LOCATION</a><script>"
|
|
||||||
BODY="$BODY setTimeout(function(){ window.location.assign('http://\$LOCATION'); }, 3000);</script>"
|
|
||||||
WAIT="Please wait while discovering IP...<script>setTimeout(() => { document.location.reload(); }, 4999);</script>"
|
|
||||||
|
|
||||||
HTML=$(html "xxx")
|
|
||||||
|
|
||||||
{ echo "#!/bin/bash"
|
|
||||||
echo "[ -f \"/run/shm/dsm.url\" ] && LOCATION=\$(</run/shm/dsm.url)"
|
|
||||||
echo "HTML=\"$HTML\"; [ -z \"\$LOCATION\" ] && BODY=\"$WAIT\" || BODY=\"$BODY\"; HTML=\${HTML/xxx/\$BODY}"
|
|
||||||
echo "printf '%b' \"HTTP/1.1 200 OK\\nContent-Length: \${#HTML}\\nConnection: close\\n\\n\$HTML\""
|
|
||||||
} > "$TMP_FILE"
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
chmod +x "$TMP_FILE"
|
|
||||||
|
|
||||||
socat TCP4-LISTEN:80,reuseaddr,fork,crlf SYSTEM:"$TMP_FILE" 2> /dev/null &
|
|
||||||
socat TCP4-LISTEN:"${1:-5000}",reuseaddr,fork,crlf SYSTEM:"$TMP_FILE" 2> /dev/null & wait $!
|
|
26
web/index.html
Normal file
26
web/index.html
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
[1]
|
||||||
|
<meta http-equiv="Cache-Control" content="no-cache" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
|
[2]
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="page-container">
|
||||||
|
<div id="content-wrap">
|
||||||
|
<h1>[3]</h1>
|
||||||
|
</div>
|
||||||
|
<div id="empty-space">
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
[4]<br />
|
||||||
|
[5]
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
33
web/nginx.conf
Normal file
33
web/nginx.conf
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
listen 5000 default_server;
|
||||||
|
listen [::]:5000 default_server;
|
||||||
|
|
||||||
|
autoindex on;
|
||||||
|
tcp_nodelay on;
|
||||||
|
server_tokens off;
|
||||||
|
absolute_redirect off;
|
||||||
|
|
||||||
|
error_log /dev/null;
|
||||||
|
access_log /dev/null;
|
||||||
|
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
|
||||||
|
gzip on;
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_proxied any;
|
||||||
|
gzip_comp_level 5;
|
||||||
|
gzip_min_length 500;
|
||||||
|
gzip_disable "msie6";
|
||||||
|
gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/json application/xml application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
|
||||||
|
|
||||||
|
add_header Cache-Control "no-cache";
|
||||||
|
|
||||||
|
location / {
|
||||||
|
|
||||||
|
root /run/shm;
|
||||||
|
index index.html;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
59
web/style.css
Normal file
59
web/style.css
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
body {
|
||||||
|
color: white;
|
||||||
|
background-color: #125bdb;
|
||||||
|
font-family: Verdana, Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content-wrap {
|
||||||
|
text-align: center;
|
||||||
|
padding: 20px;
|
||||||
|
margin-top: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer {
|
||||||
|
width: 98%;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0px;
|
||||||
|
height: 40px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#empty-space {
|
||||||
|
height: 40px;
|
||||||
|
/* Same height as footer */
|
||||||
|
}
|
||||||
|
|
||||||
|
a,
|
||||||
|
a:hover,
|
||||||
|
a:active,
|
||||||
|
a:visited {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading:after {
|
||||||
|
content: " .";
|
||||||
|
animation: dots 1s steps(5, end) infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes dots {
|
||||||
|
|
||||||
|
0%,
|
||||||
|
20% {
|
||||||
|
color: rgba(0, 0, 0, 0);
|
||||||
|
text-shadow: 0.25em 0 0 rgba(0, 0, 0, 0), 0.5em 0 0 rgba(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
40% {
|
||||||
|
color: white;
|
||||||
|
text-shadow: 0.25em 0 0 rgba(0, 0, 0, 0), 0.5em 0 0 rgba(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
60% {
|
||||||
|
text-shadow: 0.25em 0 0 white, 0.5em 0 0 rgba(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
80%,
|
||||||
|
100% {
|
||||||
|
text-shadow: 0.25em 0 0 white, 0.5em 0 0 white;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user