210 lines
6.3 KiB
Bash
210 lines
6.3 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=on-failure
|
|
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=on-failure
|
|
RestartSec=2
|
|
|
|
[Install]
|
|
WantedBy=default.target
|
|
EOF
|
|
|
|
# THIS MUST BE THE AS $REPO/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 \( -name "*.pptx" -o -name "*.odp" \) -type f -print)
|
|
echo "New media file: \$media_file"
|
|
|
|
old_file=\$(find /opt/raspscreen/media/current \( -name "*.pptx" -o -name "*.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 "*.pptx" -o -name "*.odp" \))
|
|
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
|
|
/usr/bin/libreoffice --impress --show --norestore "\$current_media"
|
|
fi
|
|
elif [[ "\$2" == "video" ]]; then
|
|
echo "Finding and moving media..."
|
|
media_file=\$(find /opt/raspscreen/media -path /opt/raspscreen/media/current -prune -o \( -name "*.mp4" -o -name "*.mkv" -o -name "*.mov" -o -name "*.webm" \) -print)
|
|
echo "New media file: \$media_file"
|
|
|
|
old_file=\$(find /opt/raspscreen/media/current \( -name "*.mp4" -o -name "*.mkv" -o -name "*.mov" -o -name "*.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 "*.mp4" -o -name "*.mkv" -o -name "*.mov" -o -name "*.webm" \))
|
|
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
|
|
/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
|
|
|
|
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"
|
|
|
|
echo "Self-destruction NOW!"
|
|
rm $(pwd)/$0
|