Compare commits

..

4 commits

Author SHA1 Message Date
ef5ab23d6f
The frontend has now been secured far better. It now uses its own user
account with limited permissions. Openbox's menu also does not allow the
user to open potentially dangerous programs anymore.

OctoPrint account no longer randomizes its password as it is more
secure to have it not have one at all.

Condensed Nginx listening address interpreter.

Frontend check to see if Nginx and OctoPrint has been improved. It
should now be reliable.

Added touchscreen calibration.

Octo-config service menu is now deeper, which results in a cleaner
interface.

Octo-config now has a somewhat crude system health checking menu.

MJPG's resolution and framerate can now be configured.

Updated TODO
2020-08-24 22:01:52 -06:00
9132a8b7f7
Updated license and TODO, massive MJPG improvements
MJPG now has a massively improved command. Instead of transcoding the
video for no reason, instead we ask the camera driver for MJPG data so
that we don't have to transcode raw video if we don't have to.

MJPG's resolution and FPS can now also theoretically be changed from a
config file. The frontend components for this however are not
implemented.

Updated notice in first time setup since we're not in alpha anymore.
2020-08-24 03:04:27 -06:00
4d68cace69
Minor improvements 2020-08-21 19:09:58 -06:00
d9c15f9502
Added Golang MJPG Streamer, updated TODO
Added Golang based MJPG streamer https://github.com/blueimp/mjpeg-server
Still need to figure out HW acceleration

Changed default timezone to UTC
2020-08-20 02:56:51 -06:00
18 changed files with 218 additions and 93 deletions

View file

@ -6,8 +6,8 @@ RUN apt-get -y update && \
apt-get -y install --no-install-recommends \ apt-get -y install --no-install-recommends \
git vim parted \ git vim parted \
quilt coreutils qemu-user-static debootstrap zerofree zip dosfstools \ quilt coreutils qemu-user-static debootstrap zerofree zip dosfstools \
bsdtar libcap2-bin rsync grep udev xz-utils curl xxd file kmod bc\ bsdtar libcap2-bin rsync grep udev xz-utils curl xxd file kmod bc \
binfmt-support ca-certificates \ binfmt-support ca-certificates golang \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
COPY . /pi-gen/ COPY . /pi-gen/

View file

@ -1,5 +1,5 @@
Copyright (c) 2015 Raspberry Pi (Trading) Ltd. Copyright (c) 2015 Raspberry Pi (Trading) Ltd.
Copyright (c) 2020 Logan Gartner
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

View file

@ -45,14 +45,15 @@ TODO
### OctoPrint Setup ### OctoPrint Setup
- If the GUI is enabled, you can setup OctoPrint on the Raspberry Pi. You can also setup OctoPrint by opening up a web browser on another computer and navigating to `https://RPI-IP`, replacing RPI-IP with the IP address of your Raspberry Pi. - If the GUI is enabled, you can setup OctoPrint on the Raspberry Pi. You can also setup OctoPrint by opening up a web browser on another computer and navigating to `https://RPI-IP`, replacing RPI-IP with the IP address of your Raspberry Pi.
- If MJPG-Streamer is enabled, you can put `/webcam/?action=stream` into the Stream URL box to enable it in OctoPrint. - If MJPG-Streamer is enabled, you can put `/webcam` into the Stream URL box to enable it in OctoPrint.
### Accessing OctoPrint ### Accessing OctoPrint
- If OctoPrint is enabled, you can access it at `https://RPI-IP`, replacing RPI-IP with the IP address of your Raspberry Pi. - If OctoPrint is enabled, you can access it at `https://RPI-IP`, replacing RPI-IP with the IP address of your Raspberry Pi.
### Reporting Bugs ### Reporting Bugs
Please report any bugs by [filing an issue](/issues). Please include as much detail as you can, including: Please report any bugs by [filing an issue](/issues). Please include as much detail as you can, including (but not limited to):
- Raspberry Pi Model - Raspberry Pi Model
- Version of TouchPrint
- What you were doing when the bug occured - What you were doing when the bug occured
- Steps to reproduce - Steps to reproduce
- Logs - Logs

