#!/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 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 echo "Starting LibreOffice Present..." /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 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 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