3f330ebf29
STUN servers, and only fallback on 'stunclient' (only available on bionic) if 'stun' is not installed on the system
1876 lines
66 KiB
Bash
Executable File
1876 lines
66 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# BlueButton open source conferencing system - https://www.bigbluebutton.org/
|
|
#
|
|
# Copyright (c) 2020 BigBlueButton Inc. and by respective authors (see below).
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it under the
|
|
# terms of the GNU Lesser General Public License as published by the Free Software
|
|
# Foundation; either version 3.0 of the License, or (at your option) any later
|
|
# version.
|
|
#
|
|
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public License along
|
|
# with BigBlueButton; if not, see <https://www.gnu.org/licenses/>.
|
|
#
|
|
# Author(s):
|
|
# Fred Dixon <ffdixon@bigbluebutton.org>
|
|
# Sebastian Schneider <seb.sschneider@gmail.com>
|
|
# Ghazi Triki <ghazi.nocturne@gmail.com>
|
|
#
|
|
# Changelog:
|
|
# 2009-10-18 FFD Initial Version
|
|
# 2009-11-05 FFD Updated for 0.62
|
|
# 2009-12-09 FFD Updated for 0.63
|
|
# 2009-12-11 FFD Added ability to switch conference servers
|
|
# 2009-12-12 FFD Added cleaning and watching of log files
|
|
# 2010-01-05 FFD Added zipping of log files
|
|
# 2010-01-18 FFD Added resetting of environment back to using packages
|
|
# 2010-03-02 JRT Added trunk checkout options / fixed bbb-apps instructions
|
|
# 2010-04-02 FFD Updated for 0.64
|
|
# 2010-06-21 SEB Cleaned up some code / Updated for 0.70
|
|
# 2010-06-25 SEB Added ability to change the security secret
|
|
# 2010-06-30 SEB Added some extra error checking
|
|
# 2010-07-06 SEB Added more error checking and report messages
|
|
# 2010-09-15 FFD Updates for 0.71-dev
|
|
# 2010-10-16 FFD Updates for 0.71-beta
|
|
# 2010-11-06 FFD Added logic to ensure red5 shuts down
|
|
# 2010-12-12 FFD Fixed bug #778
|
|
# 2010-12-12 FFD Added support for Intalio VM
|
|
# 2010-02-28 FFD Fixed #834
|
|
# 2011-06-26 FFD Updates for 0.8
|
|
# 2012-01-14 FFD Testing the development environment for 0.8
|
|
# 2012-02-22 FFD Updates to development environment
|
|
# 2012-04-27 FFD Added sum of version numbers in --check
|
|
# 2013-02-03 FFD Updated for changes to parameters for 0.81 in bigbluebutton-sip.properties
|
|
# 2013-11-07 FFD Finished 0.81
|
|
# 2014-01-13 FFD Working on updates for 0.9.0
|
|
# 2014-03-10 GUG Enable WebRTC
|
|
# 2015-03-12 FFD Added start/stop of HTML5 server
|
|
# 2016-01-13 FFD Updates for 1.0
|
|
# 2016-02-28 FFD Updates to support HTTPS configuration
|
|
# 2016-05-28 FFD Initial updates for 1.1-dev
|
|
# 2016-08-15 GTR Archive more logs with zip option and show more applications with status
|
|
# 2016-10-17 GTR Added redis to checked server components & added ownership check for video and freeswitch recording directories
|
|
# 2017-04-08 FFD Cleanup for 1.1-beta
|
|
# 2018-11-22 MNE Dynamically detect if sudo is needed
|
|
# 2018-12-09 GTR More logs cleanup
|
|
# 2019-02-08 GTR Updates for 2.2 after extracting bbb-web to a standalone server application
|
|
# 2019-03-14 FFD Refactoring and cleanup for 2.2
|
|
# 2019-05-14 FFD Added more checks for configuration issues
|
|
# 2019-07-08 GTR Set IP for all recording formats
|
|
# 2019-10-31 GTR Set IP and shared secret for bbb-webhooks
|
|
# 2019-11-09 GTR Keep HTML5 client logs permissions when cleaning logs
|
|
# 2020-05-20 NJH Add port 443 to --Network and clean up tmp file.
|
|
# 2020-06-23 JFS Remove defaultGuestPolicy warning for HTML5 client
|
|
# 2020-10-22 AGG Removing Flash/Red5 related code (yay!)
|
|
# 2021-07-16 JFS Add defaultMeetingLayout information
|
|
|
|
#set -x
|
|
#set -e
|
|
|
|
PATH=$PATH:/sbin
|
|
|
|
if [[ "$(id -u)" != "0" ]]; then
|
|
if [[ -x "$(which sudo)" ]]; then
|
|
SUDO="$(which sudo)"
|
|
else
|
|
echo "bbb-conf must be ran as root!" && exit 1
|
|
fi
|
|
fi
|
|
|
|
if [[ ! -f /etc/bigbluebutton/bigbluebutton-release ]]; then
|
|
echo
|
|
echo "# BigBlueButton does not appear to be installed. Could not"
|
|
echo "# locate: /etc/bigbluebutton/bigbluebutton-release"
|
|
echo
|
|
exit 1
|
|
fi
|
|
|
|
# Load the content of the file as variables
|
|
source /etc/bigbluebutton/bigbluebutton-release
|
|
|
|
#
|
|
# Figure out our environment (Debian vs. CentOS)
|
|
#
|
|
|
|
if [ -f /etc/centos-release ] || [ -f /etc/system-release ]; then
|
|
DISTRIB_ID=centos
|
|
TOMCAT_USER=tomcat
|
|
TOMCAT_DIR=/var/lib/$TOMCAT_USER
|
|
SERVLET_LOGS=/usr/share/tomcat/logs
|
|
REDIS_SERVICE=redis.service
|
|
else
|
|
. /etc/lsb-release # Get value for DISTRIB_ID
|
|
if [ "$DISTRIB_CODENAME" == "focal" ]; then
|
|
TOMCAT_USER=tomcat9
|
|
fi
|
|
TOMCAT_DIR=/var/lib/$TOMCAT_USER
|
|
SERVLET_LOGS=$TOMCAT_DIR/logs
|
|
REDIS_SERVICE=redis-server
|
|
fi
|
|
|
|
# Common to Ubuntu and CentOS
|
|
FREESWITCH_VARS=/opt/freeswitch/etc/freeswitch/vars.xml
|
|
FREESWITCH_EXTERNAL=/opt/freeswitch/etc/freeswitch/sip_profiles/external.xml
|
|
FREESWITCH_PID=/opt/freeswitch/var/run/freeswitch/freeswitch.pid
|
|
FREESWITCH_EVENT_SOCKET=/opt/freeswitch/etc/freeswitch/autoload_configs/event_socket.conf.xml
|
|
|
|
LTI_DIR=/usr/share/bbb-lti
|
|
|
|
if [ -f /usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties ]; then
|
|
SERVLET_DIR=/usr/share/bbb-web
|
|
fi
|
|
|
|
|
|
get_properties_value() {
|
|
key="$1"
|
|
file="$2"
|
|
if [[ -f $file ]]; then
|
|
val=$(grep "^$key" "$file"| cut -d = -f 2-)
|
|
echo "$val"
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
get_bbb_web_config_value() {
|
|
key="$1"
|
|
val="$(get_properties_value "$key" "$BBB_WEB_ETC_CONFIG")"
|
|
if [[ -n $val ]]; then
|
|
echo "$val"
|
|
return 0
|
|
fi
|
|
val="$(get_properties_value "$key" "$BBB_WEB_CONFIG")"
|
|
if [[ -n $val ]]; then
|
|
echo "$val"
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
RECORD_CONFIG=/usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
|
|
|
|
HTML5_DEFAULT_CONFIG=/usr/share/meteor/bundle/programs/server/assets/app/config/settings.yml
|
|
HTML5_ETC_CONFIG=/etc/bigbluebutton/bbb-html5.yml
|
|
if [ -f $HTML5_ETC_CONFIG ]; then
|
|
HTML5_CONFIG=$(yq m -x $HTML5_DEFAULT_CONFIG $HTML5_ETC_CONFIG)
|
|
else
|
|
HTML5_CONFIG=$(yq r $HTML5_DEFAULT_CONFIG)
|
|
fi
|
|
|
|
KURENTO_DEFAULT_CONFIG=/usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml
|
|
KURENTO_ETC_CONFIG=/etc/bigbluebutton/bbb-webrtc-sfu/production.yml
|
|
if [ -f $KURENTO_ETC_CONFIG ]; then
|
|
KURENTO_CONFIG=$(yq m -x $KURENTO_DEFAULT_CONFIG $KURENTO_ETC_CONFIG)
|
|
else
|
|
KURENTO_CONFIG=$(yq r $KURENTO_DEFAULT_CONFIG)
|
|
fi
|
|
|
|
BBB_WEB_CONFIG="$SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties"
|
|
BBB_WEB_ETC_CONFIG="/etc/bigbluebutton/bbb-web.properties"
|
|
NGINX_IP=$(cat /etc/nginx/sites-available/bigbluebutton | grep -v '#' | sed -n '/server_name/{s/.*server_name[ ]*//;s/;//;p}' | cut -d' ' -f1 | head -n 1)
|
|
SIP_CONFIG=/usr/share/bigbluebutton/nginx/sip.nginx
|
|
SIP_NGINX_IP=$(cat $SIP_CONFIG | grep -v '#' | sed -n '/proxy_pass/{s/.*proxy_pass http[s]*:\/\///;s/:.*//;p}' | head -n 1)
|
|
|
|
NCPU=$(nproc --all)
|
|
|
|
BBB_USER=bigbluebutton
|
|
|
|
TURN=$SERVLET_DIR/WEB-INF/classes/spring/turn-stun-servers.xml
|
|
TURN_ETC_CONFIG=/etc/bigbluebutton/turn-stun-servers.xml
|
|
if [ -f "$TURN_ETC_CONFIG" ]; then
|
|
TURN=$TURN_ETC_CONFIG
|
|
fi
|
|
STUN="$(xmlstarlet sel -N x="http://www.springframework.org/schema/beans" -t -m '_:beans/_:bean[@class="org.bigbluebutton.web.services.turn.StunTurnService"]/_:property[@name="stunServers"]/_:set/_:ref' -v @bean -nl $TURN)"
|
|
|
|
PROTOCOL=http
|
|
if [ -f $SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties ]; then
|
|
SERVER_URL=$(get_bbb_web_config_value bigbluebutton.web.serverURL | sed -n '{s/.*\///;p}')
|
|
if get_bbb_web_config_value bigbluebutton.web.serverURL | grep -q https; then
|
|
PROTOCOL=https
|
|
fi
|
|
fi
|
|
|
|
#
|
|
# We're going to give ^bigbluebutton.web.logoutURL a default value (if undefined) so bbb-conf does not give a warning
|
|
#
|
|
if [ -f $SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties ]; then
|
|
if [ -z "$(get_bbb_web_config_value bigbluebutton.web.logoutURL)" ]; then
|
|
echo "bigbluebutton.web.logoutURL=default" >> $BBB_WEB_ETC_CONFIG
|
|
fi
|
|
fi
|
|
|
|
#
|
|
# Determine IP so it works on multilingual installations
|
|
#
|
|
|
|
### duplicated code: see deb-helper.sh and apply-lib.sh
|
|
if [ -e "/sys/class/net/venet0:0" ]; then
|
|
# IP detection for OpenVZ environment
|
|
_dev="venet0:0"
|
|
else
|
|
_dev=$(awk '$2 == 00000000 { print $1 }' /proc/net/route | head -1)
|
|
fi
|
|
_ips=$(LANG=C ip -4 -br address show dev "$_dev" | awk '{ $1=$2=""; print $0 }')
|
|
_ips=${_ips/127.0.0.1\/8/}
|
|
read -r IP _ <<< "$_ips"
|
|
IP=${IP/\/*} # strip subnet provided by ip address
|
|
if [ -z "$IP" ]; then
|
|
read -r IP _ <<< "$(hostname -I)"
|
|
fi
|
|
|
|
#
|
|
# Calculate total memory on this server
|
|
#
|
|
MEM=$(grep MemTotal /proc/meminfo | awk '{print $2}')
|
|
MEM=$((MEM/1000))
|
|
|
|
#
|
|
# Check if the function has a value and, if not, print an error message
|
|
# $1 -- name of value
|
|
# $2 -- location of value
|
|
# $3 -- value to check
|
|
#
|
|
check_no_value() {
|
|
if [ -z $3 ]; then
|
|
echo "# Tried to check $1 in"
|
|
echo "# $2"
|
|
echo "# but value is empty."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
check_file() {
|
|
if [ ! -f $1 ]; then
|
|
echo "# File does not exist: $1"
|
|
fi
|
|
}
|
|
|
|
print_header() {
|
|
if [ ! $HEADER ]; then
|
|
echo
|
|
echo "# Potential problems described below"
|
|
HEADER=1
|
|
fi
|
|
}
|
|
|
|
need_root() {
|
|
if [ $EUID != 0 ]; then
|
|
echo "Need to be root to run this option"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
|
|
|
|
usage() {
|
|
echo "BigBlueButton Configuration Utility - Version $BIGBLUEBUTTON_RELEASE"
|
|
echo
|
|
echo " bbb-conf [options]"
|
|
echo
|
|
echo "Configuration:"
|
|
echo " --version Display BigBlueButton version (packages)"
|
|
echo " --setip <IP/hostname> Set IP/hostname for BigBlueButton"
|
|
echo " --setsecret <secret> Change the shared secret in /etc/bigbluebutton/bbb-web.properties"
|
|
echo
|
|
echo "Monitoring:"
|
|
echo " --check Check configuration files and processes for problems"
|
|
echo " --debug Scan the log files for error messages"
|
|
echo " --watch Scan the log files for error messages every 2 seconds"
|
|
echo " --network View network connections on 80, 443 and 1935 by IP address. 1935 is deprecated. You will need to modify bbb-conf if you have custom ports."
|
|
echo " --secret View the URL and shared secret for the server"
|
|
echo " --lti View the URL and secret for LTI (if installed)"
|
|
echo
|
|
echo "Administration:"
|
|
echo " --restart Restart BigBlueButton"
|
|
echo " --stop Stop BigBlueButton"
|
|
echo " --start Start BigBlueButton"
|
|
echo " --clean Restart and clean all log files"
|
|
echo " --status Display running status of components"
|
|
echo " --zip Zip up log files for reporting an error"
|
|
echo
|
|
}
|
|
|
|
# utility function to make a copy of the conf file
|
|
check_and_backup () {
|
|
# can we write to the configuration file?
|
|
if [ ! -w $1 ]; then
|
|
echo "Cannot write to $1!"
|
|
exit 1
|
|
fi
|
|
|
|
# let's see if we need a copy
|
|
if [ "$TO_BACKUP" = "Y" ]; then
|
|
cp $1 $1.bak
|
|
TO_BACKUP="N"
|
|
fi
|
|
}
|
|
|
|
# 3 paramenter: the file, the variable name, the new value
|
|
change_var_value () {
|
|
check_and_backup $1
|
|
sed -i "s<^[[:blank:]#]*\(${2}\).*<\1=${3}<" $1
|
|
}
|
|
|
|
# same as change_var_value but with quotes
|
|
change_var_salt() {
|
|
check_and_backup $1
|
|
sed -i "s<^[[:blank:]#]*\(${2}\).*<\1="${3}"<" $1
|
|
}
|
|
|
|
# comment lines matching $2 ($1 is the file)
|
|
comment () {
|
|
check_and_backup $1
|
|
sed -i "s<^[[:blank:]]*\(${2}.*\)<#\1<" $1
|
|
}
|
|
|
|
change_yml_value () {
|
|
sed -i "s<^\([[:blank:]#]*\)\(${2}\): .*<\1\2: ${3}<" $1
|
|
}
|
|
|
|
|
|
# comment lines matching $2 ($1 is the file)
|
|
uncomment () {
|
|
check_and_backup $1
|
|
sed -i "s<^[#[:blank:]]*\(${2}.*\)<\1<" $1
|
|
}
|
|
|
|
stop_bigbluebutton () {
|
|
echo "Stopping BigBlueButton"
|
|
|
|
if [ -f /usr/lib/systemd/system/bbb-html5.service ]; then
|
|
HTML5="mongod bbb-html5 bbb-webrtc-sfu kurento-media-server"
|
|
fi
|
|
|
|
if [ -f /usr/lib/systemd/system/bbb-webhooks.service ]; then
|
|
WEBHOOKS=bbb-webhooks
|
|
fi
|
|
|
|
if [ -f /usr/lib/systemd/system/bbb-pads.service ]; then
|
|
PADS=bbb-pads
|
|
fi
|
|
|
|
if [ -f /usr/share/etherpad-lite/settings.json ]; then
|
|
ETHERPAD=etherpad
|
|
fi
|
|
|
|
if [ -f /lib/systemd/system/bbb-web.service ]; then
|
|
BBB_WEB=bbb-web
|
|
fi
|
|
|
|
if [ -f /usr/share/bbb-lti/WEB-INF/classes/lti-config.properties ]; then
|
|
BBB_LTI=bbb-lti
|
|
fi
|
|
|
|
if systemctl list-units --full -all | grep -q $TOMCAT_USER.service; then
|
|
TOMCAT_SERVICE=$TOMCAT_USER
|
|
fi
|
|
|
|
systemctl stop $TOMCAT_SERVICE nginx freeswitch $REDIS_SERVICE bbb-apps-akka bbb-fsesl-akka bbb-rap-resque-worker.service bbb-rap-starter.service bbb-rap-caption-inbox.service $HTML5 $WEBHOOKS $PADS $ETHERPAD $BBB_WEB $BBB_LTI
|
|
}
|
|
|
|
start_bigbluebutton () {
|
|
#
|
|
# Apply any local configuration options (if exists)
|
|
#
|
|
if [ -x /etc/bigbluebutton/bbb-conf/apply-config.sh ]; then
|
|
echo
|
|
echo "Applying updates in /etc/bigbluebutton/bbb-conf/apply-config.sh: "
|
|
/etc/bigbluebutton/bbb-conf/apply-config.sh
|
|
echo
|
|
fi
|
|
|
|
if [ -f /opt/freeswitch/var/log/freeswitch/freeswitch.log ]; then
|
|
if grep -q "Failure to connect to CORE_DB sofia_reg_external" /opt/freeswitch/var/log/freeswitch/freeswitch.log; then
|
|
# See: https://docs.bigbluebutton.org/install/install.html#freeswitch-fails-to-bind-to-ipv4
|
|
echo "Clearing the FreeSWITCH database."
|
|
rm -rf /opt/freeswitch/var/lib/freeswitch/db/*
|
|
fi
|
|
fi
|
|
|
|
echo "Starting BigBlueButton"
|
|
if [ -f /usr/lib/systemd/system/bbb-html5.service ]; then
|
|
HTML5="mongod bbb-html5 bbb-webrtc-sfu kurento-media-server"
|
|
fi
|
|
|
|
if [ -f /usr/lib/systemd/system/bbb-webhooks.service ]; then
|
|
WEBHOOKS=bbb-webhooks
|
|
fi
|
|
|
|
if [ -f /usr/lib/systemd/system/bbb-pads.service ]; then
|
|
PADS=bbb-pads
|
|
fi
|
|
|
|
if [ -f /usr/share/etherpad-lite/settings.json ]; then
|
|
ETHERPAD=etherpad
|
|
fi
|
|
|
|
if [ -f /lib/systemd/system/bbb-web.service ]; then
|
|
BBB_WEB=bbb-web
|
|
fi
|
|
|
|
if [ -f /usr/share/bbb-lti/WEB-INF/classes/lti-config.properties ]; then
|
|
BBB_LTI=bbb-lti
|
|
fi
|
|
|
|
if systemctl list-units --full -all | grep -q $TOMCAT_USER.service; then
|
|
TOMCAT_SERVICE=$TOMCAT_USER
|
|
|
|
[ -z "$TOMCAT_SERVICE" ] || systemctl start $TOMCAT_SERVICE || {
|
|
echo
|
|
echo "# Warning: $TOMCAT_SERVICE could not be started. Please, check BBB-LTI or BBB-Demo."
|
|
echo "# Run the command:"
|
|
echo "# sudo journalctl -u $TOMCAT_SERVICE"
|
|
echo "# To better understand the ERROR"
|
|
}
|
|
fi
|
|
|
|
systemctl start nginx freeswitch $REDIS_SERVICE bbb-apps-akka bbb-fsesl-akka bbb-rap-resque-worker bbb-rap-starter.service bbb-rap-caption-inbox.service $HTML5 $WEBHOOKS $ETHERPAD $PADS $BBB_WEB $BBB_LTI
|
|
|
|
if [ -f /usr/lib/systemd/system/bbb-html5.service ]; then
|
|
systemctl start mongod
|
|
sleep 3
|
|
systemctl start bbb-html5
|
|
fi
|
|
}
|
|
|
|
display_bigbluebutton_status () {
|
|
units="nginx freeswitch $REDIS_SERVICE bbb-apps-akka bbb-fsesl-akka"
|
|
|
|
if [ -d $TOMCAT_DIR ]; then
|
|
units="$units $TOMCAT_USER"
|
|
fi
|
|
|
|
if [ -f /usr/lib/systemd/system/bbb-html5.service ]; then
|
|
units="$units mongod bbb-html5 bbb-webrtc-sfu kurento-media-server"
|
|
|
|
for i in `seq 8888 8890`; do
|
|
# check if multi-kurento setup is configured
|
|
if [ -f /usr/lib/systemd/system/kurento-media-server-${i}.service ]; then
|
|
if systemctl is-enabled kurento-media-server-${i}.service > /dev/null; then
|
|
units="$units kurento-media-server-${i}"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
source /usr/share/meteor/bundle/bbb-html5-with-roles.conf
|
|
|
|
if [ -f /etc/bigbluebutton/bbb-html5-with-roles.conf ]; then
|
|
source /etc/bigbluebutton/bbb-html5-with-roles.conf
|
|
fi
|
|
|
|
for ((i = 1 ; i <= $NUMBER_OF_BACKEND_NODEJS_PROCESSES; i++)); do
|
|
units="$units bbb-html5-backend@$i"
|
|
done
|
|
|
|
for ((i = 1; i <= $NUMBER_OF_FRONTEND_NODEJS_PROCESSES; i++)); do
|
|
units="$units bbb-html5-frontend@$i"
|
|
done
|
|
fi
|
|
|
|
if [ -f /usr/share/etherpad-lite/settings.json ]; then
|
|
units="$units etherpad"
|
|
fi
|
|
|
|
if [ -f /lib/systemd/system/bbb-web.service ]; then
|
|
units="$units bbb-web"
|
|
fi
|
|
|
|
if [ -f /usr/lib/systemd/system/bbb-webhooks.service ]; then
|
|
units="$units bbb-webhooks"
|
|
fi
|
|
|
|
if [ -f /lib/systemd/system/bbb-lti.service ]; then
|
|
units="$units bbb-lti"
|
|
fi
|
|
|
|
if [ -f /usr/lib/systemd/system/bbb-pads.service ]; then
|
|
units="$units bbb-pads"
|
|
fi
|
|
|
|
if [ -f /usr/lib/systemd/system/bbb-rap-caption-inbox.service ]; then
|
|
units="$units bbb-rap-caption-inbox"
|
|
fi
|
|
|
|
if [ -f /lib/systemd/system/bbb-rap-resque-worker.service ]; then
|
|
units="$units bbb-rap-resque-worker"
|
|
fi
|
|
|
|
if [ -f /lib/systemd/system/bbb-rap-starter.service ]; then
|
|
units="$units bbb-rap-starter"
|
|
fi
|
|
|
|
if systemctl list-units --full -all | grep -q $TOMCAT_USER.service; then
|
|
TOMCAT_SERVICE=$TOMCAT_USER
|
|
fi
|
|
|
|
line='——————————————————————►'
|
|
for unit in $units; do
|
|
status=$(systemctl is-active "$unit")
|
|
if [ "$status" = "active" ]; then
|
|
printf "%s %s [✔ - $status]\n" $unit "${line:${#unit}}"
|
|
else
|
|
printf "%s %s [✘ - $status]\n" $unit "${line:${#unit}}"
|
|
fi
|
|
done
|
|
}
|
|
|
|
if [ $# -eq 0 ]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
# Parse the parameters
|
|
while [ $# -gt 0 ]; do
|
|
if [ "$1" = "-stop" -o "$1" = "--stop" ]; then
|
|
need_root
|
|
stop_bigbluebutton
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$1" = "-start" -o "$1" = "--start" ]; then
|
|
need_root
|
|
start_bigbluebutton
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$1" = "-check" -o "$1" = "--check" -o "$1" = "-c" ]; then
|
|
CHECK=1
|
|
shift;shift
|
|
continue
|
|
fi
|
|
|
|
if [ "$1" = "--version" -o "$1" = "-version" -o "$1" = "-v" ]; then
|
|
VERSION=1
|
|
shift
|
|
continue
|
|
fi
|
|
|
|
if [ "$1" = "--debug" -o "$1" = "-debug" -o "$1" = "-d" ]; then
|
|
DEBUG=1
|
|
shift
|
|
continue
|
|
fi
|
|
|
|
if [ "$1" = "--clean" -o "$1" = "-clean" ]; then
|
|
CLEAN=1
|
|
shift
|
|
continue
|
|
fi
|
|
|
|
if [ "$1" = "--watch" -o "$1" = "-watch" -o "$1" = "-w" ]; then
|
|
WATCH=1
|
|
shift
|
|
continue
|
|
fi
|
|
|
|
if [ "$1" = "--network" -o "$1" = "-network" -o "$1" = "-n" ]; then
|
|
NETWORK=1
|
|
shift
|
|
continue
|
|
fi
|
|
|
|
if [ "$1" = "--zip" -o "$1" = "-zip" -o "$1" = "-z" ]; then
|
|
ZIP=1
|
|
shift
|
|
continue
|
|
fi
|
|
|
|
if [ "$1" = "--status" -o "$1" = "-status" ]; then
|
|
display_bigbluebutton_status
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$1" = "--restart" -o "$1" = "-restart" ]; then
|
|
RESTART=1
|
|
shift
|
|
continue
|
|
fi
|
|
|
|
#
|
|
# all other parameters requires at least 1 argument
|
|
#
|
|
|
|
if [ "$1" = "-setip" -o "$1" = "--setip" ]; then
|
|
HOST="${2}"
|
|
if [ -z "$HOST" ]; then
|
|
echo "HOST IP=$IP"
|
|
fi
|
|
|
|
if echo $HOST|grep -q ":"; then
|
|
HOST=$(echo ${2}|cut -d: -f1)
|
|
fi
|
|
shift; shift
|
|
continue
|
|
fi
|
|
|
|
if [ "$1" = "--salt" -o "$1" = "-salt" -o "$1" = "--setsalt" -o "$1" = "--secret" -o "$1" = "-secret" -o "$1" = "--setsecret" ]; then
|
|
SECRET="${2}"
|
|
if [ -z "$SECRET" ]; then
|
|
BBB_WEB_URL=$(get_bbb_web_config_value bigbluebutton.web.serverURL)
|
|
SECRET=$(get_bbb_web_config_value securitySalt)
|
|
echo
|
|
echo " URL: $BBB_WEB_URL/bigbluebutton/"
|
|
echo " Secret: $SECRET"
|
|
echo
|
|
echo " Link to the API-Mate:"
|
|
echo " https://mconf.github.io/api-mate/#server=$BBB_WEB_URL/bigbluebutton/&sharedSecret=$SECRET"
|
|
echo
|
|
exit 0
|
|
fi
|
|
shift; shift
|
|
continue
|
|
fi
|
|
|
|
if [ "$1" = "--lti" -o "$1" = "-lti" ]; then
|
|
if [ -z "$SECRET" ]; then
|
|
if [ -f ${LTI_DIR}/WEB-INF/classes/lti-config.properties ]; then
|
|
LTI_URL="${PROTOCOL}://"$(cat ${LTI_DIR}/WEB-INF/classes/lti-config.properties | grep -v '#' | sed -n '/^ltiEndPoint/{s/^.*=//;p}')'/lti/tool'
|
|
CUSTOMER=$(cat ${LTI_DIR}/WEB-INF/classes/lti-config.properties | grep -v '#' | sed -n '/^ltiConsumer/{s/^.*=//;s/:.*//p}')
|
|
SECRET=$(cat ${LTI_DIR}/WEB-INF/classes/lti-config.properties | grep -v '#' | sed -n '/^ltiConsumer/{s/^[^:]*://;p}')
|
|
echo
|
|
echo " URL: $LTI_URL"
|
|
echo " Customer: $CUSTOMER"
|
|
echo " Secret: $SECRET"
|
|
echo
|
|
ICON_URL=$( echo $LTI_URL | sed 's/tool/images\/icon.ico/')
|
|
echo " Icon URL: $ICON_URL"
|
|
echo
|
|
echo
|
|
exit 0
|
|
fi
|
|
fi
|
|
shift; shift
|
|
continue
|
|
fi
|
|
|
|
usage
|
|
exit 1
|
|
done
|
|
|
|
print_bigbluebutton_version() {
|
|
echo
|
|
if [ $DISTRIB_ID == "centos" ]; then
|
|
echo "BigBlueButton Server $BIGBLUEBUTTON_RELEASE ($(rpm -qa | grep bbb | grep -v bbb-demo | grep -v bbb-lti | grep -v bbb-redis | grep -v bbb-tomcat | grep -v freeswitch | sed 's/.*[0-9].[0-9].[0-9]-//g' | sed 's/\..*//g' | awk '{ sum+=$1} END {print sum}'))"
|
|
else
|
|
echo "BigBlueButton Server $BIGBLUEBUTTON_RELEASE ($(dpkg -l | grep bbb | grep -v bbb-demo | grep -v bbb-lti | sed -n '/[0-9].[0-9].[0-9]-/{s/.*[0-9].[0-9].[0-9]-//;s/;//;p}' | awk '{ sum+=$1} END {print sum}'))"
|
|
fi
|
|
}
|
|
|
|
|
|
#
|
|
# Version
|
|
#
|
|
if [[ $VERSION ]]; then
|
|
print_bigbluebutton_version
|
|
echo
|
|
dpkg -l | grep bbb
|
|
exit 0
|
|
fi
|
|
|
|
|
|
#
|
|
# Set Shared Secret
|
|
#
|
|
|
|
if [[ $SECRET ]]; then
|
|
need_root
|
|
|
|
echo "Assigning secret in $BBB_WEB_ETC_CONFIG"
|
|
if [ -f "$BBB_WEB_ETC_CONFIG" ] && grep "^securitySalt" "$BBB_WEB_ETC_CONFIG" > /dev/null ; then
|
|
change_var_value "$BBB_WEB_ETC_CONFIG" securitySalt "$SECRET"
|
|
else
|
|
echo "securitySalt=$SECRET" >> "$BBB_WEB_ETC_CONFIG"
|
|
fi
|
|
|
|
if [ -f /usr/local/bigbluebutton/bbb-webhooks/config/default.yml ]; then
|
|
change_yml_value /usr/local/bigbluebutton/bbb-webhooks/config/default.yml sharedSecret $SECRET
|
|
fi
|
|
|
|
if [ -f /usr/local/bigbluebutton/bbb-webhooks/extra/post_catcher.js ]; then
|
|
sed -i "s|\(^[ \t]*var shared_secret[ =]*\)[^;]*|\1\"$SECRET\"|g" /usr/local/bigbluebutton/bbb-webhooks/extra/post_catcher.js
|
|
fi
|
|
|
|
if [ -f /etc/bigbluebutton/bbb-apps-akka.conf ]; then
|
|
sed -i "s/sharedSecret[ ]*=[ ]*\"[^\"]*\"/sharedSecret=\"$SECRET\"/g" /etc/bigbluebutton/bbb-apps-akka.conf
|
|
fi
|
|
|
|
if [ -f ${LTI_DIR}/WEB-INF/classes/lti-config.properties ]; then
|
|
sed -i "s/bigbluebuttonSalt=.*/bigbluebuttonSalt=$SECRET/g" ${LTI_DIR}/WEB-INF/classes/lti-config.properties
|
|
fi
|
|
|
|
echo
|
|
echo "BigBlueButton's shared secret is now $SECRET"
|
|
echo
|
|
echo "You must restart BigBlueButton for the changes to take effect"
|
|
echo
|
|
echo " $SUDO bbb-conf --restart"
|
|
echo
|
|
echo
|
|
fi
|
|
|
|
check_configuration() {
|
|
#
|
|
# Check that freeswtich ESL matches the value in bigbluebutton.properties
|
|
#
|
|
if [ -f $FREESWITCH_EVENT_SOCKET ]; then
|
|
FREESWITCH_ESL_IP=$(cat $FREESWITCH_EVENT_SOCKET | grep 'name="listen-ip"' | cut -d\" -f4 | awk '{print $1}')
|
|
check_no_value event_socket $FREESWITCH_EVENT_SOCKET $FREESWITCH_ESL_IP
|
|
fi
|
|
|
|
#
|
|
# Check if BigBlueButton is defined in Nginx
|
|
#
|
|
if [ ! -L /etc/nginx/sites-enabled/bigbluebutton ]; then
|
|
echo "# Nginx: BigBlueButton appears to be disabled"
|
|
echo " - no symbolic link in /etc/nginx/sites-enabled/bigbluebutton to /etc/nginx/sites-available/bigbluebutton "
|
|
fi
|
|
|
|
#
|
|
# Look for properties with no values set
|
|
#
|
|
CONFIG_FILES="$SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties"
|
|
|
|
for file in $CONFIG_FILES ; do
|
|
if [ ! -f $file ]; then
|
|
echo "# Error: File not found: $file"
|
|
else
|
|
if cat $file | grep -v redis.pass | grep -v redisPassword | grep -v ^# | grep -q "^[^=]*=[ ]*$"; then
|
|
echo "# The following properties in $file have no value:"
|
|
echo "# $(grep '^[^=#]*=[ ]*$' $file | grep -v redis.pass | grep -v redisPassword | sed 's/=//g')"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
VARFolder="$(get_bbb_web_config_value imageMagickDir)"
|
|
if [ ! -x $VARFolder/convert ]; then
|
|
echo "# ImageMagick's convert is not installed in $VARFolder"
|
|
fi
|
|
|
|
#
|
|
# Check if the IP resolves to a different host
|
|
#
|
|
check_no_value server_name /etc/nginx/sites-available/bigbluebutton $NGINX_IP
|
|
|
|
if which host > /dev/null 2>&1; then
|
|
HOSTS=$(which host)
|
|
if [ $HOSTS ]; then
|
|
HOSTS=$($HOSTS $NGINX_IP | awk '{ print $4 }' | head -n 1)
|
|
fi
|
|
fi
|
|
|
|
|
|
BBB_SECRET="$(get_bbb_web_config_value securitySalt)"
|
|
|
|
if [ -f /var/lib/$TOMCAT_USER/webapps/demo/bbb_api_conf.jsp ]; then
|
|
#
|
|
# Make sure the shared secret for the API matches the server
|
|
#
|
|
SECRET_DEMO=$(cat ${TOMCAT_DIR}/webapps/demo/bbb_api_conf.jsp | grep -v '^//' | tr -d '\r' | sed -n '/salt[ ]*=/{s/.*=[ ]*"//;s/".*//g;p}')
|
|
|
|
if [ "$BBB_SECRET" != "$SECRET_DEMO" ]; then
|
|
echo "#"
|
|
echo "# Warning: API Shared Secret mismatch: "
|
|
echo "#"
|
|
echo "# $BBB_WEB_ETC_CONFIG = $BBB_SECRET"
|
|
echo "# /var/lib/$TOMCAT_USER/webapps/demo/bbb_api_conf.jsp = $SECRET_DEMO"
|
|
echo "#"
|
|
echo "# You need to edit bbb_api_conf.jsp to have the same shared secret defined in bigbluebutton.properties"
|
|
echo "#"
|
|
echo
|
|
fi
|
|
|
|
if ! grep -q https ${TOMCAT_DIR}/webapps/demo/bbb_api_conf.jsp; then
|
|
echo
|
|
echo "# Warning: Did not detect https for API demos in "
|
|
echo "#"
|
|
echo "# ${TOMCAT_DIR}/webapps/demo/bbb_api_conf.jsp"
|
|
echo "#"
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
if [ -f /usr/lib/systemd/system/bbb-webhooks.service ]; then
|
|
WEBHOOKS_CONF=/usr/local/bigbluebutton/bbb-webhooks/config/default.yml
|
|
WEBHOOKS_SECRET=$(yq r $WEBHOOKS_CONF bbb.sharedSecret)
|
|
|
|
if [ "$BBB_SECRET" != "$WEBHOOKS_SECRET" ]; then
|
|
echo "# Warning: Webhooks API Shared Secret mismatch: "
|
|
echo "# ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties = $BBB_SECRET"
|
|
echo "# $WEBHOOKS_CONF = $WEBHOOKS_SECRET"
|
|
echo
|
|
fi
|
|
|
|
WEBHOOKS_PROXY_PORT=$(cat /usr/share/bigbluebutton/nginx/webhooks.nginx | grep -v '#' | grep '^[ \t]*proxy_pass[ \t]*' | sed 's|.*http[s]\?://[^:]*:\([^;]*\);.*|\1|g')
|
|
WEBHOOKS_APP_PORT=$(yq r $WEBHOOKS_CONF server.port)
|
|
|
|
if [ "$WEBHOOKS_PROXY_PORT" != "$WEBHOOKS_APP_PORT" ]; then
|
|
echo "# Warning: Webhooks port mismatch: "
|
|
echo "# /usr/share/bigbluebutton/nginx/webhooks.nginx = $WEBHOOKS_PROXY_PORT"
|
|
echo "# $WEBHOOKS_CONF = $WEBHOOKS_APP_PORT"
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
|
|
if [ -f ${LTI_DIR}/WEB-INF/classes/lti-config.properties ]; then
|
|
LTI_SECRET=$(cat ${LTI_DIR}/WEB-INF/classes/lti-config.properties | grep -v '#' | tr -d '\r' | sed -n '/^bigbluebuttonSalt/{s/.*=//;p}')
|
|
|
|
if [ "$LTI_SECRET" != "$BBB_SECRET" ]; then
|
|
echo "# Warning: LTI shared secret mismatch:"
|
|
echo "# ${LTI_DIR}/WEB-INF/classes/lti-config.properties = $LTI_SECRET"
|
|
echo "# ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties = $BBB_SECRET"
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
SIP_PROTOCOL=$(cat /usr/share/bigbluebutton/nginx/sip.nginx | grep -v \# | sed -n '/proxy_pass/{s/.*proxy_pass [ ]*//;s/:.*//;p}' | head -n 1)
|
|
if [[ $SIP_PROTOCOL == "https" ]]; then
|
|
if ! grep wss-binding $FREESWITCH_EXTERNAL > /dev/null; then
|
|
echo "# Warning: Websockets is using HTTPS in /usr/share/bigbluebutton/nginx/sip.nginx"
|
|
echo "# but no definition for wss-binding found in "
|
|
echo "#"
|
|
echo "# $FREESWITCH_EXTERNAL"
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
if [ "$(ls -ld /var/freeswitch/meetings | cut -d' ' -f3)" != "freeswitch" ]; then
|
|
echo "# Warning: Detected the directory"
|
|
echo "# /var/freeswitch/meetings"
|
|
echo "# is not owned by freeswitch"
|
|
fi
|
|
|
|
if [ "$(ls -ld /var/bigbluebutton | cut -d' ' -f3)" != $BBB_USER ]; then
|
|
echo "# Warning: Detected the directory"
|
|
echo "# /var/bigbluebutton"
|
|
echo "# is not owned by $BBB_USER"
|
|
fi
|
|
|
|
if [ -n "$HTML5_CONFIG" ]; then
|
|
SVG_IMAGES_REQUIRED=$(cat $BBB_WEB_CONFIG | grep -v '#' | sed -n '/^svgImagesRequired/{s/.*=//;p}')
|
|
if [ "$SVG_IMAGES_REQUIRED" != "true" ]; then
|
|
echo
|
|
echo "# Warning: You have the HTML5 client installed but in"
|
|
echo "#"
|
|
echo "# $BBB_WEB_CONFIG"
|
|
echo "#"
|
|
echo "# the setting for svgImagesRequired is false. To fix, run the commnad"
|
|
echo "#"
|
|
echo "# sed -i 's/^svgImagesRequired=.*/svgImagesRequired=true/' $BBB_WEB_CONFIG "
|
|
echo "#"
|
|
fi
|
|
fi
|
|
|
|
CHECK_STUN=$(xmlstarlet sel -t -m '//X-PRE-PROCESS[@cmd="set" and starts-with(@data, "external_rtp_ip=")]' -v @data $FREESWITCH_VARS | sed 's/external_rtp_ip=stun://g')
|
|
if [ "$CHECK_STUN" == "stun.freeswitch.org" ]; then
|
|
echo
|
|
echo "# Warning: Detected FreeSWITCH is using default stun.freeswitch.org server. See"
|
|
echo "#"
|
|
echo "# https://docs.bigbluebutton.org/2.2/troubleshooting.html#freeswitch-using-default-stun-server"
|
|
echo "#"
|
|
echo
|
|
fi
|
|
|
|
if ! which ufw > /dev/null 2>&1; then
|
|
echo
|
|
echo "# Warning: No firewall detected. Recommend using setting up a firewall for your server"
|
|
echo "#"
|
|
echo "# https://docs.bigbluebutton.org/admin/customize.html#setup-a-firewall"
|
|
echo "#"
|
|
echo
|
|
fi
|
|
|
|
}
|
|
|
|
check_state() {
|
|
echo
|
|
print_header
|
|
check_configuration
|
|
|
|
#
|
|
# Check for potential problems in the BigBlueButton configuration
|
|
#
|
|
|
|
RUNNING_APPS=""
|
|
NOT_RUNNING_APPS=""
|
|
|
|
if [[ -a $FREESWITCH_PID ]]; then
|
|
if ! ps aux | grep -v grep | grep '[/]opt/freeswitch/bin/freeswitch' > /dev/null; then
|
|
print_header
|
|
NOT_RUNNING_APPS="${NOT_RUNNING_APPS} freeswitch"
|
|
else
|
|
RUNNING_APPS="${RUNNING_APPS} freeswitch"
|
|
fi
|
|
fi
|
|
|
|
if ! ps aux | grep -v grep | grep '[/]usr/sbin/nginx' > /dev/null; then
|
|
print_header
|
|
NOT_RUNNING_APPS="${NOT_RUNNING_APPS} Nginx"
|
|
else
|
|
RUNNING_APPS="${RUNNING_APPS} Nginx"
|
|
fi
|
|
|
|
if ! ss -ant | grep '8090' > /dev/null; then
|
|
print_header
|
|
NOT_RUNNING_APPS="${NOT_RUNNING_APPS} ${TOMCAT_USER} or grails"
|
|
else
|
|
if ps aux | ps -aef | grep -v grep | grep grails | grep run-app > /dev/null; then
|
|
print_header
|
|
RUNNING_APPS="${RUNNING_APPS} Grails"
|
|
echo "# ${TOMCAT_USER}: noticed you are running grails run-app instead of ${TOMCAT_USER}"
|
|
else
|
|
RUNNING_APPS="${RUNNING_APPS} ${TOMCAT_USER}"
|
|
fi
|
|
fi
|
|
|
|
if ! ps aux | grep -v grep | grep '[/]usr/[s]*bin/redis-server' > /dev/null; then
|
|
print_header
|
|
NOT_RUNNING_APPS="${NOT_RUNNING_APPS} redis-server"
|
|
else
|
|
RUNNING_APPS="${RUNNING_APPS} redis-server"
|
|
fi
|
|
|
|
if [ "$NOT_RUNNING_APPS" != "" ]; then
|
|
echo "# Not running: ${NOT_RUNNING_APPS}"
|
|
fi
|
|
|
|
|
|
#
|
|
# Check if running development environment
|
|
#
|
|
if ! grep 8090 /usr/share/bigbluebutton/nginx/web.nginx > /dev/null; then
|
|
echo "# Warning: nginx is not serving BigBlueButton's web application"
|
|
echo "# from port 8090"
|
|
echo "#"
|
|
echo "# (This is OK if you have setup a development environment.) "
|
|
echo
|
|
fi
|
|
|
|
|
|
#
|
|
# Check FreeSWITCH
|
|
#
|
|
if grep -q "Thread ended for mod_event_socket" /opt/freeswitch/var/log/freeswitch/freeswitch.log; then
|
|
echo
|
|
echo "# Error: Found text in freeswitch.log:"
|
|
echo "#"
|
|
echo "# Thread ended for mod_event_socket"
|
|
echo "#"
|
|
echo "# FreeSWITCH may not be responding to requests on port 8021 (event socket layer)"
|
|
echo "# and users may have errors joining audio."
|
|
echo "#"
|
|
fi
|
|
|
|
#
|
|
# Check FreeSWITCH
|
|
#
|
|
|
|
ESL_PASSWORD=$(xmlstarlet sel -t -m 'configuration/settings/param[@name="password"]' -v @value /opt/freeswitch/etc/freeswitch/autoload_configs/event_socket.conf.xml)
|
|
if ! echo "/quit" | /opt/freeswitch/bin/fs_cli -p $ESL_PASSWORD - > /dev/null 2>&1; then
|
|
echo
|
|
echo "#"
|
|
echo "# Error: Unable to connect to the FreeSWITCH Event Socket Layer on port 8021"
|
|
echo "#"
|
|
fi
|
|
|
|
#
|
|
# Check for required external commands
|
|
#
|
|
COMMANDS="ruby gem pdftocairo"
|
|
for cmd in $COMMANDS ; do
|
|
if ! which $cmd > /dev/null 2>&1; then
|
|
echo "# $cmd command not found"
|
|
fi
|
|
done
|
|
|
|
#
|
|
# Check if ffmpeg is installed, and whether it is a supported version
|
|
#
|
|
FFMPEG_VERSION=$(ffmpeg -version 2>/dev/null | grep ffmpeg | cut -d ' ' -f3 | sed 's/--.*//g' | tr -d '\n')
|
|
case "$FFMPEG_VERSION" in
|
|
4.*.*)
|
|
# This is the current supported version; OK.
|
|
;;
|
|
'')
|
|
echo "# Warning: No ffmpeg version was found on the system"
|
|
echo "# Recording processing will not function"
|
|
echo
|
|
;;
|
|
*)
|
|
echo "# Warning: The installed ffmpeg version '${FFMPEG_VERSION}' is not recommended."
|
|
echo "# Recommend you update to the 4.0.x version of ffmpeg. To upgrade, do the following"
|
|
echo "#"
|
|
echo "# $SUDO apt-get install software-properties-common"
|
|
echo "# $SUDO add-apt-repository ppa:jonathonf/ffmpeg-4"
|
|
echo "# $SUDO apt-get update"
|
|
echo "# $SUDO apt-get dist-upgrade"
|
|
echo "#"
|
|
echo
|
|
;;
|
|
esac
|
|
|
|
|
|
#
|
|
# Check that the servlet container has started properly and has created log files
|
|
#
|
|
if [ -d $TOMCAT_DIR ]; then
|
|
if [ -z "$(ls -A $SERVLET_LOGS)" ]; then
|
|
echo "# empty directory: $SERVLET_LOGS contains no logs"
|
|
fi
|
|
fi
|
|
|
|
#
|
|
# Check if the user is running their own bbb-web
|
|
#
|
|
if grep -q 8888 /usr/share/bigbluebutton/nginx/web.nginx; then
|
|
if ! ss -ant | grep '8888' > /dev/null; then
|
|
echo "# Warning: There is no application server listening to port 8888."
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
|
|
#
|
|
# Check if the local server can access the API. This is a common problem when setting up BigBlueButton behind
|
|
# a firewall
|
|
#
|
|
BBB_WEB="$(get_bbb_web_config_value bigbluebutton.web.serverURL|sed -n '{s/.*\///;p}')"
|
|
check_no_value server_name /etc/nginx/sites-available/bigbluebutton $BBB_WEB
|
|
|
|
COUNT=0
|
|
while [ $COUNT -lt 80 ]; do
|
|
let COUNT=COUNT+1
|
|
timeout 1s curl -sS $PROTOCOL://$BBB_WEB/bigbluebutton/api | grep -q SUCCESS
|
|
if [ $? -eq 0 ]; then
|
|
let COUNT=80
|
|
else
|
|
echo -n "."
|
|
sleep 1
|
|
fi
|
|
done
|
|
echo
|
|
|
|
if ! curl -sS $PROTOCOL://$BBB_WEB/bigbluebutton/api | grep -q SUCCESS; then
|
|
echo "# Error: Could not connect to the configured hostname/IP address"
|
|
echo "#"
|
|
echo "# $PROTOCOL://$BBB_WEB/"
|
|
echo "#"
|
|
echo "# If your BigBlueButton server is behind a firewall, see FAQ."
|
|
echo
|
|
fi
|
|
|
|
VARS_IP=$(cat $FREESWITCH_VARS | sed -n '/"local_ip_v4/{s/.*local_ip_v4=//;s/".*//;p}')
|
|
if [[ "$VARS_IP" != "127.0.0.1" ]] && [[ "$VARS_IP" != "auto" ]]; then
|
|
if [ "$VARS_IP" != $IP ]; then
|
|
echo "# Warning: The setting of $VARS_IP for local_ip_v4 in"
|
|
echo "#"
|
|
echo "# $FREESWITCH_VARS"
|
|
echo "#"
|
|
echo "# does not match the local IP address ($IP)."
|
|
echo "# (This is OK if you've manually changed the values)"
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
if [ -d ${TOMCAT_DIR}/webapps/demo ]; then
|
|
if test ${TOMCAT_DIR}/webapps/demo.war -nt ${TOMCAT_DIR}/webapps/demo; then
|
|
echo "# Error: The updated demo.war did not deploy. To manually deploy:"
|
|
echo "#"
|
|
echo "# $SUDO touch ${SERVLET_DIR}/demo.war"
|
|
echo "#"
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
if (( $MEM < 3940 )); then
|
|
echo "# Warning: You are running BigBlueButton on a server with less than 4G of memory. Your"
|
|
echo "# performance may suffer."
|
|
echo
|
|
fi
|
|
|
|
BBB_WEB="$(get_bbb_web_config_value bigbluebutton.web.serverURL)"
|
|
if [ -f ${TOMCAT_DIR}/webapps/demo/demo1.jsp ]; then
|
|
echo "# Warning: The API demos are installed and accessible from:"
|
|
echo "#"
|
|
echo "# $BBB_WEB"
|
|
echo "#"
|
|
echo "# and"
|
|
echo "#"
|
|
echo "# $BBB_WEB/demo/demo1.jsp"
|
|
echo "#"
|
|
echo "# These API demos allow anyone to access your server without authentication"
|
|
echo "# to create/manage meetings and recordings. They are for testing purposes only."
|
|
echo "# If you are running a production system, remove them by running:"
|
|
echo "#"
|
|
echo "# $SUDO apt-get purge bbb-demo"
|
|
echo
|
|
fi
|
|
|
|
if [ -f ${LTI_DIR}/WEB-INF/classes/lti-config.properties ]; then
|
|
LTI_URL="${PROTOCOL}://"$(cat ${LTI_DIR}/WEB-INF/classes/lti-config.properties | grep -v '#' | sed -n '/^ltiEndPoint/{s/^.*=//;p}')'/lti/tool'
|
|
echo "# Warning: The IMS Learning Tools Integration (LTI) is accessible from:"
|
|
echo "#"
|
|
echo "# $LTI_URL"
|
|
echo "#"
|
|
echo "# To get the access parameters for LTI, run the command"
|
|
echo "#"
|
|
echo "# bbb-conf --lti"
|
|
echo
|
|
fi
|
|
|
|
DEFAULT_PDF="$(get_bbb_web_config_value beans.presentationService.defaultUploadedPresentation)"
|
|
if echo $DEFAULT_PDF | grep -q "bigbluebutton.web.serverURL"; then
|
|
if ! echo "$BBB_WEB$(echo $DEFAULT_PDF | sed 's/${bigbluebutton.web.serverURL}//g')" | xargs curl -sS >/dev/null; then
|
|
echo "# Error: Unable to reach default URL for presentation:"
|
|
echo "#"
|
|
echo "# $BBB_WEB$(echo $DEFAULT_PDF | sed 's/${bigbluebutton.web.serverURL}//g')"
|
|
echo "#"
|
|
echo "# Check value for beans.presentationService.defaultUploadedPresentation in"
|
|
echo "# $BBB_WEB_CONFIG and $BBB_WEB_ETC_CONFIG"
|
|
fi
|
|
else
|
|
if ! echo "$DEFAULT_PDF" | xargs curl -sS >/dev/null; then
|
|
echo "# Error: Unable to reach default URL for presentation"
|
|
echo "#"
|
|
echo "# $DEFAULT_PDF"
|
|
echo "#"
|
|
echo "# Check value for beans.presentationService.defaultUploadedPresentation in"
|
|
echo "# $BBB_WEB_CONFIG and $BBB_WEB_ETC_CONFIG"
|
|
fi
|
|
fi
|
|
|
|
if [ "$(cat /etc/bigbluebutton/bbb-apps-akka.conf | sed -n '/sharedSecret.*/{s/[^"]*"//;s/".*//;p}')" == "changeme" ]; then
|
|
BBB_WEB_IP="$(get_bbb_web_config_value bigbluebutton.web.serverURL|sed -n '{s/.*\///;p}')"
|
|
echo "# Error: Detected that /etc/bigbluebutton/bbb-apps-akka.conf has the default"
|
|
echo "# configuration values. To update, run"
|
|
echo "#"
|
|
echo "# $SUDO bbb-conf --setip $BBB_WEB_IP"
|
|
echo "#"
|
|
fi
|
|
|
|
if bbb-conf --status | grep -q inactive; then
|
|
|
|
if systemctl list-units --full -all | grep -q $TOMCAT_USER.service; then
|
|
TOMCAT_SERVICE=$TOMCAT_USER
|
|
|
|
if bbb-conf --status | grep -q inactive | grep -q $TOMCAT_SERVICE; then
|
|
echo "# Warning: $TOMCAT_SERVICE is not started correctly"
|
|
echo "#"
|
|
fi
|
|
fi
|
|
|
|
if bbb-conf --status | grep inactive; then
|
|
echo "# Error: Detected some processes have not started correctly"
|
|
echo "#"
|
|
echo "# $(bbb-conf --status | grep inactive)"
|
|
echo "#"
|
|
fi
|
|
fi
|
|
|
|
if systemctl status freeswitch | grep -q SETSCHEDULER; then
|
|
echo "# Error: FreeSWITCH failed to start with SETSCHEDULER error, see"
|
|
echo "#"
|
|
echo "# https://docs.bigbluebutton.org/2.2/troubleshooting.html#freeswitch-fails-to-start-with-a-setscheduler-error"
|
|
echo "#"
|
|
fi
|
|
|
|
NCPU=$(nproc --all)
|
|
if [ "$NCPU" -lt "4" ]; then
|
|
echo "# Warning: found only $NCPU cores, whereas this server should have (at least) 4 CPU cores"
|
|
echo "# to run BigBlueButton in production."
|
|
echo "#"
|
|
echo "# https://docs.bigbluebutton.org/install/install.html#minimum-server-requirements"
|
|
echo "#"
|
|
fi
|
|
|
|
if [ "$(echo "$HTML5_CONFIG" | yq r - public.media.sipjsHackViaWs)" != "true" ]; then
|
|
if [ "$PROTOCOL" == "https" ]; then
|
|
if ! cat $SIP_CONFIG | grep -v '#' | grep proxy_pass | head -n 1 | grep -q https; then
|
|
echo "# Warning: You have this server defined for https, but in"
|
|
echo "#"
|
|
echo "# $SIP_CONFIG"
|
|
echo "#"
|
|
echo "# did not find the use of https in definition for proxy_pass"
|
|
echo "#"
|
|
echo "# $(cat $SIP_CONFIG | grep -v '#' | grep proxy_pass | head -n 1)"
|
|
echo "#"
|
|
fi
|
|
|
|
if [ "$SIP_NGINX_IP" != $IP ]; then
|
|
if [ "$SIP_NGINX_IP" != "\$freeswitch_addr" ]; then
|
|
echo "# Warning: The setting of $SIP_NGINX_IP for proxy_pass in"
|
|
echo "#"
|
|
echo "# /usr/share/bigbluebutton/nginx/sip.nginx"
|
|
echo "#"
|
|
echo "# does not match the local IP address ($IP)."
|
|
echo "# (This is OK if you've manually changed the values)"
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
if ! cat $SIP_CONFIG | grep -v '#' | grep proxy_pass | head -n 1 | grep -q 7443; then
|
|
echo
|
|
echo "# Warning: You have this server defined for https, but in"
|
|
echo "#"
|
|
echo "# $SIP_CONFIG"
|
|
echo "#"
|
|
echo "# did not find the use of port 7443 in definition for proxy_pass"
|
|
echo "#"
|
|
echo "# $(cat $SIP_CONFIG | grep -v '#' | grep proxy_pass | head -n 1)"
|
|
echo "#"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
CHECK="$(get_bbb_web_config_value securitySalt|sha1sum |cut -d' ' -f1)"
|
|
if [ "$CHECK" == "55b727b294158a877212570c3c0524c2b902a62c" ]; then
|
|
echo
|
|
echo "#"
|
|
echo "# Warning: Detected you have the default shared secret. You MUST change your shared"
|
|
echo "# secret NOW for BigBlueButton to finish starting up. Do either"
|
|
echo "#"
|
|
echo "# sudo bbb-conf --setsecret <secret>"
|
|
echo "#"
|
|
echo "# or, to have openssl generate a strong secret for you (recommended)"
|
|
echo "#"
|
|
echo "# sudo bbb-conf --setsecret \$(openssl rand -base64 32 | sed 's/=//g' | sed 's/+//g' | sed 's/\///g')"
|
|
echo "#"
|
|
echo "# Be sure to update any integrations with the new shared secret."
|
|
echo "#"
|
|
systemctl stop bbb-web
|
|
exit 1
|
|
fi
|
|
|
|
if ! systemctl show-environment | grep LANG= | grep -q UTF-8; then
|
|
echo
|
|
echo "#"
|
|
echo "# Warning: Detected that systemctl does not define a UTF-8 language."
|
|
echo "#"
|
|
echo "# To temporarily correct, run the command "
|
|
echo "#"
|
|
echo "# sudo systemctl set-environment LANG=en_US.UTF-8"
|
|
echo "#"
|
|
echo "# See https://docs.bigbluebutton.org/2.2/install.html#pre-installation-checks"
|
|
echo "#"
|
|
fi
|
|
|
|
if [ "$(stat -c "%U %G" /var/bigbluebutton)" != "bigbluebutton bigbluebutton" ]; then
|
|
echo
|
|
echo "#"
|
|
echo "# Warning: The directory"
|
|
echo "#"
|
|
echo "# /var/bigbluebutton"
|
|
echo "#"
|
|
echo "# is not owned by bigbluebutton:bigbluebutton. To fix, run the command"
|
|
echo "#"
|
|
echo "# sudo chown -R bigbluebutton:bigbluebutton /var/bigbluebutton"
|
|
echo "#"
|
|
fi
|
|
|
|
FREESWITCH_SIP=$(ss -anlt4 | grep :5066 | grep -v tcp6 | grep LISTEN | sed 's/ [ ]*/ /g' | cut -d' ' -f4 | sed 's/:5066//g')
|
|
KURENTO_SIP=$(echo "$KURENTO_CONFIG" | yq r - freeswitch.sip_ip)
|
|
|
|
if [ ! -z "$FREESWITCH_SIP" ]; then
|
|
if [ "$FREESWITCH_SIP" != "$KURENTO_SIP" ]; then
|
|
echo
|
|
echo "#"
|
|
echo "# Kurento will try to connect to $KURENTO_SIP but FreeSWITCH is listening on $FREESWITCH_SIP for port 5066"
|
|
echo "#"
|
|
echo "# To fix, run the commands"
|
|
echo "#"
|
|
echo "# sudo yq w -i /usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml freeswitch.sip_ip $FREESWITCH_SIP"
|
|
echo "# sudo chown bigbluebutton:bigbluebutton /usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml"
|
|
echo "#"
|
|
fi
|
|
fi
|
|
|
|
if [ ! -z "$STUN" ]; then
|
|
for i in $STUN; do
|
|
STUN_SERVER="$(xmlstarlet sel -N x="http://www.springframework.org/schema/beans" -t -m "_:beans/_:bean[@id=\"$i\"]/_:constructor-arg[@index=\"0\"]" -v @value $TURN | sed 's/stun://g')"
|
|
|
|
# stun is from the stun-client package, which is available on both bionic and focal
|
|
# stunclient is from the stuntman-client package, which is available on bionic but was removed from focal
|
|
if which stun > /dev/null 2>&1; then
|
|
# stun return codes, from its client.cxx
|
|
# low nibble: open (0), various STUN combinations (2-9), firewall (a), blocked (c), unknown (e), error (f)
|
|
# high nibble: hairpin (1)
|
|
stun $STUN_SERVER > /dev/null
|
|
if (( ($? & 0xf) > 9 )); then
|
|
echo
|
|
echo "#"
|
|
echo "# Warning: Failed to verify STUN server at $STUN_SERVER with command"
|
|
echo "#"
|
|
echo "# stun $STUN_SERVER"
|
|
echo "#"
|
|
fi
|
|
elif which stunclient > /dev/null 2>&1; then
|
|
if echo $STUN_SERVER | grep -q ':'; then
|
|
STUN_SERVER="$(echo $STUN_SERVER | sed 's/:.*//g') $(echo $STUN_SERVER | sed 's/.*://g')"
|
|
else
|
|
STUN_SERVER="$STUN_SERVER 3478"
|
|
fi
|
|
if stunclient $STUN_SERVER | grep -q "fail\|Unable\ to\ resolve"; then
|
|
echo
|
|
echo "#"
|
|
echo "# Warning: Failed to verify STUN server at $STUN_SERVER with command"
|
|
echo "#"
|
|
echo "# stunclient $STUN_SERVER"
|
|
echo "#"
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
|
|
BBB_LOG="/var/log/bigbluebutton"
|
|
if [ "$(stat -c "%U %G" $BBB_LOG)" != "bigbluebutton bigbluebutton" ]; then
|
|
echo
|
|
echo "#"
|
|
echo "# Warning: The directory"
|
|
echo "#"
|
|
echo "# $BBB_LOG"
|
|
echo "#"
|
|
echo "# is not owned by bigbluebutton:bigbluebutton. To fix, run the command"
|
|
echo "#"
|
|
echo "# sudo chown bigbluebutton:bigbluebutton $BBB_LOG"
|
|
echo "#"
|
|
fi
|
|
|
|
BBB_LOG_FILES="$BBB_LOG/bbb-rap-worker.log $BBB_LOG/bbb-web.log $BBB_LOG/post_publish.log $BBB_LOG/sanity.log"
|
|
for log_file in $BBB_LOG_FILES; do
|
|
if [ -f "$log_file" ] && [ "$(stat -c "%U %G" $log_file)" != "bigbluebutton bigbluebutton" ]; then
|
|
echo
|
|
echo "#"
|
|
echo "# Warning: The file"
|
|
echo "#"
|
|
echo "# $log_file"
|
|
echo "#"
|
|
echo "# is not owned by bigbluebutton:bigbluebutton. To fix, run the command"
|
|
echo "#"
|
|
echo "# sudo chown bigbluebutton:bigbluebutton $log_file"
|
|
echo "#"
|
|
fi
|
|
done
|
|
|
|
if [ -d /var/lib/gems/2.5.0/cache ]; then
|
|
for gem_file in /var/lib/gems/2.5.0/cache/*; do
|
|
if [ ! -s $gem_file ]; then
|
|
echo "#"
|
|
echo "# Warning: Found a zero byte size gem file"
|
|
echo "#"
|
|
echo "# $gem_file"
|
|
echo "#"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if journalctl -u bbb-rap-* | grep -q 'Nil'; then
|
|
echo
|
|
echo "#"
|
|
echo "# Warning: found 'Nil' message in recording processing logs. Possible GEM errors"
|
|
echo "#"
|
|
echo "# https://github.com/bigbluebutton/bigbluebutton/issues/14287"
|
|
echo "#"
|
|
fi
|
|
|
|
|
|
exit 0
|
|
}
|
|
|
|
|
|
#
|
|
# Print out the status of the current setup and look for configuration issues
|
|
#
|
|
if [ $CHECK ]; then
|
|
need_root
|
|
|
|
print_bigbluebutton_version
|
|
|
|
echo " Kernel version:" $(uname -r)
|
|
|
|
if [ $DISTRIB_ID == "centos" ]; then
|
|
echo -n " Distribution: $(cat /etc/centos-release)"
|
|
else
|
|
source /etc/lsb-release
|
|
echo -n " Distribution: $DISTRIB_DESCRIPTION "
|
|
fi
|
|
|
|
if [ $(uname -m) == "x86_64" ]; then
|
|
echo "(64-bit)"
|
|
elif [ $(uname -m) == "i686" ]; then
|
|
echo "(32-bit)"
|
|
fi
|
|
|
|
echo " Memory: $MEM MB"
|
|
echo " CPU cores: $NCPU"
|
|
|
|
echo
|
|
echo "$BBB_WEB_ETC_CONFIG (override for bbb-web)"
|
|
echo "$BBB_WEB_CONFIG (bbb-web)"
|
|
echo " bigbluebutton.web.serverURL: $(get_bbb_web_config_value bigbluebutton.web.serverURL)"
|
|
echo " defaultGuestPolicy: $(get_bbb_web_config_value defaultGuestPolicy)"
|
|
echo " svgImagesRequired: $(get_bbb_web_config_value svgImagesRequired)"
|
|
echo " defaultMeetingLayout: $(get_bbb_web_config_value defaultMeetingLayout)"
|
|
|
|
echo
|
|
echo "/etc/nginx/sites-available/bigbluebutton (nginx)"
|
|
echo " server_name: $NGINX_IP"
|
|
|
|
PORT=$(cat /etc/nginx/sites-available/bigbluebutton | grep -v '#' | sed -n '/listen/{s/.*listen[ ]*//;s/;//;p}' | grep -v ssl | tr --delete '\n' | sed 's/\[/, \[/g' | sed 's/0$/0\n/g')
|
|
echo " port: $PORT"
|
|
if cat /etc/nginx/sites-available/bigbluebutton | grep -v '#' | sed -n '/listen/{s/.*listen[ ]*//;s/;//;p}' | grep ssl > /dev/null; then
|
|
echo " port: 443 ssl"
|
|
fi
|
|
|
|
echo
|
|
echo "$FREESWITCH_VARS (FreeSWITCH)"
|
|
echo " local_ip_v4: $(xmlstarlet sel -t -m '//X-PRE-PROCESS[@cmd="set" and starts-with(@data, "local_ip_v4=")]' -v @data $FREESWITCH_VARS | sed 's/local_ip_v4=//g')"
|
|
echo " external_rtp_ip: $(xmlstarlet sel -t -m '//X-PRE-PROCESS[@cmd="set" and starts-with(@data, "external_rtp_ip=")]' -v @data $FREESWITCH_VARS | sed 's/external_rtp_ip=//g')"
|
|
echo " external_sip_ip: $(xmlstarlet sel -t -m '//X-PRE-PROCESS[@cmd="set" and starts-with(@data, "external_sip_ip=")]' -v @data $FREESWITCH_VARS | sed 's/external_sip_ip=//g')"
|
|
|
|
echo
|
|
echo "$FREESWITCH_EXTERNAL (FreeSWITCH)"
|
|
echo " ext-rtp-ip: $(xmlstarlet sel -t -m 'profile/settings/param[@name="ext-rtp-ip"]' -v @value $FREESWITCH_EXTERNAL)"
|
|
echo " ext-sip-ip: $(xmlstarlet sel -t -m 'profile/settings/param[@name="ext-sip-ip"]' -v @value $FREESWITCH_EXTERNAL)"
|
|
echo " ws-binding: $(xmlstarlet sel -t -m 'profile/settings/param[@name="ws-binding"]' -v @value $FREESWITCH_EXTERNAL)"
|
|
echo " wss-binding: $(xmlstarlet sel -t -m 'profile/settings/param[@name="wss-binding"]' -v @value $FREESWITCH_EXTERNAL)"
|
|
|
|
|
|
# if [ -f ${LTI_DIR}/WEB-INF/classes/lti-config.properties ]; then
|
|
# LTI_URL=$(cat ${LTI_DIR}/WEB-INF/classes/lti-config.properties | grep -v '#' | sed -n '/^bigbluebuttonURL/{s/.*http[s]:\/\///;s/\/.*//;p}' | tr -d '\015')
|
|
# echo
|
|
# echo "${LTI_DIR}/WEB-INF/classes/lti-config.properties (LTI integration)"
|
|
# echo " api url: $LTI_URL"
|
|
# fi
|
|
|
|
if [ -f $RECORD_CONFIG ]; then
|
|
echo
|
|
echo "$RECORD_CONFIG (record and playback)"
|
|
echo " playback_host: $(yq r $RECORD_CONFIG playback_host)"
|
|
echo " playback_protocol: $(yq r $RECORD_CONFIG playback_protocol)"
|
|
echo " ffmpeg: $(ffmpeg -version 2>/dev/null | grep ffmpeg | cut -d ' ' -f3 | sed 's/--.*//g' | tr -d '\n')"
|
|
fi
|
|
|
|
if [ -f $SIP_CONFIG ]; then
|
|
echo
|
|
echo "$SIP_CONFIG (sip.nginx)"
|
|
echo " proxy_pass: $SIP_NGINX_IP"
|
|
echo " protocol: $(cat /usr/share/bigbluebutton/nginx/sip.nginx | grep -v \# | sed -n '/proxy_pass/{s/.*proxy_pass [ ]*//;s/:.*//;p}' | head -n 1)"
|
|
fi
|
|
|
|
if [ -n "$KURENTO_CONFIG" ]; then
|
|
echo
|
|
echo "/usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml (Kurento SFU)"
|
|
echo "/etc/bigbluebutton/bbb-webrtc-sfu/production.yml (Kurento SFU - override)"
|
|
echo " kurento.ip: $(echo "$KURENTO_CONFIG" | yq r - kurento[0].ip)"
|
|
echo " kurento.url: $(echo "$KURENTO_CONFIG" | yq r - kurento[0].url)"
|
|
echo " kurento.sip_ip: $(echo "$KURENTO_CONFIG" | yq r - freeswitch.sip_ip)"
|
|
echo " recordScreenSharing: $(echo "$KURENTO_CONFIG" | yq r - recordScreenSharing)"
|
|
echo " recordWebcams: $(echo "$KURENTO_CONFIG" | yq r - recordWebcams)"
|
|
echo " codec_video_main: $(echo "$KURENTO_CONFIG" | yq r - conference-media-specs.codec_video_main)"
|
|
echo " codec_video_content: $(echo "$KURENTO_CONFIG" | yq r - conference-media-specs.codec_video_content)"
|
|
fi
|
|
|
|
if [ -n "$HTML5_CONFIG" ]; then
|
|
echo
|
|
echo "/usr/share/meteor/bundle/programs/server/assets/app/config/settings.yml (HTML5 client)"
|
|
echo "/etc/bigbluebutton/bbb-html5.yml (HTML5 client config override)"
|
|
echo " build: $(echo "$HTML5_CONFIG" | yq r - public.app.html5ClientBuild)"
|
|
echo " kurentoUrl: $(echo "$HTML5_CONFIG" | yq r - public.kurento.wsUrl)"
|
|
echo " enableListenOnly: $(echo "$HTML5_CONFIG" | yq r - public.kurento.enableListenOnly)"
|
|
echo " sipjsHackViaWs: $(echo "$HTML5_CONFIG" | yq r - public.media.sipjsHackViaWs)"
|
|
fi
|
|
|
|
if [ ! -z "$STUN" ]; then
|
|
for i in $STUN; do
|
|
echo
|
|
echo "$TURN (STUN Server)"
|
|
echo " stun: $(xmlstarlet sel -N x="http://www.springframework.org/schema/beans" -t -m "_:beans/_:bean[@id=\"$i\"]/_:constructor-arg[@index=\"0\"]" -v @value $TURN | sed 's/stun://g')"
|
|
done
|
|
fi
|
|
|
|
check_state
|
|
echo
|
|
|
|
exit 0
|
|
fi
|
|
|
|
#
|
|
# Zip log files
|
|
#
|
|
if [ $ZIP ]; then
|
|
need_root
|
|
|
|
LOG_FILE="$(date +'%Y%m%d')-$(date +%H).tar"
|
|
TMP_LOG_FILE="/tmp/$LOG_FILE"
|
|
#
|
|
# Check log files
|
|
#
|
|
rm -f "$LOG_FILE.gz"
|
|
rm -f /tmp/a
|
|
|
|
touch /tmp/empty
|
|
tar cf $TMP_LOG_FILE /tmp/empty > /dev/null 2>&1
|
|
tar rfh $TMP_LOG_FILE $SERVLET_LOGS > /dev/null 2>&1
|
|
tar rf $TMP_LOG_FILE /var/log/bigbluebutton/* > /dev/null 2>&1
|
|
tar rf $TMP_LOG_FILE /var/log/bbb-apps-akka > /dev/null 2>&1
|
|
tar rf $TMP_LOG_FILE /var/log/bbb-fsesl-akka > /dev/null 2>&1
|
|
tar rf $TMP_LOG_FILE /var/log/bbb-webrtc-sfu > /dev/null 2>&1
|
|
tar rf $TMP_LOG_FILE /var/log/kurento-media-server > /dev/null 2>&1
|
|
tar rf $TMP_LOG_FILE /var/log/mongodb > /dev/null 2>&1
|
|
tar rf $TMP_LOG_FILE /var/log/redis > /dev/null 2>&1
|
|
tar rf $TMP_LOG_FILE /var/log/nginx/error.log* > /dev/null 2>&1
|
|
tar rf $TMP_LOG_FILE /var/log/nginx/bigbluebutton.access.log* > /dev/null 2>&1
|
|
tar rfh $TMP_LOG_FILE /opt/freeswitch/var/log/freeswitch/ > /dev/null 2>&1
|
|
|
|
if [ -f /var/log/nginx/html5-client.log ]; then
|
|
tar rf $TMP_LOG_FILE /var/log/nginx/html5-client.log* > /dev/null 2>&1
|
|
fi
|
|
|
|
if [ -f /var/log/syslog ]; then
|
|
tar rf $TMP_LOG_FILE /var/log/syslog* > /dev/null 2>&1
|
|
fi
|
|
|
|
tar tf $TMP_LOG_FILE
|
|
gzip $TMP_LOG_FILE
|
|
$SUDO mv $TMP_LOG_FILE.gz /root/$LOG_FILE.gz
|
|
echo
|
|
echo " Created: /root/$LOG_FILE.gz"
|
|
echo
|
|
fi
|
|
|
|
#
|
|
# Check current setup
|
|
#
|
|
if [ $DEBUG ]; then
|
|
need_root
|
|
#
|
|
# Check log files
|
|
#
|
|
|
|
rm -rf /tmp/t
|
|
grep --directories=skip ERROR /var/log/bigbluebutton/* > /tmp/t
|
|
if [ -s /tmp/t ]; then
|
|
echo " -- ERRORS found in /var/log/bigbluebutton/* -- "
|
|
cat /tmp/t
|
|
echo
|
|
fi
|
|
|
|
rm -rf /tmp/t
|
|
grep --directories=skip Exception /var/log/bigbluebutton/* | grep -v CacheExceptionHandlerFactory > /tmp/t
|
|
if [ -s /tmp/t ]; then
|
|
echo " -- ERRORS found in /var/log/bigbluebutton/* -- "
|
|
cat /tmp/t
|
|
echo
|
|
fi
|
|
|
|
if [ -d $SERVLET_LOGS ]; then
|
|
rm -rf /tmp/t
|
|
$SUDO grep --directories=skip Exception $SERVLET_LOGS/* | grep -v CacheExceptionHandlerFactory > /tmp/t
|
|
if [ -s /tmp/t ]; then
|
|
echo " -- Exceptions found in $SERVLET_LOGS/ -- "
|
|
cat /tmp/t
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
rm -rf /tmp/t
|
|
if [ -s /var/log/nginx/error.log ]; then
|
|
cat /var/log/nginx/error.log | grep -v "/fcs/ident2" > /tmp/t
|
|
if [ -s /tmp/t ]; then
|
|
echo " -- Errors found in /var/log/nginx/error.log -- "
|
|
cat /tmp/t
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
if [ $DISTRIB_ID == "Ubuntu" ]; then
|
|
rm -rf /tmp/t
|
|
$SUDO grep --directories=skip -i exception /var/log/syslog > /tmp/t
|
|
if [ -s /tmp/t ]; then
|
|
echo " -- Errors found in /var/log/syslog -- "
|
|
cat /tmp/t
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
rm -rf /tmp/t
|
|
if [ -d /var/log/bigbluebutton ]; then
|
|
$SUDO grep --directories=skip ERROR /var/log/bigbluebutton/* > /tmp/t
|
|
if [ -s /tmp/t ]; then
|
|
echo " -- Errors found in /var/log/bigbluebutton -- "
|
|
cat /tmp/t
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
rm -rf /tmp/t
|
|
if [ -d /var/log/bigbluebutton ]; then
|
|
$SUDO grep --directories=skip -i exception /var/log/bigbluebutton/* > /tmp/t
|
|
if [ -s /tmp/t ]; then
|
|
echo " -- Exceptions found in /var/log/bigbluebutton -- "
|
|
cat /tmp/t
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
#
|
|
# Additional checks for record and playback
|
|
#
|
|
|
|
if [ -f /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml ]; then
|
|
bbb-record --check
|
|
fi
|
|
|
|
exit 0
|
|
fi
|
|
|
|
|
|
|
|
# if asked to print the version that's all we do
|
|
if [ -n "$HOST" ]; then
|
|
need_root
|
|
|
|
#
|
|
# Update configuration for BigBlueButton web app
|
|
#
|
|
echo "Assigning $HOST for web application URL in $BBB_WEB_ETC_CONFIG"
|
|
if [ -f "$BBB_WEB_ETC_CONFIG" ] && grep "bigbluebutton.web.serverURL" "$BBB_WEB_ETC_CONFIG" > /dev/null ; then
|
|
change_var_value "$BBB_WEB_ETC_CONFIG" bigbluebutton.web.serverURL "$PROTOCOL://$HOST"
|
|
else
|
|
echo "bigbluebutton.web.serverURL=$PROTOCOL://$HOST" >> "$BBB_WEB_ETC_CONFIG"
|
|
fi
|
|
|
|
# Populate /etc/bigbluebutton/bbb-web.properites with the shared secret
|
|
if ! grep -q "^securitySalt" "$BBB_WEB_ETC_CONFIG"; then
|
|
echo "securitySalt=$(get_bbb_web_config_value securitySalt)" >> "$BBB_WEB_ETC_CONFIG"
|
|
fi
|
|
|
|
|
|
if ! grep -q server_names_hash_bucket_size /etc/nginx/nginx.conf; then
|
|
$SUDO sed -i "s/gzip on;/gzip on;\n server_names_hash_bucket_size 64;/g" /etc/nginx/nginx.conf
|
|
fi
|
|
|
|
#
|
|
# Update bbb-apps-akka
|
|
#
|
|
echo "Assigning $HOST for web application URL in /etc/bigbluebutton/bbb-apps-akka.conf"
|
|
|
|
if [ -f /etc/bigbluebutton/bbb-apps-akka.conf ]; then
|
|
sed -i "s/bbbWebAPI[ ]*=[ ]*\"[^\"]*\"/bbbWebAPI=\"${PROTOCOL}:\/\/$HOST\/bigbluebutton\/api\"/g" \
|
|
/etc/bigbluebutton/bbb-apps-akka.conf
|
|
# Fix to ensure bbb-apps-akka.conf has the latest shared secret
|
|
SECRET=$(get_bbb_web_config_value securitySalt)
|
|
sed -i "s/sharedSecret[ ]*=[ ]*\"[^\"]*\"/sharedSecret=\"$SECRET\"/g" \
|
|
/etc/bigbluebutton/bbb-apps-akka.conf
|
|
fi
|
|
|
|
#
|
|
# Update api demos
|
|
#
|
|
if [ -f ${TOMCAT_DIR}/webapps/demo/bbb_api_conf.jsp ]; then
|
|
echo "there is bbb-demo installed"
|
|
BBB_WEB_URL=$(get_bbb_web_config_value bigbluebutton.web.serverURL)
|
|
SECRET=$(get_bbb_web_config_value securitySalt)
|
|
|
|
echo "Assigning $BBB_WEB_URL for api demos in ${TOMCAT_DIR}/webapps/demo/bbb_api_conf.jsp"
|
|
$SUDO echo -n "<%" > ${TOMCAT_DIR}/webapps/demo/bbb_api_conf.jsp
|
|
$SUDO echo "!
|
|
// This is the security salt that must match the value set in the BigBlueButton server
|
|
String salt = \"$SECRET\";
|
|
|
|
// This is the URL for the BigBlueButton server
|
|
String BigBlueButtonURL = \"$BBB_WEB_URL/bigbluebutton/\";
|
|
%>" >> ${TOMCAT_DIR}/webapps/demo/bbb_api_conf.jsp
|
|
fi
|
|
|
|
if [ -f ${LTI_DIR}/WEB-INF/classes/lti-config.properties ]; then
|
|
echo "Assigning $HOST for LTI integration in ${LTI_DIR}/WEB-INF/classes/lti-config.properties"
|
|
# We don't wat to guess on http/https as the lti endpoint may be a different BigBlueButton server
|
|
sed -i "s/bigbluebuttonURL=http:\/\/.*/bigbluebuttonURL=http:\/\/$HOST\/bigbluebutton/g" \
|
|
${LTI_DIR}/WEB-INF/classes/lti-config.properties
|
|
sed -i "s/bigbluebuttonURL=https:\/\/.*/bigbluebuttonURL=https:\/\/$HOST\/bigbluebutton/g" \
|
|
${LTI_DIR}/WEB-INF/classes/lti-config.properties
|
|
sed -i "s/ltiEndPoint=.*/ltiEndPoint=$HOST/g" \
|
|
${LTI_DIR}/WEB-INF/classes/lti-config.properties
|
|
fi
|
|
|
|
|
|
if [ -f /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml ]; then
|
|
echo "Assigning $HOST for record and playback in /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml"
|
|
change_yml_value /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml playback_host $HOST
|
|
fi
|
|
|
|
if [ -f /usr/local/bigbluebutton/bbb-webhooks/config/default.yml ]; then
|
|
echo "Assigning $HOST for webhooks in /usr/local/bigbluebutton/bbb-webhooks/config/default.yml"
|
|
change_yml_value /usr/local/bigbluebutton/bbb-webhooks/config/default.yml serverDomain $HOST
|
|
fi
|
|
|
|
echo -n "Assigning $HOST for playback of recordings: "
|
|
for metadata in $(find /var/bigbluebutton/published /var/bigbluebutton/unpublished -name metadata.xml); do
|
|
echo -n "."
|
|
# Ensure we update both types of URLs
|
|
xmlstarlet edit --inplace --update '//link[starts-with(normalize-space(), "https://")]' --expr "concat(\"https://\", \"$HOST/\", substring-after(substring-after(., \"https://\"),\"/\"))" $metadata
|
|
xmlstarlet edit --inplace --update '//link[starts-with(normalize-space(), "http://")]' --expr "concat(\"http://\", \"$HOST/\", substring-after(substring-after(., \"http://\"),\"/\"))" $metadata
|
|
|
|
#
|
|
# Update thumbnail links
|
|
#
|
|
xmlstarlet edit --inplace --update '//images/image[starts-with(normalize-space(), "https://")]' --expr "concat(\"https://\", \"$HOST/\", substring-after(substring-after(., \"https://\"),\"/\"))" $metadata
|
|
xmlstarlet edit --inplace --update '//images/image[starts-with(normalize-space(), "http://")]' --expr "concat(\"http://\", \"$HOST/\", substring-after(substring-after(., \"http://\"),\"/\"))" $metadata
|
|
done
|
|
echo
|
|
|
|
#
|
|
# Update HTML5 client
|
|
#
|
|
if [ -f $HTML5_DEFAULT_CONFIG ]; then
|
|
yq w -i $HTML5_DEFAULT_CONFIG public.kurento.wsUrl "wss://$HOST/bbb-webrtc-sfu"
|
|
yq w -i $HTML5_DEFAULT_CONFIG public.pads.url "$PROTOCOL://$HOST/pad"
|
|
chown meteor:meteor $HTML5_DEFAULT_CONFIG
|
|
|
|
#if [ -f $KURENTO_CONFIG ]; then
|
|
# yq w -i $KURENTO_CONFIG kurento[0].url "ws://$HOST:8888/kurento"
|
|
# chown bigbluebutton:bigbluebutton $KURENTO_CONFIG
|
|
#fi
|
|
fi
|
|
|
|
#
|
|
# Update ESL passwords in three configuration files
|
|
#
|
|
ESL_PASSWORD=$(cat /etc/bigbluebutton/bbb-fsesl-akka.conf | grep password | head -n 1 | sed 's/.*="//g' | sed 's/"//g')
|
|
if [ "$ESL_PASSWORD" == "ClueCon" ]; then
|
|
ESL_PASSWORD=$(openssl rand -hex 8)
|
|
sudo sed -i "s/ClueCon/$ESL_PASSWORD/g" /etc/bigbluebutton/bbb-fsesl-akka.conf
|
|
fi
|
|
|
|
sudo yq w -i /usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml freeswitch.esl_password "$ESL_PASSWORD"
|
|
sudo xmlstarlet edit --inplace --update 'configuration/settings//param[@name="password"]/@value' --value $ESL_PASSWORD /opt/freeswitch/etc/freeswitch/autoload_configs/event_socket.conf.xml
|
|
|
|
|
|
echo "Restarting the BigBlueButton $BIGBLUEBUTTON_RELEASE ..."
|
|
stop_bigbluebutton
|
|
start_bigbluebutton
|
|
|
|
exit 0
|
|
fi
|
|
|
|
|
|
if [ $RESTART ]; then
|
|
need_root
|
|
check_configuration
|
|
|
|
echo "Restarting BigBlueButton $BIGBLUEBUTTON_RELEASE ..."
|
|
|
|
stop_bigbluebutton
|
|
start_bigbluebutton
|
|
check_state
|
|
fi
|
|
|
|
if [ $CLEAN ]; then
|
|
need_root
|
|
check_configuration
|
|
|
|
echo "Restarting BigBlueButton $BIGBLUEBUTTON_RELEASE (and cleaning out all log files) ..."
|
|
|
|
stop_bigbluebutton
|
|
|
|
#
|
|
# Clean log files
|
|
#
|
|
|
|
echo " ... cleaning log files"
|
|
rm -f /var/log/bigbluebutton/*.log
|
|
|
|
rm -f /opt/freeswitch/var/log/freeswitch/*.log
|
|
rm -f /opt/freeswitch/var/log/freeswitch/*.log.*
|
|
|
|
#
|
|
# Clean out the log files for record and playback
|
|
#
|
|
rm -f /var/log/bigbluebutton/bbb-rap-worker.log*
|
|
rm -f /var/log/bigbluebutton/bbb-rap-resque.log*
|
|
rm -f /var/log/bigbluebutton/archive.log*
|
|
if [ -d /var/log/bigbluebutton/html5 ]; then
|
|
rm -f /var/log/bigbluebutton/html5/*
|
|
fi
|
|
|
|
if [ -d /var/log/bigbluebutton/podcast ]; then
|
|
rm -f /var/log/bigbluebutton/podcast/*
|
|
fi
|
|
|
|
if [ -d /var/log/bigbluebutton/presentation ]; then
|
|
rm -f /var/log/bigbluebutton/presentation/*
|
|
fi
|
|
|
|
if [[ $SERVLET_LOGS ]]; then
|
|
rm -rf $SERVLET_LOGS/*
|
|
fi
|
|
|
|
# Check if we are storing HTML5 logs in the server
|
|
HTML5_SERVER_LOG=0
|
|
if [[ -f /var/log/nginx/html5-client.log ]]; then
|
|
HTML5_SERVER_LOG=1
|
|
fi
|
|
|
|
rm -rf /var/log/nginx/*
|
|
|
|
# Revert HTML5 client logs to their original permissions
|
|
if [ $HTML5_SERVER_LOG ]; then
|
|
touch /var/log/nginx/html5-client.log
|
|
chown www-data:adm /var/log/nginx/html5-client.log
|
|
chmod 640 /var/log/nginx/html5-client.log
|
|
fi
|
|
|
|
if [ -d /var/log/bbb-fsesl-akka ]; then
|
|
rm -f /var/log/bbb-fsesl-akka/*
|
|
fi
|
|
|
|
if [ -d /var/log/bbb-apps-akka ]; then
|
|
rm -f /var/log/bbb-apps-akka/*
|
|
fi
|
|
|
|
if [ -d /var/log/bbb-webrtc-sfu ]; then
|
|
rm -f /var/log/bbb-webrtc-sfu/*
|
|
fi
|
|
|
|
if [ -d /var/log/redis ]; then
|
|
rm -f /var/log/redis/*
|
|
fi
|
|
|
|
if [ -d /var/log/mongodb ]; then
|
|
rm -f /var/log/mongodb/*
|
|
fi
|
|
|
|
if [ -d /var/log/kurento-media-server ]; then
|
|
rm -f /var/log/kurento-media-server/*
|
|
fi
|
|
|
|
start_bigbluebutton
|
|
check_state
|
|
fi
|
|
|
|
if [ $NETWORK ]; then
|
|
ss -ant | egrep ":80|:443\ " | egrep -v ":::|0.0.0.0" > /tmp/t_net
|
|
REMOTE=$(cat /tmp/t_net | cut -c 45-68 | cut -d ":" -f1 | sort | uniq)
|
|
|
|
if [ "$REMOTE" != "" ]; then
|
|
echo -e "ss\t\t\t80\t443"
|
|
for IP in $REMOTE ; do
|
|
PORT_80=$(cat /tmp/t_net | grep :80 | cut -c 45-68 | cut -d ":" -f1 | grep $IP | wc -l )
|
|
PORT_443=$(cat /tmp/t_net | grep :443 | cut -c 45-68 | cut -d ":" -f1 | grep $IP | wc -l )
|
|
|
|
echo -e "$IP\t\t$PORT_80\t$PORT_443"
|
|
done
|
|
fi
|
|
rm /tmp/t_net
|
|
fi
|
|
|
|
if [ $WATCH ]; then
|
|
need_root
|
|
watch -n 2 "top -n 1 -b | head -n 5; echo; bbb-conf --network; bbb-conf --debug"
|
|
fi
|