View file

@ -4,12 +4,14 @@
- Add network configuration (replace nmtui) - Add network configuration (replace nmtui)
- Add hostname configuration (replace nmtui) - Add hostname configuration (replace nmtui)
## Nginx
- Add HTTP basic auth (especially to MJPG)
## Misc ## Misc
- More security - More security
- Wiki
## Things to consider ## Things to consider
- Wayland using labwc/waybox - Wayland using labwc/waybox
- Python 3 - Python 3
- Detect if frontend did not load correctly (probably not easy) - Detect if frontend did not load correctly (probably not easy)
- HTTP/Port 80 redirect
- https://github.com/blueimp/mjpeg-server

View file

@ -177,7 +177,7 @@ export LOCALE_DEFAULT="${LOCALE_DEFAULT:-en_US.UTF-8}"
export KEYBOARD_KEYMAP="${KEYBOARD_KEYMAP:-us}" export KEYBOARD_KEYMAP="${KEYBOARD_KEYMAP:-us}"
export KEYBOARD_LAYOUT="${KEYBOARD_LAYOUT:-English (US)}" export KEYBOARD_LAYOUT="${KEYBOARD_LAYOUT:-English (US)}"
export TIMEZONE_DEFAULT="${TIMEZONE_DEFAULT:-America/New_York}" export TIMEZONE_DEFAULT="${TIMEZONE_DEFAULT:-UTC}"
export GIT_HASH=${GIT_HASH:-"$(git rev-parse HEAD)"} export GIT_HASH=${GIT_HASH:-"$(git rev-parse HEAD)"}

View file

@ -9,6 +9,7 @@ install -m 644 files/.dialogrc "${ROOTFS_DIR}/etc/skel/.dialogrc"
install -m 644 files/.dialogrc "${ROOTFS_DIR}/root/.dialogrc" install -m 644 files/.dialogrc "${ROOTFS_DIR}/root/.dialogrc"
mkdir -p "${ROOTFS_DIR}/etc/skel/.config/openbox" mkdir -p "${ROOTFS_DIR}/etc/skel/.config/openbox"
install -m 644 files/autostart "${ROOTFS_DIR}/etc/skel/.config/openbox/autostart" install -m 644 files/autostart "${ROOTFS_DIR}/etc/skel/.config/openbox/autostart"
install -m 644 files/menu.xml "${ROOTFS_DIR}/etc/skel/.config/openbox/menu.xml"
on_chroot << EOF on_chroot << EOF
if ! id -u ${FIRST_USER_NAME} >/dev/null 2>&1; then if ! id -u ${FIRST_USER_NAME} >/dev/null 2>&1; then
@ -17,7 +18,10 @@ fi
if ! id -u octoprint >/dev/null 2>&1; then if ! id -u octoprint >/dev/null 2>&1; then
adduser --system --shell /usr/sbin/nologin --group --disabled-password --gecos "" octoprint adduser --system --shell /usr/sbin/nologin --group --disabled-password --gecos "" octoprint
fi fi
if ! id -u kiosk >/dev/null 2>&1; then
adduser --disabled-password --shell /usr/sbin/nologin --gecos "" kiosk
fi
echo "${FIRST_USER_NAME}:${FIRST_USER_PASS}" | chpasswd echo "${FIRST_USER_NAME}:${FIRST_USER_PASS}" | chpasswd
echo "octoprint:$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c40)" | chpasswd echo "kiosk:$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c40)" | chpasswd
echo "root:$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c40)" | chpasswd echo "root:$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c40)" | chpasswd
EOF EOF

View file

