From 520d5062dbb45e12a16d448db990af10f5206ef3 Mon Sep 17 00:00:00 2001 From: th33xitus Date: Sat, 18 Jun 2022 14:29:23 +0200 Subject: [PATCH] feat: make streamer images user customizable create a volume and allow custom images to be "streamed" by webcamd Signed-off-by: Dominik Willner th33xitus@gmail.com --- Dockerfile | 1 + README.md | 4 +- config/supervisord.conf | 2 +- docker-compose.yml | 2 +- scripts/start.sh | 93 +++++++++++++++++++++++++++++++---------- 5 files changed, 75 insertions(+), 27 deletions(-) diff --git a/Dockerfile b/Dockerfile index fd4fd6c..6ebc633 100644 --- a/Dockerfile +++ b/Dockerfile @@ -112,6 +112,7 @@ COPY --from=builder --chown=printer:printer /build/simulavr ./simulavr COPY --from=builder --chown=printer:printer /build/simulavr.elf ./simulavr.elf COPY --from=builder --chown=printer:printer /build/mjpg-streamer/mjpg-streamer-experimental ./mjpg-streamer +# Copy example configs and dummy streamer images COPY ./example-configs/ ./example-configs/ COPY ./mjpg_streamer_images/ ./mjpg_streamer_images/ diff --git a/README.md b/README.md index 6e511dd..ad87445 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,12 @@ ### Setup Instructions: 1. Clone this repository 2. Open a terminal in the cloned folder -3. Run `docker-compose up -d` to build the docker image and start the container afterwards in detached mode +3. Run `docker-compose up -d` to build the docker image and start the container in detached mode --- ### Configure a Dummy-Webcam: -To configure a dummy-webcam, use the following URLs: \ +To configure a dummy-webcam, use the following URLs: * Stream: `http://localhost:8110/?action=stream` * Snapshot: `http://localhost:8110/?action=snapshot` diff --git a/config/supervisord.conf b/config/supervisord.conf index 7846138..cc071ea 100644 --- a/config/supervisord.conf +++ b/config/supervisord.conf @@ -46,7 +46,7 @@ autorestart=true redirect_stderr=true [program:webcamd] -command=/home/printer/mjpg-streamer/mjpg_streamer -i "input_file.so -e -d 0.8 -f /home/printer/mjpg-streamer/images" -o "output_http.so -w /home/printer/mjpg-streamer/www" +command=/home/printer/mjpg-streamer/mjpg_streamer -i "input_file.so -e -d 0.8 -f /home/printer/webcam_images" -o "output_http.so -w /home/printer/mjpg-streamer/www" user=printer process_name=webcamd directory=/home/printer diff --git a/docker-compose.yml b/docker-compose.yml index d6fc9d7..182889a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,7 @@ services: - ./printer_storage/gcode_files:/home/printer/gcode_files:delegated - ./printer_storage/klipper_config:/home/printer/klipper_config:delegated - ./printer_storage/klipper_logs:/home/printer/klipper_logs:delegated - - ./printer_storage/webcam_images:/home/printer/mjpg-streamer/images:delegated + - ./printer_storage/webcam_images:/home/printer/webcam_images:delegated ports: - "7125:7125" - "8110:8080" diff --git a/scripts/start.sh b/scripts/start.sh index 239a37b..ef9d27d 100644 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -1,31 +1,78 @@ -#!/bin/bash -[ ! -e /bin/systemctl ] && sudo -S ln -s /bin/true /bin/systemctl +#!/usr/bin/env bash -cd ~ || exit -[ ! -d ~/klipper_config ] && mkdir klipper_config -[ ! -d ~/klipper_logs ] && mkdir klipper_logs -[ ! -d ~/gcode_files ] && mkdir gcode_files -[ ! -d ~/webcam_images ] && mkdir webcam_images -[ ! -d ~/.moonraker_database ] && mkdir .moonraker_database +#=======================================================================# +# Copyright (C) 2022 mainsail-crew # +# Author: Dominik Willner # +# # +# This file is part of virtual-klipper-printer # +# https://github.com/mainsail-crew/virtual-klipper-printer # +# # +# This file may be distributed under the terms of the GNU GPLv3 license # +#=======================================================================# -if find ~/klipper_config -type d -empty; then - cd ~/example-configs || exit 1 - sudo cp -r ./* ~/klipper_config -fi +set -e -if find ~/webcam_images -type d -empty; then - cd ~/mjpg_streamer_images || exit 1 - sudo cp -r ./* ~/webcam_images -fi +REQUIRED_FOLDERS=( + "${HOME}/klipper_config" + "${HOME}/klipper_logs" + "${HOME}/gcode_files" + "${HOME}/webcam_images" + "${HOME}/.moonraker_database" +) -sudo chown -R printer:printer ~/klipper_config -sudo chown -R printer:printer ~/klipper_logs -sudo chown -R printer:printer ~/gcode_files -sudo chown -R printer:printer ~/webcam_images -sudo chown -R printer:printer ~/.moonraker_database +function status_msg() { + echo "###[$(date +%T)]: ${1}" +} + +###### +# Test for correct ownership of all required folders +### +function check_folder_perms() { + status_msg "Check folders permissions ..." + for folder in "${REQUIRED_FOLDERS[@]}"; do + if [[ $(stat -c "%U" "${folder}") != "printer" ]]; then + status_msg "chown for user: 'printer' on folder: ${folder}" + sudo chown printer:printer "${folder}" + fi + done + status_msg "OK!" +} + +###### +# Copy example configs if ~/klipper_config is empty +### +function copy_example_configs() { + if [[ ! "$(ls -A "${HOME}/klipper_config")" ]]; then + status_msg "Directory ${HOME}/klipper_config is empty!" + status_msg "Copy example configs ..." + cp -R ~/example-configs/* ~/klipper_config + status_msg "OK!" + fi +} + +###### +# Copy dummy images if ~/webcam_images is empty +### +function copy_dummy_images() { + if [[ ! "$(ls -A "${HOME}/webcam_images")" ]]; then + status_msg "Directory ${HOME}/webcam_images is empty!" + status_msg "Copy dummy images ..." + cp -R ~/mjpg_streamer_images/*.jpg ~/webcam_images + status_msg "OK!" + fi +} + +#===================================================# +#===================================================# + +[[ ! -e /bin/systemctl ]] && sudo -S ln -s /bin/true /bin/systemctl + +check_folder_perms +copy_example_configs +copy_dummy_images sudo -S rm /bin/systemctl sudo -S ln -s /bin/service_control /bin/systemctl -cd ~ && echo "Everything is ready ... Starting ..." -/usr/bin/supervisord \ No newline at end of file +cd ~ && status_msg "Everything is ready! Starting ..." +/usr/bin/supervisord