Files
raspscreen/install.sh

264 lines
7.7 KiB
Bash

#!/bin/bash
program_name="raspscreen"
runtime_id=$(id -u)
userland_name="${1-systemec}"
# Check if the user is right (root) for the program
if [[ "$runtime_id" -ne 0 ]]; then
echo "Not running as root, please run as root."
exit 1
fi
apt-get -y install \
default-jre libreoffice-impress libreoffice-java-common psmisc ssh vlc
systemctl enable --now ssh
# Create the systemd userland folder
if [[ ! -d /home/${userland_name}/.config/systemd/user ]]; then
mkdir -p /home/${userland_name}/.config/systemd/user -m 755
fi
# Create the program place onto /opt
if [[ ! -d /opt/${program_name} ]]; then
mkdir -p /opt/${program_name}/media/current -m 755
mkdir -p /opt/${program_name}/bin -m 755
fi
# THIS MUST BE THE SAME AS $REPO/service-files/presentation.service
cat > /home/${userland_name}/.config/systemd/user/presentation.service << EOF
[Unit]
Description="Systemec RaspScreen Presentation"
Conflicts=video.service
After=graphical-session.target
[Service]
Type=simple
Environment=DISPLAY=:0
WorkingDirectory=/opt/raspscreen
ExecStart=/opt/raspscreen/bin/manage.sh start presentation --foreground
KillSignal=SIGKILL
Restart=always
RestartSec=2
[Install]
WantedBy=default.target
EOF
# THIS MUST BE THE SAME AS $REPO/service-files/video.service
cat > /home/${userland_name}/.config/systemd/user/video.service << EOF
[Unit]
Description="Systemec RaspScreen Video"
Conflicts=presentation.service
After=graphical-session.target
[Service]
Type=simple
Environment=DISPLAY=:0
Environment=QT_QPA_PLATFORM=xcb
WorkingDirectory=/opt/raspscreen
ExecStart=/opt/raspscreen/bin/manage.sh start video --foreground
Restart=always
RestartSec=2
[Install]
WantedBy=default.target
EOF
# THIS MUST BE THE SAME AS $REPO/service-files/disable-usb.service
cat > /etc/systemd/system/disable-usb.service << EOF
[Unit]
Description="Systemec RaspScreen USB-Disablement service"
After=systemd-udevd.service
Wants=systemd-udevd.service
[Service]
Type=oneshot
WorkingDirectory=/opt/raspscreen
ExecStart=/opt/raspscreen/bin/disable-usb.sh
[Install]
WantedBy=multi-user.target
EOF
# THIS MUST BE THE SAME AS $REPO/bin/manage.sh
cat > /opt/raspscreen/bin/manage.sh << EOF
#!/bin/bash
#
# Utility to manage the userland program called RaspScreen by Systemec B.V.
#
# Where it should live: /opt/raspscreen/bin/manage.sh
#
# Examples:
# ./manage.sh (restart|stop|start) (presentation|video)
#
# systemctl must be reachable from the path of the executing user.
app_name="raspscreen"
runtime_id=\$(id -u)
if [[ "\$runtime_id" -eq 0 ]]; then
echo "Do not run as root. Run as the graphical user."
exit 1
fi
printf "Checking input..."
# Action performed
case "\$1" in
restart|stop|start|switch-state)
printf "Valid command...";;
*)
echo "Invalid command!"
exit 1;;
esac
# Type to select
case "\$2" in
presentation|video)
echo "Valid service...";;
*)
echo "Invalid service!"
exit 1;;
esac
# Foreground or operator mode
case "\$3" in
--foreground)
echo "Gathering uptime data..."
sys_uptime=\$(cat /proc/uptime | awk '{print int(\$1)}')
if [[ "\$sys_uptime" -lt 60 ]]; then
echo "Detected a recent restart - giving the operating system some time..."
sleep 10s
fi
if [[ "\$2" == "presentation" ]]; then
echo "Finding and moving media..."
media_file=\$(find /opt/raspscreen/media \
-path /opt/raspscreen/media/current -prune -o \
-type f \( -iname "*.pptx" -o -iname "*.odp" \) \
-printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-)
media_file_ext="\${media_file##*.}"
echo "New media file: \$media_file"
old_file=\$(find /opt/raspscreen/media/current -type f \( -iname "*.pptx" -o -iname "*.odp" \))
echo "Old file: \$old_file"
echo "Copying new media into staging area..."
cp "\$media_file" /opt/raspscreen/media/current
current_media=\$(find /opt/raspscreen/media/current -name "*.\$media_file_ext")
echo "Prepared media: \$current_media"
if [[ -z "\$current_media" ]]; then
echo "No compatible media file found. Wrong mode?"
echo "Exiting in 20 seconds..."
sleep 20s
exit 1
else
echo "Starting LibreOffice Present..."
/usr/bin/libreoffice --impress --show --norestore "\$current_media"
fi
elif [[ "\$2" == "video" ]]; then
echo "Finding media..."
media_file=\$(find /opt/raspscreen/media \
-path /opt/raspscreen/media/current -prune -o \
-type f \( -iname "*.mp4" -o -iname "*.mkv" -o -iname "*.mov" -o -iname "*.webm" \) \
-printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-)
media_file_ext="\${media_file##*.}"
echo "New media file: \$media_file"
old_file=\$(find /opt/raspscreen/media/current -type f \( -iname "*.mp4" -o -iname "*.mkv" -o -iname "*.mov" -o -iname "*.webm" \))
echo "Old file: \$old_file"
echo "Copying new media into staging area..."
cp "\$media_file" /opt/raspscreen/media/current
current_media=\$(find /opt/raspscreen/media/current -name "*.\$media_file_ext")
echo "Prepared media: \$current_media"
if [[ -z "\$current_media" ]]; then
echo "No compatible media file found. Wrong mode?"
echo "Exiting in 20 seconds..."
sleep 20s
exit 1
else
echo "Starting VLC..."
/usr/bin/vlc --fullscreen --loop --no-video-title --video-on-top --no-qt-fs-controller --qt-continue=0 "\$current_media"
fi
fi
echo "Process exited..."
exit 0
;;
*)
echo "Running in task mode...";;
esac
echo "Executing task..."
if [[ "\$1" != "switch-state" ]]; then
cmd_result=\$(systemctl --user "\$1" "\$2" 2>&1)
cmd_exit=\$?
elif [[ "\$1" == "switch-state" ]]; then
last_state=\$(cat /opt/raspscreen/currentstate.txt)
if [[ "\$2" == "video" ]]; then
alt_serv="presentation"
elif [[ "\$2" == "presentation" ]]; then
alt_serv="video"
fi
echo "alt_serv: \$alt_serv"
if [ "\$last_state" != "\$2" ] || [ -z "\$last_state" ]; then
systemctl --user disable "\$alt_serv"
systemctl --user enable "\$2"
fi
systemctl --user restart "\$2"
echo "\$2" > /opt/raspscreen/currentstate.txt
fi
if [[ "\$cmd_exit" -eq 0 ]]; then
echo "Succesfully exited!"
else
echo "Something went wrong, see..."
echo " -> \$cmd_result"
fi
exit 0
EOF
# THIS MUST BE THE SAME AS $REPO/bin/disable-usb.sh
cat > /opt/raspscreen/bin/disable-usb << EOF
#!/bin/bash
for dev in /sys/bus/usb/devices/*; do
# Only match main device entries (no colon)
if [[ \$(basename "\$dev") =~ ^[0-9]+-[0-9]+\$ ]]; then
if [ -e "\$dev/driver" ]; then
echo "-----"
echo "Device path: \$dev"
dev_name=\$(basename "\$dev")
echo "Unbinding: \$dev_name"
echo "\$dev_name" > /sys/bus/usb/drivers/usb/unbind
else
echo "Skipping: \$dev"
fi
fi
done
EOF
echo "alias userjournal='journalctl --user-unit'" /home/${userland_name}/.bashrc
chmod +x /opt/raspscreen/bin/manage.sh
chown -Rv ${userland_name}:${userland_name} /home/${userland_name}/.config/systemd
chown -Rv ${userland_name}:${userland_name} /opt/${program_name}
su ${userland_name} -c "systemctl --user daemon-reload"
xmlstarlet ed -L -u "//prop[@oor:name='ShowTipOfTheDay']/value" -v "false" main.xcd
echo "Self-destruction NOW!"
rm $(pwd)/$0