@ -1,25 +1,25 @@
#!/bin/bash #!/bin/bash
# Grabs the port (and IP) out of the nginx config # Grabs the port (and IP) out of the nginx config
LISTEN=$(grep -i listen /etc/nginx/listen.conf | awk '{gsub(";",""); print $2}') LISTEN=$(awk '/listen/{gsub(";",""); print $2}' /etc/nginx/listen.conf)
# If the value we just grabbed doesn't contain an IP, prepend localhost # If the value we just grabbed doesn't contain an IP, prepend localhost
if ! echo $LISTEN | grep ":" 2>&1; then if ! echo $LISTEN | grep ":" 2>&1; then
ADDRESS="localhost:$LISTEN" ADDRESS="https://localhost:$LISTEN"
else else
ADDRESS=$LISTEN ADDRESS="https://$LISTEN"
fi fi
# Override the automatically detected address if the user wants to # Override the automatically detected address if the user wants to
if [[ -f ~/.overrideurl.sh ]]; then source ~/.overrideurl.sh; fi if [[ -f ~/.overrideurl.sh ]]; then source ~/.overrideurl.sh; fi
# Wait until Nginx/override comes up # Wait until Nginx/override comes up
while ! curl "$ADDRESS" 2>&1 >/dev/null; do while ! curl -f -k -s -I "$ADDRESS" 2>&1 >/dev/null; do
sleep 1 sleep 1
done done
# Wait until OctoPrint comes up if it is enabled # Wait until OctoPrint comes up if it is enabled
while [[ -f /etc/systemd/system/multi-user.target.wants/octoprint.service ]] && ! curl "localhost:5000"; do while [[ -f /etc/systemd/system/multi-user.target.wants/octoprint.service ]] && ! curl -f -s -I "localhost:5000"; do
sleep 1 sleep 1
done done
@ -31,4 +31,4 @@ done
# -K | Enable kiosk mode (doesn't seem to do anything?) # -K | Enable kiosk mode (doesn't seem to do anything?)
# -n | Disable web inspector # -n | Disable web inspector
# -p | Disable plugins # -p | Disable plugins
surf -t -F -g -K -n -p "https://$ADDRESS" surf -t -F -g -K -n -p "$ADDRESS"

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<openbox_menu xmlns="http://openbox.org/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://openbox.org/
file:///usr/share/openbox/menu.xsd">
<menu id="root-menu" label="Openbox 3">
<item label="Restart Browser">
<action name="Execute"><execute>bash ~/.browser.sh</execute></action>
</item>
<separator />
<item label="Restart GUI">
<action name="Exit" />
</item>
</menu>
</openbox_menu>

View file

@ -46,6 +46,9 @@ done
for GRP in dialout plugdev video users; do for GRP in dialout plugdev video users; do
adduser octoprint \$GRP adduser octoprint \$GRP
done done
for GRP in users; do
adduser kiosk \$GRP
done
EOF EOF
on_chroot << EOF on_chroot << EOF

View file

