Skip to content

Instantly share code, notes, and snippets.

@robinrm
Last active June 8, 2024 21:23
Show Gist options
  • Save robinrm/b0a523c366c7f48407d70874f1fe66b0 to your computer and use it in GitHub Desktop.
Save robinrm/b0a523c366c7f48407d70874f1fe66b0 to your computer and use it in GitHub Desktop.
edited SinusBot Updater (by Phillip Eßwein) for environments with other ntp server settings
#!/bin/bash
# SinusBot installer by Philipp Eßwein - DAThosting.eu philipp.esswein@dathosting.eu
# Vars
MACHINE=$(uname -m)
Instversion="1.5"
USE_SYSTEMD=true
# Functions
function greenMessage() {
echo -e "\\033[32;1m${*}\\033[0m"
}
function magentaMessage() {
echo -e "\\033[35;1m${*}\\033[0m"
}
function cyanMessage() {
echo -e "\\033[36;1m${*}\\033[0m"
}
function redMessage() {
echo -e "\\033[31;1m${*}\\033[0m"
}
function yellowMessage() {
echo -e "\\033[33;1m${*}\\033[0m"
}
function errorQuit() {
errorExit 'Exit now!'
}
function errorExit() {
redMessage "${@}"
exit 1
}
function errorContinue() {
redMessage "Invalid option."
return
}
function makeDir() {
if [ -n "$1" ] && [ ! -d "$1" ]; then
mkdir -p "$1"
fi
}
err_report() {
FAILED_COMMAND=$(wget -q -O - https://raw.githubusercontent.com/Sinusbot/installer-linux/master/sinusbot_installer.sh | sed -e "$1q;d")
FAILED_COMMAND=${FAILED_COMMAND/ -qq}
FAILED_COMMAND=${FAILED_COMMAND/ -q}
FAILED_COMMAND=${FAILED_COMMAND/ -s}
FAILED_COMMAND=${FAILED_COMMAND/ 2\>\/dev\/null\/}
FAILED_COMMAND=${FAILED_COMMAND/ 2\>&1}
FAILED_COMMAND=${FAILED_COMMAND/ \>\/dev\/null}
if [[ "$FAILED_COMMAND" == "" ]]; then
redMessage "Failed command: https://github.com/Sinusbot/installer-linux/blob/master/sinusbot_installer.sh#L""$1"
else
redMessage "Command which failed was: \"${FAILED_COMMAND}\". Please try to execute it manually and attach the output to the bug report in the forum thread."
redMessage "If it still doesn't work report this to the author at https://forum.sinusbot.com/threads/sinusbot-installer-script.1200/ only. Not a PN or a bad review, cause this is an error of your system not of the installer script. Line $1."
fi
exit 1
}
trap 'err_report $LINENO' ERR
# Check if the script was run as root user. Otherwise exit the script
if [ "$(id -u)" != "0" ]; then
errorExit "Change to root account required!"
fi
# Update notify
cyanMessage "Checking for the latest installer version"
if [[ -f /etc/centos-release ]]; then
yum update
yum -y -q install wget
else
apt-get update -qq
apt-get -qq install wget -y
fi
# Detect if systemctl is available then use systemd as start script. Otherwise use init.d
if [[ $(command -v systemctl) == "" ]]; then
USE_SYSTEMD=false
fi
# If kernel to old, quit
if [ $(uname -r | cut -c1-1) < 3 ]; then
errorExit "Linux kernel unsupportet. Update kernel before. Or change hardware."
fi
# If the linux distribution is not debian and centos, then exit
if [ ! -f /etc/debian_version ] && [ ! -f /etc/centos-release ]; then
errorExit "Not supported linux distribution. Only Debian and CentOS are currently supported"!
fi
greenMessage "This is the automatic installer for latest SinusBot. USE AT YOUR OWN RISK"!
sleep 1
cyanMessage "You can choose between installing, upgrading and removing the SinusBot."
sleep 1
redMessage "Installer by Philipp Esswein | DAThosting.eu - Your game-/voiceserver hoster (only german)."
sleep 1
magentaMessage "Please rate this script at: https://forum.sinusbot.com/resources/sinusbot-installer-script.58/"
sleep 1
yellowMessage "You're using installer $Instversion"
# selection menu if the installer should install, update, remove or pw reset the SinusBot
redMessage "What should the installer do?"
OPTIONS=("Install" "Update" "Remove" "PW Reset" "Quit")
select OPTION in "${OPTIONS[@]}"; do
case "$REPLY" in
1 | 2 | 3 | 4) break ;;
5) errorQuit ;;
*) errorContinue ;;
esac
done
if [ "$OPTION" == "Install" ]; then
INSTALL="Inst"
elif [ "$OPTION" == "Update" ]; then
INSTALL="Updt"
elif [ "$OPTION" == "Remove" ]; then
INSTALL="Rem"
elif [ "$OPTION" == "PW Reset" ]; then
INSTALL="Res"
fi
# PW Reset
if [[ $INSTALL == "Res" ]]; then
yellowMessage "Automatic usage or own directories?"
OPTIONS=("Automatic" "Own path" "Quit")
select OPTION in "${OPTIONS[@]}"; do
case "$REPLY" in
1 | 2) break ;;
3) errorQuit ;;
*) errorContinue ;;
esac
done
if [ "$OPTION" == "Automatic" ]; then
LOCATION=/opt/sinusbot
elif [ "$OPTION" == "Own path" ]; then
yellowMessage "Enter location where the bot should be installed/updated/removed. Like /opt/sinusbot. Include the / at first position and none at the end"!
LOCATION=""
while [[ ! -d $LOCATION ]]; do
read -rp "Location [/opt/sinusbot]: " LOCATION
if [[ $INSTALL != "Inst" && ! -d $LOCATION ]]; then
redMessage "Directory not found, try again"!
fi
done
greenMessage "Your directory is $LOCATION."
OPTIONS=("Yes" "No, change it" "Quit")
select OPTION in "${OPTIONS[@]}"; do
case "$REPLY" in
1 | 2) break ;;
3) errorQuit ;;
*) errorContinue ;;
esac
done
if [ "$OPTION" == "No, change it" ]; then
LOCATION=""
while [[ ! -d $LOCATION ]]; do
read -rp "Location [/opt/sinusbot]: " LOCATION
if [[ $INSTALL != "Inst" && ! -d $LOCATION ]]; then
redMessage "Directory not found, try again"!
fi
done
greenMessage "Your directory is $LOCATION."
fi
fi
LOCATIONex=$LOCATION/sinusbot
if [[ ! -f $LOCATION/sinusbot ]]; then
errorExit "SinusBot wasn't found at $LOCATION. Exiting script."
fi
PW=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1)
SINUSBOTUSER=$(ls -ld $LOCATION | awk '{print $3}')
greenMessage "Please login to your SinusBot webinterface as admin and '$PW'"
yellowMessage "After that change your password under Settings->User Accounts->admin->Edit. The script restart the bot with init.d or systemd."
if [[ -f /lib/systemd/system/sinusbot.service ]]; then
if [[ $(systemctl is-active sinusbot >/dev/null && echo UP || echo DOWN) == "UP" ]]; then
service sinusbot stop
fi
elif [[ -f /etc/init.d/sinusbot ]]; then
if [ "$(/etc/init.d/sinusbot status | awk '{print $NF; exit}')" == "UP" ]; then
/etc/init.d/sinusbot stop
fi
fi
log="/tmp/sinusbot.log"
match="USER-PATCH [admin] (admin) OK"
su -c "$LOCATIONex --override-password $PW" $SINUSBOTUSER >"$log" 2>&1 &
sleep 3
while true; do
echo -ne '(Waiting for password change!)\r'
if grep -Fq "$match" "$log"; then
pkill -INT -f $PW
rm $log
greenMessage "Successfully changed your admin password."
if [[ -f /lib/systemd/system/sinusbot.service ]]; then
service sinusbot start
greenMessage "Started your bot with systemd."
elif [[ -f /etc/init.d/sinusbot ]]; then
/etc/init.d/sinusbot start
greenMessage "Started your bot with initd."
else
redMessage "Please start your bot normally"!
fi
exit 0
fi
done
fi
# Check which OS
if [ "$INSTALL" != "Rem" ]; then
if [[ -f /etc/centos-release ]]; then
greenMessage "Installing redhat-lsb! Please wait."
yum -y -q install redhat-lsb
greenMessage "Done"!
yellowMessage "You're running CentOS. Which firewallsystem are you using?"
OPTIONS=("IPtables" "Firewalld")
select OPTION in "${OPTIONS[@]}"; do
case "$REPLY" in
1 | 2) break ;;
*) errorContinue ;;
esac
done
if [ "$OPTION" == "IPtables" ]; then
FIREWALL="ip"
elif [ "$OPTION" == "Firewalld" ]; then
FIREWALL="fd"
fi
fi
if [[ -f /etc/debian_version ]]; then
greenMessage "Check if lsb-release and debconf-utils is installed..."
apt-get -qq update
apt-get -qq install debconf-utils -y
apt-get -qq install lsb-release -y
greenMessage "Done"!
fi
# Functions from lsb_release
OS=$(lsb_release -i 2>/dev/null | grep 'Distributor' | awk '{print tolower($3)}')
OSBRANCH=$(lsb_release -c 2>/dev/null | grep 'Codename' | awk '{print $2}')
OSRELEASE=$(lsb_release -r 2>/dev/null | grep 'Release' | awk '{print $2}')
VIRTUALIZATION_TYPE=""
# Extracted from the virt-what sourcecode: http://git.annexia.org/?p=virt-what.git;a=blob_plain;f=virt-what.in;hb=HEAD
if [[ -f "/.dockerinit" ]]; then
VIRTUALIZATION_TYPE="docker"
fi
if [ -d "/proc/vz" -a ! -d "/proc/bc" ]; then
VIRTUALIZATION_TYPE="openvz"
fi
if [[ $VIRTUALIZATION_TYPE == "openvz" ]]; then
redMessage "Warning, your server is running OpenVZ! This very old container system isn't well supported by newer packages."
elif [[ $VIRTUALIZATION_TYPE == "docker" ]]; then
redMessage "Warning, your server is running Docker! Maybe there are failures while installing."
fi
fi
# Go on
if [ "$INSTALL" != "Rem" ]; then
if [ -z "$OS" ]; then
errorExit "Error: Could not detect OS. Currently only Debian, Ubuntu and CentOS are supported. Aborting"!
elif [ -z "$OS" ] && ([ "$(cat /etc/debian_version | awk '{print $1}')" == "7" ] || [ $(cat /etc/debian_version | grep "7.") ]); then
errorExit "Debian 7 isn't supported anymore"!
fi
if [ -z "$OSBRANCH" ] && [ -f /etc/centos-release ]; then
errorExit "Error: Could not detect branch of OS. Aborting"
fi
if [ "$MACHINE" == "x86_64" ]; then
ARCH="amd64"
else
errorExit "$MACHINE is not supported"!
fi
fi
if [[ "$INSTALL" != "Rem" ]]; then
if [[ "$USE_SYSTEMD" == true ]]; then
yellowMessage "Automatically chosen system.d for your startscript"!
else
yellowMessage "Automatically chosen init.d for your startscript"!
fi
fi
# Set path or continue with normal
yellowMessage "Automatic usage or own directories?"
OPTIONS=("Automatic" "Own path" "Quit")
select OPTION in "${OPTIONS[@]}"; do
case "$REPLY" in
1 | 2) break ;;
3) errorQuit ;;
*) errorContinue ;;
esac
done
if [ "$OPTION" == "Automatic" ]; then
LOCATION=/opt/sinusbot
elif [ "$OPTION" == "Own path" ]; then
yellowMessage "Enter location where the bot should be installed/updated/removed, e.g. /opt/sinusbot. Include the / at first position and none at the end"!
LOCATION=""
while [[ ! -d $LOCATION ]]; do
read -rp "Location [/opt/sinusbot]: " LOCATION
if [[ $INSTALL != "Inst" && ! -d $LOCATION ]]; then
redMessage "Directory not found, try again"!
fi
if [ "$INSTALL" == "Inst" ]; then
if [ "$LOCATION" == "" ]; then
LOCATION=/opt/sinusbot
fi
makeDir $LOCATION
fi
done
greenMessage "Your directory is $LOCATION."
OPTIONS=("Yes" "No, change it" "Quit")
select OPTION in "${OPTIONS[@]}"; do
case "$REPLY" in
1 | 2) break ;;
3) errorQuit ;;
*) errorContinue ;;
esac
done
if [ "$OPTION" == "No, change it" ]; then
LOCATION=""
while [[ ! -d $LOCATION ]]; do
read -rp "Location [/opt/sinusbot]: " LOCATION
if [[ $INSTALL != "Inst" && ! -d $LOCATION ]]; then
redMessage "Directory not found, try again"!
fi
if [ "$INSTALL" == "Inst" ]; then
makeDir $LOCATION
fi
done
greenMessage "Your directory is $LOCATION."
fi
fi
makeDir $LOCATION
LOCATIONex=$LOCATION/sinusbot
# Check if SinusBot already installed and if update is possible
if [[ $INSTALL == "Inst" ]] || [[ $INSTALL == "Updt" ]]; then
yellowMessage "Should I install TeamSpeak or only Discord Mode?"
OPTIONS=("Both" "Only Discord" "Quit")
select OPTION in "${OPTIONS[@]}"; do
case "$REPLY" in
1 | 2) break ;;
3) errorQuit ;;
*) errorContinue ;;
esac
done
if [ "$OPTION" == "Both" ]; then
DISCORD="false"
else
DISCORD="true"
fi
fi
if [[ $INSTALL == "Inst" ]]; then
if [[ -f $LOCATION/sinusbot ]]; then
redMessage "SinusBot already installed with automatic install option"!
read -rp "Would you like to update the bot instead? [Y / N]: " OPTION
if [ "$OPTION" == "Y" ] || [ "$OPTION" == "y" ] || [ "$OPTION" == "" ]; then
INSTALL="Updt"
elif [ "$OPTION" == "N" ] || [ "$OPTION" == "n" ]; then
errorExit "Installer stops now"!
fi
else
greenMessage "SinusBot isn't installed yet. Installer goes on."
fi
elif [ "$INSTALL" == "Rem" ] || [ "$INSTALL" == "Updt" ]; then
if [ ! -d $LOCATION ]; then
errorExit "SinusBot isn't installed"!
else
greenMessage "SinusBot is installed. Installer goes on."
fi
fi
# Remove SinusBot
if [ "$INSTALL" == "Rem" ]; then
SINUSBOTUSER=$(ls -ld $LOCATION | awk '{print $3}')
if [[ -f /usr/local/bin/youtube-dl ]]; then
redMessage "Remove YoutubeDL?"
OPTIONS=("Yes" "No")
select OPTION in "${OPTIONS[@]}"; do
case "$REPLY" in
1 | 2) break ;;
*) errorContinue ;;
esac
done
if [ "$OPTION" == "Yes" ]; then
if [[ -f /usr/local/bin/youtube-dl ]]; then
rm /usr/local/bin/youtube-dl
fi
if [[ -f /etc/cron.d/ytdl ]]; then
rm /etc/cron.d/ytdl
fi
greenMessage "Removed YT-DL successfully"!
fi
fi
if [[ -z $SINUSBOTUSER ]]; then
errorExit "No SinusBot found. Exiting now."
fi
redMessage "SinusBot will now be removed completely from your system"!
greenMessage "Your SinusBot user is \"$SINUSBOTUSER\"? The directory which will be removed is \"$LOCATION\". After select Yes it could take a while."
OPTIONS=("Yes" "No")
select OPTION in "${OPTIONS[@]}"; do
case "$REPLY" in
1) break ;;
2) errorQuit ;;
*) errorContinue ;;
esac
done
if [ "$(ps ax | grep sinusbot | grep SCREEN)" ]; then
ps ax | grep sinusbot | grep SCREEN | awk '{print $1}' | while read PID; do
kill $PID
done
fi
if [ "$(ps ax | grep ts3bot | grep SCREEN)" ]; then
ps ax | grep ts3bot | grep SCREEN | awk '{print $1}' | while read PID; do
kill $PID
done
fi
if [[ -f /lib/systemd/system/sinusbot.service ]]; then
if [[ $(systemctl is-active sinusbot >/dev/null && echo UP || echo DOWN) == "UP" ]]; then
service sinusbot stop
systemctl disable sinusbot
fi
rm /lib/systemd/system/sinusbot.service
elif [[ -f /etc/init.d/sinusbot ]]; then
if [ "$(/etc/init.d/sinusbot status | awk '{print $NF; exit}')" == "UP" ]; then
su -c "/etc/init.d/sinusbot stop" $SINUSBOTUSER
su -c "screen -wipe" $SINUSBOTUSER
update-rc.d -f sinusbot remove >/dev/null
fi
rm /etc/init.d/sinusbot
fi
if [[ -f /etc/cron.d/sinusbot ]]; then
rm /etc/cron.d/sinusbot
fi
if [ "$LOCATION" ]; then
rm -R $LOCATION >/dev/null
greenMessage "Files removed successfully"!
else
redMessage "Error while removing files."
fi
if [[ $SINUSBOTUSER != "root" ]]; then
redMessage "Remove user \"$SINUSBOTUSER\"? (User will be removed from your system)"
OPTIONS=("Yes" "No")
select OPTION in "${OPTIONS[@]}"; do
case "$REPLY" in
1 | 2) break ;;
*) errorContinue ;;
esac
done
if [ "$OPTION" == "Yes" ]; then
userdel -r -f $SINUSBOTUSER >/dev/null
if [ "$(id $SINUSBOTUSER 2>/dev/null)" == "" ]; then
greenMessage "User removed successfully"!
else
redMessage "Error while removing user"!
fi
fi
fi
greenMessage "SinusBot removed completely including all directories."
exit 0
fi
# Private usage only!
redMessage "This SinusBot version is only for private use! Accept?"
OPTIONS=("No" "Yes")
select OPTION in "${OPTIONS[@]}"; do
case "$REPLY" in
1) errorQuit ;;
2) break ;;
*) errorContinue ;;
esac
done
# Ask for YT-DL
redMessage "Should YT-DL be installed/updated?"
OPTIONS=("Yes" "No")
select OPTION in "${OPTIONS[@]}"; do
case "$REPLY" in
1 | 2) break ;;
*) errorContinue ;;
esac
done
if [ "$OPTION" == "Yes" ]; then
YT="Yes"
fi
# Update packages or not
redMessage 'Update the system packages to the latest version? (Recommended)'
OPTIONS=("Yes" "No")
select OPTION in "${OPTIONS[@]}"; do
case "$REPLY" in
1 | 2) break ;;
*) errorContinue ;;
esac
done
greenMessage "Starting the installer now"!
sleep 2
if [ "$OPTION" == "Yes" ]; then
greenMessage "Updating the system in a few seconds"!
sleep 1
redMessage "This could take a while. Please wait up to 10 minutes"!
sleep 3
if [[ -f /etc/centos-release ]]; then
yum -y -q update
yum -y -q upgrade
else
apt-get -qq update
apt-get -qq upgrade
fi
fi
# TeamSpeak3-Client latest check
if [ "$DISCORD" == "false" ]; then
greenMessage "Searching latest TS3-Client build for hardware type $MACHINE with arch $ARCH."
VERSION="3.5.6"
DOWNLOAD_URL_VERSION="https://files.teamspeak-services.com/releases/client/$VERSION/TeamSpeak3-Client-linux_$ARCH-$VERSION.run"
STATUS=$(wget --server-response -L $DOWNLOAD_URL_VERSION 2>&1 | awk '/^ HTTP/{print $2}')
if [ "$STATUS" == "200" ]; then
DOWNLOAD_URL=$DOWNLOAD_URL_VERSION
fi
if [ "$STATUS" == "200" -a "$DOWNLOAD_URL" != "" ]; then
greenMessage "Detected latest TS3-Client version as $VERSION"
else
errorExit "Could not detect latest TS3-Client version"
fi
# Install necessary aptitudes for sinusbot.
magentaMessage "Installing necessary packages. Please wait..."
if [[ -f /etc/centos-release ]]; then
yum -y -q install screen xvfb libxcursor1 ca-certificates bzip2 psmisc libglib2.0-0 less python3 iproute which dbus libnss3 libegl1-mesa x11-xkb-utils libasound2 libxcomposite-dev libxi6 libpci3 libxslt1.1 libxkbcommon0 libxss1 >/dev/null
update-ca-trust extract >/dev/null
else
apt-get install -y -qq --no-install-recommends libfontconfig libxtst6 screen xvfb libxcursor1 ca-certificates bzip2 psmisc libglib2.0-0 less python3 iproute2 dbus libnss3 libegl1-mesa x11-xkb-utils libasound2 libxcomposite-dev libxi6 libpci3 libxslt1.1 libxkbcommon0 libxss1
update-ca-certificates >/dev/null
fi
else
magentaMessage "Installing necessary packages. Please wait..."
if [[ -f /etc/centos-release ]]; then
yum -y -q install ca-certificates bzip2 python wget >/dev/null
update-ca-trust extract >/dev/null
else
apt-get -qq install ca-certificates bzip2 python wget -y >/dev/null
update-ca-certificates >/dev/null
fi
fi
greenMessage "Packages installed"!
# Setting server time
if [[ $VIRTUALIZATION_TYPE == "openvz" ]]; then
redMessage "You're using OpenVZ virtualization. You can't set your time, maybe it works but there is no guarantee. Skipping this part..."
else
timedatectl
TIME=$(date)
greenMessage "Automatically set time to" $TIME!
fi
USERADD=$(which useradd)
GROUPADD=$(which groupadd)
ipaddress=$(ip route get 8.8.8.8 | awk {'print $7'} | tr -d '\n')
# Create/check user for sinusbot.
if [ "$INSTALL" == "Updt" ]; then
SINUSBOTUSER=$(ls -ld $LOCATION | awk '{print $3}')
if [ "$DISCORD" == "false" ]; then
sed -i "s|TS3Path = \"\"|TS3Path = \"$LOCATION/teamspeak3-client/ts3client_linux_amd64\"|g" $LOCATION/config.ini && greenMessage "Added TS3 Path to config." || redMessage "Error while updating config"
fi
else
cyanMessage 'Please enter the name of the sinusbot user. Typically "sinusbot". If it does not exists, the installer will create it.'
SINUSBOTUSER=""
while [[ ! $SINUSBOTUSER ]]; do
read -rp "Username [sinusbot]: " SINUSBOTUSER
if [ -z "$SINUSBOTUSER" ]; then
SINUSBOTUSER=sinusbot
fi
if [ $SINUSBOTUSER == "root" ]; then
redMessage "Error. Your username is invalid. Don't use root"!
SINUSBOTUSER=""
fi
if [ -n "$SINUSBOTUSER" ]; then
greenMessage "Your sinusbot user is: $SINUSBOTUSER"
fi
done
if [ "$(id $SINUSBOTUSER 2>/dev/null)" == "" ]; then
if [ -d /home/$SINUSBOTUSER ]; then
$GROUPADD $SINUSBOTUSER
$USERADD -d /home/$SINUSBOTUSER -s /bin/bash -g $SINUSBOTUSER $SINUSBOTUSER
else
$GROUPADD $SINUSBOTUSER
$USERADD -m -b /home -s /bin/bash -g $SINUSBOTUSER $SINUSBOTUSER
fi
else
greenMessage "User \"$SINUSBOTUSER\" already exists."
fi
chmod 750 -R $LOCATION
chown -R $SINUSBOTUSER:$SINUSBOTUSER $LOCATION
fi
# Create dirs or remove them.
ps -u $SINUSBOTUSER | grep ts3client | awk '{print $1}' | while read PID; do
kill $PID
done
if [[ -f $LOCATION/ts3client_startscript.run ]]; then
rm -rf $LOCATION/*
fi
if [ "$DISCORD" == "false" ]; then
makeDir $LOCATION/teamspeak3-client
chmod 750 -R $LOCATION
chown -R $SINUSBOTUSER:$SINUSBOTUSER $LOCATION
cd $LOCATION/teamspeak3-client
# Downloading TS3-Client files.
if [[ -f CHANGELOG ]] && [ $(cat CHANGELOG | awk '/Client Release/{ print $4; exit }') == $VERSION ]; then
greenMessage "TS3 already latest version."
else
greenMessage "Downloading TS3 client files."
su -c "wget -q $DOWNLOAD_URL" $SINUSBOTUSER
if [[ ! -f TeamSpeak3-Client-linux_$ARCH-$VERSION.run && ! -f ts3client_linux_$ARCH ]]; then
errorExit "Download failed! Exiting now"!
fi
fi
# Installing TS3-Client.
if [[ -f TeamSpeak3-Client-linux_$ARCH-$VERSION.run ]]; then
greenMessage "Installing the TS3 client."
redMessage "Read the eula"!
sleep 1
yellowMessage 'Do the following: Press "ENTER" then press "q" after that press "y" and accept it with another "ENTER".'
sleep 2
chmod 777 ./TeamSpeak3-Client-linux_$ARCH-$VERSION.run
su -c "./TeamSpeak3-Client-linux_$ARCH-$VERSION.run" $SINUSBOTUSER
cp -R ./TeamSpeak3-Client-linux_$ARCH/* ./
sleep 2
rm ./ts3client_runscript.sh
rm ./TeamSpeak3-Client-linux_$ARCH-$VERSION.run
rm -R ./TeamSpeak3-Client-linux_$ARCH
greenMessage "TS3 client install done."
fi
fi
# Downloading latest SinusBot.
cd $LOCATION
greenMessage "Downloading latest SinusBot."
su -c "wget -q https://www.sinusbot.com/dl/sinusbot.current.tar.bz2" $SINUSBOTUSER
if [[ ! -f sinusbot.current.tar.bz2 && ! -f sinusbot ]]; then
errorExit "Download failed! Exiting now"!
fi
# Installing latest SinusBot.
greenMessage "Extracting SinusBot files."
su -c "tar -xjf sinusbot.current.tar.bz2" $SINUSBOTUSER
rm -f sinusbot.current.tar.bz2
if [ "$DISCORD" == "false" ]; then
if [ ! -d teamspeak3-client/plugins/ ]; then
mkdir teamspeak3-client/plugins/
fi
# Copy the SinusBot plugin into the teamspeak clients plugin directory
cp $LOCATION/plugin/libsoundbot_plugin.so $LOCATION/teamspeak3-client/plugins/
if [[ -f teamspeak3-client/xcbglintegrations/libqxcb-glx-integration.so ]]; then
rm teamspeak3-client/xcbglintegrations/libqxcb-glx-integration.so
fi
fi
chmod 755 sinusbot
if [ "$INSTALL" == "Inst" ]; then
greenMessage "SinusBot installation done."
elif [ "$INSTALL" == "Updt" ]; then
greenMessage "SinusBot update done."
fi
if [[ "$USE_SYSTEMD" == true ]]; then
greenMessage "Starting systemd installation"
if [[ -f /etc/systemd/system/sinusbot.service ]]; then
service sinusbot stop
systemctl disable sinusbot
rm /etc/systemd/system/sinusbot.service
fi
cd /lib/systemd/system/
wget -q https://raw.githubusercontent.com/Sinusbot/linux-startscript/master/sinusbot.service
if [ ! -f sinusbot.service ]; then
errorExit "Download failed! Exiting now"!
fi
sed -i 's/User=YOUR_USER/User='$SINUSBOTUSER'/g' /lib/systemd/system/sinusbot.service
sed -i 's!ExecStart=YOURPATH_TO_THE_BOT_BINARY!ExecStart='$LOCATIONex'!g' /lib/systemd/system/sinusbot.service
sed -i 's!WorkingDirectory=YOURPATH_TO_THE_BOT_DIRECTORY!WorkingDirectory='$LOCATION'!g' /lib/systemd/system/sinusbot.service
systemctl daemon-reload
systemctl enable sinusbot.service
greenMessage 'Installed systemd file to start the SinusBot with "service sinusbot {start|stop|status|restart}"'
elif [[ "$USE_SYSTEMD" == false ]]; then
greenMessage "Starting init.d installation"
cd /etc/init.d/
wget -q https://raw.githubusercontent.com/Sinusbot/linux-startscript/obsolete-init.d/sinusbot
if [ ! -f sinusbot ]; then
errorExit "Download failed! Exiting now"!
fi
sed -i 's/USER="mybotuser"/USER="'$SINUSBOTUSER'"/g' /etc/init.d/sinusbot
sed -i 's!DIR_ROOT="/opt/ts3soundboard/"!DIR_ROOT="'$LOCATION'/"!g' /etc/init.d/sinusbot
chmod +x /etc/init.d/sinusbot
if [[ -f /etc/centos-release ]]; then
chkconfig sinusbot on >/dev/null
else
update-rc.d sinusbot defaults >/dev/null
fi
greenMessage 'Installed init.d file to start the SinusBot with "/etc/init.d/sinusbot {start|stop|status|restart|console|update|backup}"'
fi
cd $LOCATION
if [ "$INSTALL" == "Inst" ]; then
if [ "$DISCORD" == "false" ]; then
if [[ ! -f $LOCATION/config.ini ]]; then
echo 'ListenPort = 8087
ListenHost = "0.0.0.0"
TS3Path = "'$LOCATION'/teamspeak3-client/ts3client_linux_amd64"
YoutubeDLPath = ""' >>$LOCATION/config.ini
greenMessage "config.ini created successfully."
else
redMessage "config.ini already exists or creation error"!
fi
else
if [[ ! -f $LOCATION/config.ini ]]; then
echo 'ListenPort = 8087
ListenHost = "0.0.0.0"
TS3Path = ""
YoutubeDLPath = ""' >>$LOCATION/config.ini
greenMessage "config.ini created successfully."
else
redMessage "config.ini already exists or creation error"!
fi
fi
fi
#if [[ -f /etc/cron.d/sinusbot ]]; then
# redMessage "Cronjob already set for SinusBot updater"!
#else
# greenMessage "Installing Cronjob for automatic SinusBot update..."
# echo "0 0 * * * $SINUSBOTUSER $LOCATION/sinusbot -update >/dev/null" >>/etc/cron.d/sinusbot
# greenMessage "Installing SinusBot update cronjob successful."
#fi
# Installing YT-DL.
if [ "$YT" == "Yes" ]; then
greenMessage "Installing YT-Downloader now"!
if [ "$(cat /etc/cron.d/ytdl)" == "0 0 * * * $SINUSBOTUSER youtube-dl -U --restrict-filename >/dev/null" ]; then
rm /etc/cron.d/ytdl
yellowMessage "Deleted old YT-DL cronjob. Generating new one in a second."
fi
if [[ -f /etc/cron.d/ytdl ]] && [ "$(grep -c 'youtube' /etc/cron.d/ytdl)" -ge 1 ]; then
redMessage "Cronjob already set for YT-DL updater"!
else
greenMessage "Installing Cronjob for automatic YT-DL update..."
echo "0 0 * * * $SINUSBOTUSER PATH=$PATH:/usr/local/bin; youtube-dl -U --restrict-filename >/dev/null" >>/etc/cron.d/ytdl
greenMessage "Installing Cronjob successful."
fi
sed -i 's/YoutubeDLPath = \"\"/YoutubeDLPath = \"\/usr\/local\/bin\/youtube-dl\"/g' $LOCATION/config.ini
if [[ -f /usr/local/bin/youtube-dl ]]; then
rm /usr/local/bin/youtube-dl
fi
greenMessage "Downloading YT-DL now..."
wget -q -O /usr/local/bin/youtube-dl http://yt-dl.org/downloads/latest/youtube-dl
if [ ! -f /usr/local/bin/youtube-dl ]; then
errorExit "Download failed! Exiting now"!
else
greenMessage "Download successful"!
fi
chmod a+rx /usr/local/bin/youtube-dl
youtube-dl -U --restrict-filename
fi
# Creating Readme
if [ ! -a "$LOCATION/README_installer.txt" ] && [ "$USE_SYSTEMD" == true ]; then
echo '##################################################################################
# #
# Usage: service sinusbot {start|stop|status|restart} #
# - start: start the bot #
# - stop: stop the bot #
# - status: display the status of the bot (down or up) #
# - restart: restart the bot #
# #
##################################################################################' >>$LOCATION/README_installer.txt
elif [ ! -a "$LOCATION/README_installer.txt" ] && [ "$USE_SYSTEMD" == false ]; then
echo '##################################################################################
# #
# Usage: /etc/init.d/sinusbot {start|stop|status|restart|console|update|backup} #
# - start: start the bot #
# - stop: stop the bot #
# - status: display the status of the bot (down or up) #
# - restart: restart the bot #
# - console: display the bot console #
# - update: runs the bot updater (with start & stop)
# - backup: archives your bot root directory
# To exit the console without stopping the server, press CTRL + A then D. #
# #
##################################################################################' >>$LOCATION/README_installer.txt
fi
greenMessage "Generated README_installer.txt"!
# Delete files if exists
if [[ -f /tmp/.sinusbot.lock ]]; then
rm /tmp/.sinusbot.lock
greenMessage "Deleted /tmp/.sinusbot.lock"
fi
if [ -e /tmp/.X11-unix/X40 ]; then
rm /tmp/.X11-unix/X40
greenMessage "Deleted /tmp/.X11-unix/X40"
fi
# Starting SinusBot first time!
if [ "$INSTALL" != "Updt" ]; then
greenMessage 'Starting the SinusBot. For first time.'
chown -R $SINUSBOTUSER:$SINUSBOTUSER $LOCATION
cd $LOCATION
# Password variable
export Q=$(su $SINUSBOTUSER -c './sinusbot --initonly')
password=$(export | awk '/password/{ print $10 }' | tr -d "'")
if [ -z "$password" ]; then
errorExit "Failed to read password, try a reinstall again."
fi
chown -R $SINUSBOTUSER:$SINUSBOTUSER $LOCATION
# Starting bot
greenMessage "Starting SinusBot again."
fi
if [[ "$USE_SYSTEMD" == true ]]; then
service sinusbot start
elif [[ "$USE_SYSTEMD" == false ]]; then
/etc/init.d/sinusbot start
fi
yellowMessage "Please wait... This will take some seconds"!
chown -R $SINUSBOTUSER:$SINUSBOTUSER $LOCATION
if [[ "$USE_SYSTEMD" == true ]]; then
sleep 5
elif [[ "$USE_SYSTEMD" == false ]]; then
sleep 10
fi
if [[ -f /etc/centos-release ]]; then
if [ "$FIREWALL" == "ip" ]; then
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 8087 -j ACCEPT
elif [ "$FIREWALL" == "fs" ]; then
if rpm -q --quiet firewalld; then
zone=$(firewall-cmd --get-active-zones | awk '{print $1; exit}')
firewall-cmd --zone=$zone --add-port=8087/tcp --permanent >/dev/null
firewall-cmd --reload >/dev/null
fi
fi
fi
# If startup failed, the script will start normal sinusbot without screen for looking about errors. If startup successed => installation done.
IS_RUNNING=false
if [[ "$USE_SYSTEMD" == true ]]; then
if [[ $(systemctl is-active sinusbot >/dev/null && echo UP || echo DOWN) == "UP" ]]; then
IS_RUNNING=true
fi
elif [[ "$USE_SYSTEMD" == false ]]; then
if [[ $(/etc/init.d/sinusbot status | awk '{print $NF; exit}') == "UP" ]]; then
IS_RUNNING=true
fi
fi
if [[ "$IS_RUNNING" == true ]]; then
if [[ $INSTALL == "Inst" ]]; then
greenMessage "Install done"!
elif [[ $INSTALL == "Updt" ]]; then
greenMessage "Update done"!
fi
if [[ ! -f $LOCATION/README_installer.txt ]]; then
yellowMessage "Generated a README_installer.txt in $LOCATION with all commands for the sinusbot..."
fi
if [[ $INSTALL == "Updt" ]]; then
if [[ -f /lib/systemd/system/sinusbot.service ]]; then
service sinusbot restart
greenMessage "Restarted your bot with systemd."
fi
if [[ -f /etc/init.d/sinusbot ]]; then
/etc/init.d/sinusbot restart
greenMessage "Restarted your bot with initd."
fi
greenMessage "All right. Everything is updated successfully. SinusBot is UP on '$ipaddress:8087' :)"
else
greenMessage "All right. Everything is installed successfully. SinusBot is UP on '$ipaddress:8087' :) Your user = 'admin' and password = '$password'"
fi
if [[ "$USE_SYSTEMD" == true ]]; then
redMessage 'Stop it with "service sinusbot stop".'
elif [[ "$USE_SYSTEMD" == false ]]; then
redMessage 'Stop it with "/etc/init.d/sinusbot stop".'
fi
magentaMessage "Don't forget to rate this script on: https://forum.sinusbot.com/resources/sinusbot-installer-script.58/"
greenMessage "Thank you for using this script! :)"
else
redMessage "SinusBot could not start! Starting it directly. Look for errors"!
su -c "$LOCATION/sinusbot" $SINUSBOTUSER
fi
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment