forked from switnet/quick-jibri-installer
				
			
							parent
							
								
									8a78fe3850
								
							
						
					
					
						commit
						f88e487ef4
					
				| 
						 | 
					@ -0,0 +1,343 @@
 | 
				
			||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					# Quick Jibri Installer - *buntu 16.04 (LTS) based systems.
 | 
				
			||||||
 | 
					# SwITNet Ltd © - 2018, https://switnet.net/
 | 
				
			||||||
 | 
					# GPLv3 or later.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# SYSTEM SETUP
 | 
				
			||||||
 | 
					JITSI_UNS_REPO=$(apt-cache policy | grep http | grep jitsi | grep unstable | awk '{print $3}' | head -n 1 | cut -d "/" -f 1)
 | 
				
			||||||
 | 
					CERTBOT_REPO=$(apt-cache policy | grep http | grep certbot | head -n 1 | awk '{print $2}' | cut -d "/" -f 4)
 | 
				
			||||||
 | 
					APACHE_2=$(dpkg-query -W -f='${Status}' apache2 2>/dev/null | grep -c "ok installed")
 | 
				
			||||||
 | 
					NGINX=$(dpkg-query -W -f='${Status}' nginx 2>/dev/null | grep -c "ok installed")
 | 
				
			||||||
 | 
					DIST=$(lsb_release -sc)
 | 
				
			||||||
 | 
					GOOGL_REPO="/etc/apt/sources.list.d/dl_google_com_linux_chrome_deb.list"
 | 
				
			||||||
 | 
					CHD_VER=$(curl -sL https://chromedriver.storage.googleapis.com/LATEST_RELEASE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ $DIST = flidas ]; then
 | 
				
			||||||
 | 
					DIST="xenial"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					check_serv() {
 | 
				
			||||||
 | 
					if [ "$APACHE_2" -eq 1 ] || [ "$NGINX" -eq 1 ]; then
 | 
				
			||||||
 | 
						echo "
 | 
				
			||||||
 | 
					Webserver already installed!
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
						echo "
 | 
				
			||||||
 | 
					Installing nginx as webserver!
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
						apt -yqq install nginx
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					check_snd_driver() {
 | 
				
			||||||
 | 
					modprobe snd-aloop
 | 
				
			||||||
 | 
					echo "snd-aloop" >> /etc/modules
 | 
				
			||||||
 | 
					if [ "$(lsmod | grep snd_aloop | head -n 1 | cut -d " " -f1)" = "snd_aloop" ]; then
 | 
				
			||||||
 | 
						echo "Audio driver seems ok."
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
						echo "Seems to be an issue with your audio driver, please fix this before continue."
 | 
				
			||||||
 | 
						exit
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					update_certbot() {
 | 
				
			||||||
 | 
						if [ "$CERTBOT_REPO" = "certbot" ]; then
 | 
				
			||||||
 | 
						echo "
 | 
				
			||||||
 | 
					Cerbot repository already on the system!
 | 
				
			||||||
 | 
					Checking for updates...
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
						apt -qq update
 | 
				
			||||||
 | 
						apt -yqq dist-upgrade
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
						echo "
 | 
				
			||||||
 | 
					Adding cerbot (formerly letsencrypt) PPA repository for latest updates
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
						echo "deb http://ppa.launchpad.net/certbot/certbot/ubuntu $DIST main" > /etc/apt/sources.list.d/certbot.list
 | 
				
			||||||
 | 
						apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 75BCA694
 | 
				
			||||||
 | 
						apt -qq update
 | 
				
			||||||
 | 
						apt -yqq dist-upgrade
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clear
 | 
				
			||||||
 | 
					echo '
 | 
				
			||||||
 | 
					########################################################################
 | 
				
			||||||
 | 
					                    Welcome to Jitsi/Jibri Installer
 | 
				
			||||||
 | 
					########################################################################
 | 
				
			||||||
 | 
					                    by Software, IT & Networks Ltd
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Check correct user (sudo or root)
 | 
				
			||||||
 | 
					if [ "$EUID" == 0 ]
 | 
				
			||||||
 | 
					  then echo "Ok, you have superuser powers"
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
						echo "You should run it with root or sudo permissions."
 | 
				
			||||||
 | 
						exit
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Jitsi-Meet Repo
 | 
				
			||||||
 | 
					echo "Add Jitsi key"
 | 
				
			||||||
 | 
					if [ "$JITSI_UNS_REPO" = "unstable" ]; then
 | 
				
			||||||
 | 
						echo "Jitsi unstable repository already installed"
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
						echo 'deb https://download.jitsi.org unstable/' > /etc/apt/sources.list.d/jitsi-unstable.list
 | 
				
			||||||
 | 
						wget -qO -  https://download.jitsi.org/jitsi-key.gpg.key | apt-key add -
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Requirements
 | 
				
			||||||
 | 
					echo "We'll start by installing system requirements this may take a while please be patient..."
 | 
				
			||||||
 | 
					apt update -yq2
 | 
				
			||||||
 | 
					apt dist-upgrade -yq2
 | 
				
			||||||
 | 
					apt -yqq install \
 | 
				
			||||||
 | 
									bmon \
 | 
				
			||||||
 | 
									curl \
 | 
				
			||||||
 | 
									ffmpeg \
 | 
				
			||||||
 | 
									git \
 | 
				
			||||||
 | 
									htop \
 | 
				
			||||||
 | 
									linux-image-extra-virtual \
 | 
				
			||||||
 | 
									unzip \
 | 
				
			||||||
 | 
									wget
 | 
				
			||||||
 | 
					check_serv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "
 | 
				
			||||||
 | 
					# Installing Jitsi Framework
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					apt -yqq install \
 | 
				
			||||||
 | 
									jitsi-meet \
 | 
				
			||||||
 | 
									jibri
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ALSA - Loopback
 | 
				
			||||||
 | 
					echo "snd-aloop" | tee -a /etc/modules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					check_snd_driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "# Installing Google Chrome / ChromeDriver"
 | 
				
			||||||
 | 
					if [ -f $GOOGL_REPO ]; then
 | 
				
			||||||
 | 
					echo "Google repository already set."
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					echo "Installing Google Chrome Stable"
 | 
				
			||||||
 | 
						wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add -
 | 
				
			||||||
 | 
						echo "deb http://dl.google.com/linux/chrome/deb/ stable main" | tee $GOOGL_REPO
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					apt -qq update
 | 
				
			||||||
 | 
					apt install -yqq google-chrome-stable
 | 
				
			||||||
 | 
					rm -rf /etc/apt/sources.list.d/dl_google_com_linux_chrome_deb.list
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -f /usr/local/bin/chromedriver ]; then
 | 
				
			||||||
 | 
						echo "Chromedriver already installed."
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
						echo "Installing Chromedriver"
 | 
				
			||||||
 | 
						wget https://chromedriver.storage.googleapis.com/$CHD_VER/chromedriver_linux64.zip -O /tmp/chromedriver_linux64.zip
 | 
				
			||||||
 | 
						unzip /tmp/chromedriver_linux64.zip -d /usr/local/bin/
 | 
				
			||||||
 | 
						chown root:root /usr/local/bin/chromedriver
 | 
				
			||||||
 | 
						chmod 0755 /usr/local/bin/chromedriver
 | 
				
			||||||
 | 
						rm -rf /tpm/chromedriver_linux64.zip
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Check Google Software Working
 | 
				
			||||||
 | 
					/usr/bin/google-chrome --version
 | 
				
			||||||
 | 
					/usr/local/bin/chromedriver --version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo '
 | 
				
			||||||
 | 
					########################################################################
 | 
				
			||||||
 | 
					                    Starting Jibri configuration
 | 
				
			||||||
 | 
					########################################################################
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					# MEET / JIBRI SETUP
 | 
				
			||||||
 | 
					DOMAIN=$(ls /etc/prosody/conf.d/ | grep -v localhost | cut -d "." -f "1,2,3")
 | 
				
			||||||
 | 
					JB_AUTH_PASS_FILE=/var/JB_AUTH_PASS.txt
 | 
				
			||||||
 | 
					JB_REC_PASS_FILE=/var/JB_REC_PASS.txt
 | 
				
			||||||
 | 
					PROSODY_FILE=/etc/prosody/conf.d/$DOMAIN.cfg.lua
 | 
				
			||||||
 | 
					JICOFO_SIP=/etc/jitsi/jicofo/sip-communicator.properties
 | 
				
			||||||
 | 
					MEET_CONF=/etc/jitsi/meet/$DOMAIN-config.js
 | 
				
			||||||
 | 
					CONF_JSON=/etc/jitsi/jibri/config.json
 | 
				
			||||||
 | 
					DIR_RECORD=/tmp/recordings
 | 
				
			||||||
 | 
					REC_DIR=/home/jibri/finalize_recording.sh
 | 
				
			||||||
 | 
					JB_NAME="Jibri Sessions"
 | 
				
			||||||
 | 
					read -p "Jibri internal.auth.$DOMAIN password: "$'\n' -sr JB_AUTH_PASS
 | 
				
			||||||
 | 
					read -p "Jibri recorder.$DOMAIN password: "$'\n' -sr JB_REC_PASS
 | 
				
			||||||
 | 
					read -p "Jibri requires Drobbox Client ID to enable video recording: "$'\n' -r DB_CID
 | 
				
			||||||
 | 
					while [[ $ENABLE_SSL != yes && $ENABLE_SSL != no ]]
 | 
				
			||||||
 | 
					do
 | 
				
			||||||
 | 
					read -p "Do you want to setup LetsEncrypt with your domain: "$'\n' -r ENABLE_SSL
 | 
				
			||||||
 | 
					if [ $ENABLE_SSL = no ]; then
 | 
				
			||||||
 | 
						echo "Please run letsencrypt.sh manually post-installation."
 | 
				
			||||||
 | 
					elif [ $ENABLE_SSL = yes ]; then
 | 
				
			||||||
 | 
						echo "SSL will be enabled."
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					echo "$JB_AUTH_PASS" > $JB_AUTH_PASS_FILE
 | 
				
			||||||
 | 
					chmod 600 $JB_AUTH_PASS_FILE
 | 
				
			||||||
 | 
					echo "$JB_REC_PASS" > $JB_REC_PASS_FILE
 | 
				
			||||||
 | 
					chmod 600 $JB_REC_PASS_FILE
 | 
				
			||||||
 | 
					JibriBrewery=JibriBrewery
 | 
				
			||||||
 | 
					INT_CONF=/usr/share/jitsi-meet/interface_config.js
 | 
				
			||||||
 | 
					WAN_IP=$(dig +short myip.opendns.com @resolver1.opendns.com)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enable_letsencrypt() {
 | 
				
			||||||
 | 
					if [ "$SSL_ENABLE" = "yes" ]; then
 | 
				
			||||||
 | 
					echo '
 | 
				
			||||||
 | 
					########################################################################
 | 
				
			||||||
 | 
					                    Starting LetsEncrypt configuration
 | 
				
			||||||
 | 
					########################################################################
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					bash /usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh
 | 
				
			||||||
 | 
					update_certbot
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					echo "SSL setup will be skipped."
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					check_jibri() {
 | 
				
			||||||
 | 
					if [ "$(dpkg-query -W -f='${Status}' "jibri" 2>/dev/null | grep -c "ok installed")" == "1" ]
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
						service jibri restart
 | 
				
			||||||
 | 
						service jibri-icewm restart
 | 
				
			||||||
 | 
						service jibri-xorg restart
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
						echo "Jibri service not installed"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Restarting services
 | 
				
			||||||
 | 
					restart_services() {
 | 
				
			||||||
 | 
						service jitsi-videobridge restart
 | 
				
			||||||
 | 
						service jicofo restart
 | 
				
			||||||
 | 
						check_jibri
 | 
				
			||||||
 | 
						service prosody restart
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Configure Jibri
 | 
				
			||||||
 | 
					## PROSODY
 | 
				
			||||||
 | 
					cat  << MUC-JIBRI >> $PROSODY_FILE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- internal muc component, meant to enable pools of jibri and jigasi clients
 | 
				
			||||||
 | 
					Component "internal.auth.$DOMAIN" "muc"
 | 
				
			||||||
 | 
					    modules_enabled = {
 | 
				
			||||||
 | 
					      "ping";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    storage = "null"
 | 
				
			||||||
 | 
					    muc_room_cache_size = 1000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MUC-JIBRI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cat  << REC-JIBRI >> $PROSODY_FILE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VirtualHost "recorder.$DOMAIN"
 | 
				
			||||||
 | 
					  modules_enabled = {
 | 
				
			||||||
 | 
					    "ping";
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  authentication = "internal_plain"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					REC-JIBRI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Prosody users
 | 
				
			||||||
 | 
					prosodyctl register jibri auth.$DOMAIN $JB_AUTH_PASS
 | 
				
			||||||
 | 
					prosodyctl register recorder recorder.$DOMAIN $JB_REC_PASS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## JICOFO
 | 
				
			||||||
 | 
					# /etc/jitsi/jicofo/sip-communicator.properties
 | 
				
			||||||
 | 
					cat  << BREWERY >> $JICOFO_SIP
 | 
				
			||||||
 | 
					#org.jitsi.jicofo.auth.URL=XMPP:$DOMAIN
 | 
				
			||||||
 | 
					org.jitsi.jicofo.jibri.BREWERY=$JibriBrewery@internal.auth.$DOMAIN
 | 
				
			||||||
 | 
					org.jitsi.jicofo.jibri.PENDING_TIMEOUT=90
 | 
				
			||||||
 | 
					BREWERY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Jibri tweaks for /etc/jitsi/meet/$DOMAIN-config.js
 | 
				
			||||||
 | 
					sed -i "s|guest.example.com|guest.$DOMAIN|" $MEET_CONF
 | 
				
			||||||
 | 
					sed -i "s|conference.$DOMAIN|internal.auth.$DOMAIN|" $MEET_CONF
 | 
				
			||||||
 | 
					sed -i "s|// fileRecordingsEnabled: false,|fileRecordingsEnabled: true,| " $MEET_CONF
 | 
				
			||||||
 | 
					sed -i "s|// liveStreamingEnabled: false,|liveStreamingEnabled: true,\\
 | 
				
			||||||
 | 
					\\
 | 
				
			||||||
 | 
					    hiddenDomain: \'recorder.$DOMAIN\',\\
 | 
				
			||||||
 | 
					\\
 | 
				
			||||||
 | 
					    dropbox: \{\\
 | 
				
			||||||
 | 
					    clientId: \'$DB_CID\'\\
 | 
				
			||||||
 | 
					    },|" $MEET_CONF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#LocalRecording
 | 
				
			||||||
 | 
					echo "# Enabling local recording (audio only)."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sed -i "348,358 s|\}|\},|" $MEET_CONF
 | 
				
			||||||
 | 
					sed -i "s|// Local Recording|// Local Recording \\
 | 
				
			||||||
 | 
					\\
 | 
				
			||||||
 | 
					    localRecording: \{\\
 | 
				
			||||||
 | 
					    enabled: true,\\
 | 
				
			||||||
 | 
					    format: 'flac'\\
 | 
				
			||||||
 | 
					    \}|" $MEET_CONF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sed -i "s|'tileview'|'tileview', 'localrecording'|" $INT_CONF
 | 
				
			||||||
 | 
					#EOLR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Recording directory
 | 
				
			||||||
 | 
					cat << REC_DIR > $REC_DIR
 | 
				
			||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RECORDINGS_DIR=$1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "This is a dummy finalize script" > /tmp/finalize.out
 | 
				
			||||||
 | 
					echo "The script was invoked with recordings directory $RECORDINGS_DIR." >> /tmp/finalize.out
 | 
				
			||||||
 | 
					echo "You should put any finalize logic (renaming, uploading to a service" >> /tmp/finalize.out
 | 
				
			||||||
 | 
					echo "or storage provider, etc.) in this script" >> /tmp/finalize.out
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exit 0
 | 
				
			||||||
 | 
					REC_DIR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## JSON Config
 | 
				
			||||||
 | 
					cp $CONF_JSON CONF_JSON.orig
 | 
				
			||||||
 | 
					cat << CONF_JSON > $CONF_JSON
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    "recording_directory":"$DIR_RECORD",
 | 
				
			||||||
 | 
					    "finalize_recording_script_path": "$REC_DIR",
 | 
				
			||||||
 | 
					    "xmpp_environments": [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "$JB_NAME",
 | 
				
			||||||
 | 
					            "xmpp_server_hosts": [
 | 
				
			||||||
 | 
					                "$WAN_IP"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "xmpp_domain": "$DOMAIN",
 | 
				
			||||||
 | 
					            "control_login": {
 | 
				
			||||||
 | 
					                "domain": "auth.$DOMAIN",
 | 
				
			||||||
 | 
					                "username": "jibri",
 | 
				
			||||||
 | 
					                "password": "$JB_AUTH_PASS"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "control_muc": {
 | 
				
			||||||
 | 
					                "domain": "internal.auth.$DOMAIN",
 | 
				
			||||||
 | 
					                "room_name": "$JibriBrewery",
 | 
				
			||||||
 | 
					                "nickname": "Live"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "call_login": {
 | 
				
			||||||
 | 
					                "domain": "recorder.$DOMAIN",
 | 
				
			||||||
 | 
					                "username": "recorder",
 | 
				
			||||||
 | 
					                "password": "$JB_REC_PASS"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            "room_jid_domain_string_to_strip_from_start": "internal.auth",
 | 
				
			||||||
 | 
					            "usage_timeout": "0"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					CONF_JSON
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#Enable jibri services
 | 
				
			||||||
 | 
					systemctl enable jibri
 | 
				
			||||||
 | 
					systemctl enable jibri-xorg
 | 
				
			||||||
 | 
					systemctl enable jibri-icewm
 | 
				
			||||||
 | 
					restart_services
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enable_letsencrypt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "
 | 
				
			||||||
 | 
					########################################################################
 | 
				
			||||||
 | 
					                    Installation complete!!
 | 
				
			||||||
 | 
					########################################################################
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					apt -y autoremove
 | 
				
			||||||
 | 
					apt autoclean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "Rebooting in..."
 | 
				
			||||||
 | 
					secs=$((15))
 | 
				
			||||||
 | 
					while [ $secs -gt 0 ]; do
 | 
				
			||||||
 | 
					   echo -ne "$secs\033[0K\r"
 | 
				
			||||||
 | 
					   sleep 1
 | 
				
			||||||
 | 
					   : $((secs--))
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					reboot
 | 
				
			||||||
		Loading…
	
		Reference in New Issue