@ -20,7 +20,7 @@
} }
upstream "mjpg-streamer" { upstream "mjpg-streamer" {
server 127.0.0.1:8080; server 127.0.0.1:9000;
} }
server { server {

View file

@ -2,24 +2,12 @@
install -m 644 files/mjpg-streamer.service ${ROOTFS_DIR}/etc/systemd/system/mjpg-streamer.service install -m 644 files/mjpg-streamer.service ${ROOTFS_DIR}/etc/systemd/system/mjpg-streamer.service
install -m 755 files/start-mjpg ${ROOTFS_DIR}/usr/local/bin/start-mjpg install -m 755 files/start-mjpg ${ROOTFS_DIR}/usr/local/bin/start-mjpg
mkdir -p ${ROOTFS_DIR}/usr/local/etc/mjpg-server/
install -m 755 files/config.sh ${ROOTFS_DIR}/usr/local/etc/mjpg-server/
on_chroot << EOF if [[ ! -f ${ROOTFS_DIR}/usr/local/bin/mjpeg-server ]]; then
# If mjpg is already installed, skip this (for debugging) # Do some semi janky cross compilation since Golang won't let me set GOBIN when cross compiling (gogl plz fix)
if ! which mjpg_streamer; then GOPATH=/tmp/go GOARCH=arm64 go get github.com/blueimp/mjpeg-server
cd /tmp cp /tmp/go/bin/linux_arm64/mjpeg-server ${ROOTFS_DIR}/usr/local/bin/mjpeg-server
# Making sure that this directory doesn't exist rm -rf /tmp/go
rm -rf /tmp/mjpg-streamer
git clone https://github.com/jacksonliam/mjpg-streamer/
cd mjpg-streamer/mjpg-streamer-experimental/
make
make install
cd /
# Cleanup
rm -rf /tmp/mjpg-streamer
# Create needed folder
mkdir -p /var/www/mjpg
# Permissions
chown octoprint:octoprint /var/www/mjpg
fi fi
EOF

View file

@ -0,0 +1,3 @@
VIDEO_DEVICE="/dev/video0"
VIDEO_SIZE="1280x720"
FRAMERATE=15

View file

@ -1,2 +1,15 @@
#!/bin/bash #!/bin/bash
/usr/local/bin/mjpg_streamer -i input_uvc.so -o "output_http.so --port 8080 -w /var/www/mjpg"
# Include environment variables
source /usr/local/etc/mjpg-server/config.sh
# Test if camera can just give us MJPG frames so that we can save a bunch of CPU
if ffmpeg -input_format mjpeg -video_size $VIDEO_SIZE -framerate $FRAMERATE -nostats -v quiet -i $VIDEO_DEVICE vframes 1 -f null - >/dev/null; then
/usr/local/bin/mjpeg-server -a 127.0.0.1:9000 -- ffmpeg -input_format mjpeg -video_size $VIDEO_SIZE -framerate $FRAMERATE -i $VIDEO_DEVICE -f mjpeg -c:v copy -
# Oh, it can't :( Guess I'll just blast the CPU to maybe get 5FPS
elif ffmpeg -video_size $VIDEO_SIZE -framerate $FRAMERATE -nostats -v quiet -i $VIDEO_DEVICE -vframes 1 -f null - >/dev/null; then
/usr/local/bin/mjpeg-server -a 127.0.0.1:9000 -- ffmpeg -video_size $VIDEO_SIZE -framerate $FRAMERATE -i /dev/video0 -f mjpeg -
else
echo "FFmpeg could not start. Double check your configuration."
exit 1
fi

View file

@ -64,10 +64,13 @@ suggested_menu () {
done done
} }
dialog --title "NOTICE" --nocancel --colors --msgbox "This collection of software is currently in alpha. It is lacking several critical features. \Zb\Z1DO NOT\Zn use this in a production environment. This image has been provided for testing purposes only." 10 50 dialog --title "NOTICE" --nocancel --colors --msgbox "This collection of software is currently in beta. It is lacking several critical features. \Zb\Z1DO NOT\Zn use this in a production environment." 10 50
# Force the user to change the pi user's password before the RPi gets botnetted # Force the user to change the pi user's password before the RPi gets botnetted
change_password change_password
# Randomize the root and frontend password
echo "kiosk:$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c40)" | chpasswd
echo "root:$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c40)" | chpasswd
dialog --title "Network Configuration" --nocancel --msgbox "Setup will now open nmtui, a program to help configure your ethernet/wireless interfaces. Hit Quit when you are done." 10 50 dialog --title "Network Configuration" --nocancel --msgbox "Setup will now open nmtui, a program to help configure your ethernet/wireless interfaces. Hit Quit when you are done." 10 50
nmtui nmtui
@ -76,10 +79,14 @@ nmtui
dpkg-reconfigure tzdata dpkg-reconfigure tzdata
# Enable/disable OctoPrint, GUI, MJPG and SSH # Enable/disable OctoPrint, GUI, MJPG and SSH
service_select service_toggle
screen_timeout screen_timeout
if ( udevadm info --export-db | grep ID_INPUT_TOUCHSCREEN=1 >/dev/null ) && dialog --title "Touchscreen Calibration" --defaultno --yesno "Do you wish to calibrate your touchscreen?\nMost touchscreens are calibrated out of the factory, so this is usually not needed." 10 60; then
startx $(which xinput_calibrator) --no-timeout --output-filename /etc/X11/xorg.conf.d/99-calibration.conf
fi
# Makes a certificate and key for Nginx HTTPS # Makes a certificate and key for Nginx HTTPS
openssl req -x509 -nodes -days 36500 -newkey rsa:4096 -subj "/C=/ST=/L=/O=/OU=/CN=*/emailAddress=" -out /etc/ssl/certs/nginx-octoprint.crt -keyout /etc/ssl/private/nginx-octoprint.key openssl req -x509 -nodes -days 36500 -newkey rsa:4096 -subj "/C=/ST=/L=/O=/OU=/CN=*/emailAddress=" -out /etc/ssl/certs/nginx-octoprint.crt -keyout /etc/ssl/private/nginx-octoprint.key
@ -90,6 +97,7 @@ fi
# If MJPG service is enabled, ask user which video device to use # If MJPG service is enabled, ask user which video device to use
if [[ -f /etc/systemd/system/multi-user.target.wants/mjpg-streamer.service ]]; then if [[ -f /etc/systemd/system/multi-user.target.wants/mjpg-streamer.service ]]; then
video_select
video_config video_config
fi fi

View file

@ -9,23 +9,74 @@ fi
source /usr/local/lib/octo-lib.sh source /usr/local/lib/octo-lib.sh
main_menu () { main_menu () {
local MAINMENU=$(dialog --nocancel --title "Pi Setup" --menu "" 10 50 0 \ local MAINMENU=$(dialog --nocancel --title "TouchPrint Setup" --menu "" 10 50 0 \
"1" "Configure networking" \ "1" "Configure networking" \
"2" "Change password for pi" \ "2" "Change password for pi" \
"3" "Configure services" \ "3" "Configure services" \
"4" "Configure screen timeout" \ "4" "Configure screen timeout" \
"5" "Configure Nginx" \ "5" "Calibrate touchscreen" \
"6" "Configure MJPG" \ "6" "Exit" 3>&1 1>&2 2>&3)
"7" "Exit" 3>&1 1>&2 2>&3)
case $MAINMENU in case $MAINMENU in
"1") nmtui; main_menu; return 0;; "1") nmtui; main_menu; return 0;;
"2") change_password; main_menu; return 0;; "2") change_password; main_menu; return 0;;
"3") service_select; main_menu; return 0;; "3") services_menu; main_menu; return 0;;
"4") screen_timeout; main_menu; return 0;; "4") screen_timeout; main_menu; return 0;;
"5") nginx_config; main_menu; return 0;; "5") dialog --title "Touchscreen Calibration" --infobox "Waiting for touchscreen calibrator to close..." 3 50; DISPLAY=:0 xinput_calibrator --no-timeout --output-filename /etc/X11/xorg.conf.d/99-calibration.conf; main_menu; return 0;;
"6") video_config; main_menu; return 0;; "6") return 0;;
"7") return 0;; esac
}
services_menu () {
local SERVICESMENU=$(dialog --nocancel --title "Services Select" --menu "" 10 50 0 \
"1" "Enable/disable services" \
"2" "Service health check" \
"3" "Configure Nginx" \
"4" "Configure MJPG" \
"5" "Go Back" 3>&1 1>&2 2>&3)
case $SERVICESMENU in
"1") service_toggle; services_menu; return 0;;
"2") service_health; services_menu; return 0;;
"3") nginx_config; services_menu; return 0;;
"4") video_menu; services_menu; return 0;;
"5") return 0;;
esac
}
service_health () {
# Grab listening address/port from Nginx config
if [[ -f /etc/nginx/listen.conf ]]; then
LISTEN=$(awk '/listen/{gsub(";",""); print $2}' /etc/nginx/listen.conf)
else
LISTEN="443"
fi
# If Nginx config didn't contain a port, assume localhost
if ! echo $LISTEN | grep ":" 2>&1; then
ADDRESS="localhost:$LISTEN"
else
ADDRESS=$LISTEN
fi
# I hate bash, and soon you will too
dialog --colors --title "Service Health" --msgbox "\
\ZnOctoPrint: \Zb$(if curl -s -I 127.0.0.1:5000 >/dev/null; then echo '\Z2Online'; elif [[ ! -f /etc/systemd/system/multi-user.target.wants/octoprint.service ]]; then echo "Disabled"; else echo '\Z1Offline'; fi)
\ZnMJPG: \Zb$(if curl -s -I 127.0.0.1:9000 >/dev/null; then echo '\Z2Online'; elif [[ ! -f /etc/systemd/system/multi-user.target.wants/mjpg-streamer.service ]]; then echo "Disabled"; else echo '\Z1Offline'; fi)
\ZnNginx: \Zb$(if curl -k -s -I https://$ADDRESS >/dev/null; then echo '\Z2Online'; elif [[ ! -f /etc/systemd/system/multi-user.target.wants/nginx.service ]]; then echo "Disabled"; else echo '\Z1Offline'; fi)
\ZnSSH: \Zb$(if pgrep sshd >/dev/null; then echo '\Z2Online'; elif [[ ! -f /etc/systemd/system/multi-user.target.wants/sshd.service ]]; then echo "Disabled"; else echo '\Z1Offline'; fi)" 0 0
}
video_menu () {
local VIDEOMENU=$(dialog --title "MJPG Config" --menu "" 10 50 0 \
"1" "Camera Selection" \
"2" "Video Settings" \
"3" "Go Back" 3>&1 1>&2 2>&3)
case $VIDEOMENU in
"1") video_select; video_menu; return 0;;
"2") video_config; video_menu; return 0;;
"3") return 0;;
esac esac
} }

View file

@ -19,7 +19,7 @@ change_password () {
unset PASSWORD unset PASSWORD
} }
service_select () { service_toggle () {
# Toggle the checkboxes if the service is active or not # Toggle the checkboxes if the service is active or not
local SERVICE_MENU=$(dialog --separate-output --nocancel --title "Select services" --checklist "Enable/disable services" 0 0 0 \ local SERVICE_MENU=$(dialog --separate-output --nocancel --title "Select services" --checklist "Enable/disable services" 0 0 0 \
"1" "OctoPrint" $(if [[ -f /etc/systemd/system/multi-user.target.wants/octoprint.service ]]; then echo "ON"; else echo "OFF"; fi) \ "1" "OctoPrint" $(if [[ -f /etc/systemd/system/multi-user.target.wants/octoprint.service ]]; then echo "ON"; else echo "OFF"; fi) \
@ -69,7 +69,6 @@ service_select () {
systemctl disable ssh systemctl disable ssh
fi fi
<< 'EOF' << 'EOF'
for ((i = 0; i <= 3; i++)); do for ((i = 0; i <= 3; i++)); do
for n in "${SERVICE_MENU[@]}"; do for n in "${SERVICE_MENU[@]}"; do
@ -91,9 +90,12 @@ service_select () {
EOF EOF
} }
screen_timeout() { screen_timeout () {
local TIMEOUT=$(dialog --nocancel --title "Screen Timeout" --inputbox "Input your desired screen timeout in seconds.\nEnter \"off\" to disable the screen timeout.\n\nAdding a screen timeout can reduce screen burn in.\n\nDefault: off" 12 60 "off" 3>&1 1>&2 2>&3) local TIMEOUT=$(dialog --nocancel --title "Screen Timeout" --inputbox "Input your desired screen timeout in seconds.\nEnter \"off\" to disable the screen timeout.\n\nAdding a screen timeout can reduce screen burn in.\n\nDefault: off" 12 60 "off" 3>&1 1>&2 2>&3)
cat > /home/pi/.xtimeout << EOF
[[ "$TIMEOUT" == "" ]] && return 0
cat > /home/kiosk/.xtimeout << EOF
xset s ${TIMEOUT} xset s ${TIMEOUT}
xset -dpms xset -dpms
EOF EOF
@ -104,24 +106,29 @@ nginx_config () {
# Grab the variable from the nginx conf if it exists, otherwise use default # Grab the variable from the nginx conf if it exists, otherwise use default
if [[ -f /etc/nginx/listen.conf ]]; then if [[ -f /etc/nginx/listen.conf ]]; then
LISTEN=$(grep -i listen /etc/nginx/listen.conf | awk '{gsub(";",""); print $2}') LISTEN=$(awk '/listen/{gsub(";",""); print $2}' /etc/nginx/listen.conf)
else else
LISTEN="443" LISTEN="443"
fi fi
LISTEN=$(dialog --title "Nginx Config" --nocancel --inputbox "Configure what port and IP Nginx should listen on.\nTo listen on all IPs, just enter the port.\nDefault: 443" 11 50 "$LISTEN" 3>&1 1>&2 2>&3) LISTEN=$(dialog --title "Nginx Config" --nocancel --inputbox "Configure what port and IP Nginx should listen on.\nTo listen on all IPs, just enter the port.\nDefault: 443" 11 50 "$LISTEN" 3>&1 1>&2 2>&3)
[[ "$LISTEN" == "" ]] && return 0
# Write new value to nginx # Write new value to nginx
echo "listen $LISTEN;" > /etc/nginx/listen.conf echo "listen $LISTEN;" > /etc/nginx/listen.conf
} }
video_config () { video_select () {
# In the unlikely event that there are no video devices, don't continue # In the unlikely event that there are no video devices, don't continue
if ! ls /dev/video* 2>&1 >/dev/null; then if ! ls /dev/video* 2>&1 >/dev/null; then
dialog --title "Error" --msgbox "No video devices detected!" 10 50 dialog --title "Error" --msgbox "No video devices detected!" 10 50
return 1 return 1
fi fi
# Grab config values
source /usr/local/etc/mjpg-server/config.sh
# Grab all video devices # Grab all video devices
local DEVICES=($(ls /dev/video*)) local DEVICES=($(ls /dev/video*))
@ -129,13 +136,41 @@ video_config () {
# Generate a menu from said video devices # Generate a menu from said video devices
for ((i = 0; i < ${#DEVICES[@]}; i++)); do for ((i = 0; i < ${#DEVICES[@]}; i++)); do
DEVICELIST+="${DEVICES[$i]} $i OFF " if [[ "$VIDEO_DEVICE" == ${DEVICES[$i]} ]]; then
DEVICELIST+="${DEVICES[$i]} $i ON "
else
DEVICELIST+="${DEVICES[$i]} $i OFF "
fi
done done
local DEVICE_MENU=$(dialog --title "Video Config" --nocancel --radiolist "Choose which video device you wish to use for MJPG-Streamer" 10 50 0 $DEVICELIST 3>&1 1>&2 2>&3) local DEVICE_MENU=$(dialog --title "MJPG Config" --nocancel --radiolist "Choose which video device you wish to use for MJPG-Streamer" 10 50 0 $DEVICELIST 3>&1 1>&2 2>&3)
[[ "$DEVICE_MENU" == "" ]] && return 0 [[ "$DEVICE_MENU" == "" ]] && return 0
# Write selected value to startup script # Write selected value to config file
echo -e '#!/bin/bash'"\n/usr/local/bin/mjpg_streamer -i \"input_uvc.so -d $DEVICE_MENU\" -o \"output_http.so --port 8080\"" > /usr/local/bin/start-mjpg echo -e "VIDEO_DEVICE=$DEVICE_MENU\nVIDEO_SIZE=$VIDEO_SIZE\nFRAMERATE=$FRAMERATE" > /usr/local/etc/mjpg-server/config.sh
}
video_config () {
# Include config values
source /usr/local/etc/mjpg-server/config.sh
# Set video device to a resonable default if it isn't set for some reason
if [[ "$VIDEO_DEVICE" == "" ]]; then
VIDEO_DEVICE="/dev/video0"
fi
local VIDEOCONFIG_MENU=$(dialog --nocancel --title "MJPG Config" --form "Choose desired camera resolution and framerate." 10 50 0\
"Resolution: " 1 1 "$VIDEO_SIZE" 1 13 10 0 \
"Framerate: " 2 1 "$FRAMERATE" 2 12 3 0 3>&1 1>&2 2>&3)
VIDEOCONFIG_MENU=($VIDEOCONFIG_MENU)
if [[ "$VIDEOCONFIG_MENU[0]" == "" ]] || [[ "$VIDEOCONFIG_MENU[1]" == "" ]]; then
dialog --title "Error" --msgbox "Invalid input!" 10 50
video_config
return 0
fi
# Write values to config file
echo -e "VIDEO_DEVICE=$VIDEO_DEVICE\nVIDEO_SIZE=${VIDEOCONFIG_MENU[0]}\nFRAMERATE=${VIDEOCONFIG_MENU[1]}" > /usr/local/etc/mjpg-server/config.sh
} }

View file

@ -1,41 +1,7 @@
#!/bin/bash -e #!/bin/bash -e
#echo -n -e "NODM_USER=${FIRST_USER_NAME}\nNODM_XSESSION=/home/${FIRST_USER_NAME}/.xprofile" > ${ROOTFS_DIR}/etc/nodm.conf mkdir -p ${ROOTFS_DIR}/etc/default
install -m 644 files/nodm ${ROOTFS_DIR}/etc/default/nodm
cat > ${ROOTFS_DIR}/etc/default/nodm << EOF
# nodm configuration
# Set NODM_ENABLED to something different than 'false' to enable nodm
NODM_ENABLED=true
# User to autologin for
NODM_USER=${FIRST_USER_NAME}
# First vt to try when looking for free VTs
NODM_FIRST_VT=7
# X session
NODM_XSESSION=/home/${FIRST_USER_NAME}/.xprofile
# Options for nodm itself
NODM_OPTIONS=
# Options for the X server.
#
# Format: [/usr/bin/<Xserver>] [:<disp>] <Xserver-options>
#
# The Xserver executable and the display name can be omitted, but should
# be placed in front, if nodm's defaults shall be overridden.
NODM_X_OPTIONS='-nolisten tcp'
# If an X session will run for less than this time in seconds, nodm will wait an
# increasing bit of time before restarting the session.
NODM_MIN_SESSION_TIME=60
# Timeout (in seconds) to wait for X to be ready to accept connections. If X is
# not ready before this timeout, it is killed and restarted.
NODM_X_TIMEOUT=300
EOF
# Probably not needed # Probably not needed
on_chroot << EOF on_chroot << EOF

View file

@ -0,0 +1,33 @@
# nodm configuration
# Set NODM_ENABLED to something different than 'false' to enable nodm
NODM_ENABLED=true
# User to autologin for
NODM_USER=kiosk
# First vt to try when looking for free VTs
NODM_FIRST_VT=7
# X session
NODM_XSESSION=/home/kiosk/.xprofile
# Options for nodm itself
NODM_OPTIONS=
# Options for the X server.
#
# Format: [/usr/bin/<Xserver>] [:<disp>] <Xserver-options>
#
# The Xserver executable and the display name can be omitted, but should
# be placed in front, if nodm's defaults shall be overridden.
NODM_X_OPTIONS='-nolisten tcp'
# If an X session will run for less than this time in seconds, nodm will wait an
# increasing bit of time before restarting the session.
NODM_MIN_SESSION_TIME=60
# Timeout (in seconds) to wait for X to be ready to accept connections. If X is
# not ready before this timeout, it is killed and restarted.
NODM_X_TIMEOUT=300