bigbluebutton-Github/bigbluebutton-config/bin/bbb-conf

2097 lines
73 KiB
Plaintext
Raw Normal View History

2017-02-21 03:11:22 +08:00
#!/bin/bash
#
2017-05-05 05:34:12 +08:00
# BlueButton open source conferencing system - http://www.bigbluebutton.org/
2017-02-21 03:11:22 +08:00
#
# Copyright (c) 2012 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 <http://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 Inital 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
2017-02-21 03:11:22 +08:00
# 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 Tsting 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-10 04:47:13 +08:00
# 2018-12-09 GTR More logs cleanup
# 2019-02-08 GTR Updates for 2.2 after extracting bbb-web to a standalone server application
2017-02-21 03:11:22 +08:00
#set -x
#set -e
2017-02-21 03:11:22 +08:00
PATH=$PATH:/sbin
2018-12-09 08:23:20 +08:00
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
2019-01-17 04:22:10 +08:00
if [ ! -f /etc/bigbluebutton/bigbluebutton-release ]; then
echo
2019-01-17 04:22:10 +08:00
echo "# BigBlueButton does not appear to be installed. Could not"
echo "# locate: /etc/bigbluebutton/bigbluebutton-release"
echo
2019-01-17 04:22:10 +08:00
exit 1
fi
2017-02-21 03:11:22 +08:00
source /etc/bigbluebutton/bigbluebutton-release
2017-02-21 03:11:22 +08:00
#
2018-12-11 21:15:04 +08:00
# Figure out our environment (Debian vs. CentOS)
2017-02-21 03:11:22 +08:00
#
2017-02-21 03:11:22 +08:00
RED5_DIR=/usr/share/red5
RED5=red5
2017-02-21 03:11:22 +08:00
SERVLET_CONTAINER=tomcat7
2019-02-08 07:10:55 +08:00
TOMCAT_DIR=/var/lib/$SERVLET_CONTAINER
LTI_DIR=$TOMCAT_DIR/webapps/lti
if [ -f /usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties ]; then
2019-02-08 07:10:55 +08:00
SERVLET_DIR=/usr/share/bbb-web
else
SERVLET_DIR=/var/lib/tomcat7/webapps/bigbluebutton
2019-02-08 07:10:55 +08:00
fi
2019-02-11 11:34:43 +08:00
PROTOCOL=http
if [ -f $SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties ]; then
SERVER_URL=$(cat $SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties | sed -n '/^bigbluebutton.web.serverURL/{s/.*\///;p}')
if cat $SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties | grep bigbluebutton.web.serverURL | grep -q https; then
2019-02-11 11:34:43 +08:00
PROTOCOL=https
fi
fi
2019-02-11 12:40:36 +08:00
PROTOCOL_RTMP=rtmp
2017-02-21 03:11:22 +08:00
FREESWITCH_VARS=/opt/freeswitch/conf/vars.xml
FREESWITCH_EXTERNAL=/opt/freeswitch/conf/sip_profiles/external.xml
FREESWITCH_PID=/opt/freeswitch/run/freeswitch.pid
FREESWITCH_EVENT_SOCKET=/opt/freeswitch/conf/autoload_configs/event_socket.conf.xml
RECORD_CONFIG=/usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
HTML5_CONFIG_OLD=/usr/share/meteor/bundle/programs/server/assets/app/config/settings-production.json
HTML5_CONFIG=/usr/share/meteor/bundle/programs/server/assets/app/config/settings.yml
KURENTO_CONFIG=/usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml
BBB_WEB_CONFIG=$SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties
SIP_CONFIG=/etc/bigbluebutton/nginx/sip.nginx
BBB_USER=bigbluebutton
if [ -f /etc/redhat-release ]; then
2017-02-21 03:11:22 +08:00
DISTRIB_ID=centos
SERVLET_LOGS=/usr/share/tomcat/logs
2017-02-21 03:11:22 +08:00
FREESWITCH=freeswitch
FREESWITCH_INIT_D="/etc/init.d/freeswitch"
TOMCAT_SERVICE=tomcat
REDIS_SERVICE=redis.service
2017-02-21 03:11:22 +08:00
else
. /etc/lsb-release # Get value for DISTRIB_ID
SERVLET_LOGS=$TOMCAT_DIR/logs
FREESWITCH=freeswitch
FREESWITCH_INIT_D="/etc/init.d/freeswitch"
TOMCAT_SERVICE=tomcat7
2019-02-08 09:23:00 +08:00
REDIS_SERVICE=redis-server
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
2017-02-21 03:11:22 +08:00
fi
2017-02-21 03:11:22 +08:00
if [ ! -f /usr/share/red5/webapps/bigbluebutton/WEB-INF/red5-web.xml ]; then
echo "#"
echo "# BigBlueButton does not appear to be installed. Could not"
echo "# locate:"
echo "#"
echo "# /usr/share/red5/webapps/bigbluebutton/WEB-INF/red5-web.xml"
exit 1
fi
2017-02-21 03:11:22 +08:00
if [ ! -f /var/www/bigbluebutton/client/conf/config.xml ]; then
echo "#"
echo "# BigBlueButton does not appear to be installed. Could not"
echo "# locate:"
echo "#"
echo "# /var/www/bigbluebutton/client/conf/config.xml"
2017-02-21 03:11:22 +08:00
exit 1
fi
2017-02-21 03:11:22 +08:00
#
# We're going to give ^bigbluebutton.web.logoutURL a default value (if undefined) so bbb-conf does not give a warning
2017-02-21 03:11:22 +08:00
#
2019-02-08 07:10:55 +08:00
if [ -f $SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties ]; then
if cat $SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties | grep -q ^bigbluebutton.web.logoutURL=$; then
$SUDO sed -i s/^bigbluebutton.web.logoutURL=$/bigbluebutton.web.logoutURL=default/g $SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties
2017-02-21 03:11:22 +08:00
fi
fi
2017-02-21 03:11:22 +08:00
VOICE_CONFERENCE="bbb-voice-freeswitch.xml"
2017-02-21 03:11:22 +08:00
#
# Determine IP so it works on multilingual installations
#
2017-03-14 07:47:48 +08:00
if LANG=c ifconfig | grep -q 'venet0:0'; then
IP=$(ifconfig | grep -v '127.0.0.1' | grep -E "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | tail -1 | cut -d: -f2 | awk '{ print $1}')
2017-02-21 03:11:22 +08:00
else
IP=$(hostname -I | cut -f1 -d' ')
2017-02-21 03:11:22 +08:00
fi
if [ -z "$IP" ]; then
if [ -f /etc/redhat-release ]; then
IP=$(hostname -I | sed 's/ .*//g')
fi
fi
#
# Calculate total memory on this server
#
MEM=`grep MemTotal /proc/meminfo | awk '{print $2}'`
MEM=$((MEM/1000))
2017-02-21 03:11:22 +08:00
#
# 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
}
2017-02-21 03:11:22 +08:00
check_file() {
if [ ! -f $1 ]; then
echo "# File does not exist: $1"
fi
}
2017-02-21 03:11:22 +08:00
print_header() {
if [ ! $HEADER ]; then
echo
echo "** Potential problems described below **"
HEADER=1
fi
}
2017-02-21 03:11:22 +08:00
check_root() {
if [ $EUID == 0 ]; then
echo "This operation should not be run as root."
echo
echo "If this operation needs to execute an operation as root, you'll be asked for"
echo "your password to execute the operation using sudo."
exit 1
fi
}
2017-02-21 03:11:22 +08:00
need_root() {
if [ $EUID != 0 ]; then
echo "Need to be root to run this option"
exit 1
fi
}
2017-02-21 03:11:22 +08:00
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"
2017-02-21 03:11:22 +08:00
echo " --setsecret <secret> Change the shared secret in bigbluebutton.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 and 1935 by IP address"
2017-02-21 03:11:22 +08:00
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"
2017-02-21 03:11:22 +08:00
echo
}
2017-02-21 03:11:22 +08:00
# 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
2017-02-21 03:11:22 +08:00
# 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 () {
2018-10-23 04:27:46 +08:00
sed -i "s<^\([[:blank:]#]*\)\(${2}\): .*<\1\2: ${3}<" $1
2017-02-21 03:11:22 +08:00
}
2018-10-23 04:27:46 +08:00
2017-02-21 03:11:22 +08:00
# 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 command -v systemctl >/dev/null; then
if [ -f /usr/lib/systemd/system/bbb-html5.service ]; then
2018-04-07 21:00:40 +08:00
HTML5="mongod bbb-html5 bbb-webrtc-sfu kurento-media-server"
2017-02-21 03:11:22 +08:00
fi
if [ -f /usr/lib/systemd/system/bbb-webhooks.service ]; then
WEBHOOKS=bbb-webhooks
fi
if [ -f /usr/lib/systemd/system/bbb-transcode-akka.service ]; then
BBB_TRANSCODE_AKKA=bbb-transcode-akka
fi
2019-01-26 01:47:41 +08:00
if [ -f /usr/share/etherpad-lite/settings.json ]; then
ETHERPAD=etherpad
fi
2019-02-08 09:23:00 +08:00
if [ -f /lib/systemd/system/bbb-web.service ]; then
BBB_WEB=bbb-web
fi
2019-02-08 09:23:00 +08:00
systemctl stop red5 $TOMCAT_SERVICE nginx freeswitch $REDIS_SERVICE bbb-apps-akka $BBB_TRANSCODE_AKKA bbb-fsesl-akka bbb-rap-archive-worker.service bbb-rap-process-worker.service bbb-rap-publish-worker.service bbb-rap-sanity-worker.service bbb-record-core.timer $HTML5 $WEBHOOKS $ETHERPAD $BBB_WEB
2017-02-21 03:11:22 +08:00
else
/etc/init.d/monit stop
/etc/init.d/$RED5 stop
/etc/init.d/${SERVLET_CONTAINER} stop
/etc/init.d/nginx stop
if [ -a $FREESWITCH_PID ]; then
$FREESWITCH_INIT_D stop
fi
if [ -f /etc/init.d/bbb-office ]; then
/etc/init.d/bbb-office stop
fi
if [ -f /etc/init.d/bbb-record-core ]; then
/etc/init.d/bbb-record-core stop
fi
if [ -f /etc/init/bbb-apps-akka.conf ]; then
service bbb-apps-akka stop
fi
if [ -f /etc/init.d/bbb-apps-akka ]; then
/etc/init.d/bbb-apps-akka stop
fi
if [ -f /etc/init/bbb-fsesl-akka.conf ]; then
service bbb-fsesl-akka stop
fi
if [ -f /etc/init.d/bbb-fsesl-akka ]; then
/etc/init.d/bbb-fsesl-akka stop
fi
if [ -f /etc/init/bbb-transcode-akka.conf ]; then
service bbb-transcode-akka stop
fi
if [ -f /etc/init.d/bbb-transcode-akka ]; then
/etc/init.d/bbb-transcode-akka stop
fi
2017-02-21 03:11:22 +08:00
fi
}
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
2019-01-17 04:22:10 +08:00
if grep -q "Failure to connect to CORE_DB sofia_reg_external" /opt/freeswitch/var/log/freeswitch/freeswitch.log; then
# See: http://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
2019-02-11 14:23:10 +08:00
# Clear any previous registration errors
if [ -f /usr/share/red5/log/sip.log ]; then
sed -i 's/Failed to register with Sip Server/Failed to register with Sip server/g' /usr/share/red5/log/sip.log
fi
2017-02-21 03:11:22 +08:00
echo "Starting BigBlueButton"
if command -v systemctl >/dev/null; then
if [ -f /usr/lib/systemd/system/bbb-html5.service ]; then
2018-04-07 21:00:40 +08:00
HTML5="mongod bbb-html5 bbb-webrtc-sfu kurento-media-server"
2017-02-21 03:11:22 +08:00
fi
if [ -f /usr/lib/systemd/system/bbb-webhooks.service ]; then
WEBHOOKS=bbb-webhooks
fi
if [ -f /usr/lib/systemd/system/bbb-transcode-akka.service ]; then
BBB_TRANSCODE_AKKA=bbb-transcode-akka
fi
2019-01-26 01:47:41 +08:00
if [ -f /usr/share/etherpad-lite/settings.json ]; then
ETHERPAD=etherpad
fi
2019-02-08 09:23:00 +08:00
if [ -f /lib/systemd/system/bbb-web.service ]; then
BBB_WEB=bbb-web
fi
systemctl start red5 $TOMCAT_SERVICE nginx freeswitch $REDIS_SERVICE bbb-apps-akka $BBB_TRANSCODE_AKKA bbb-fsesl-akka bbb-record-core.timer $HTML5 $WEBHOOKS $ETHERPAD $BBB_WEB
2018-02-09 01:26:31 +08:00
if [ -f /usr/lib/systemd/system/bbb-html5.service ]; then
systemctl start mongod
sleep 3
systemctl start bbb-html5
fi
2017-02-21 03:11:22 +08:00
else
$FREESWITCH_INIT_D start
FREESWITCH_ESL_IP=$(cat $FREESWITCH_EVENT_SOCKET | grep 'name="listen-ip"' | cut -d\" -f4 | awk '{print $1}')
check_no_value listen-ip $FREESWITCH_EVENT_SOCKET $FREESWITCH_ESL_IP
echo -n "Waiting for FreeSWITCH to start: "
if [[ ! -z $FREESWITCH_ESL_IP && $DISTRIB_ID != "centos" ]]; then
while ! nc -w 1 $FREESWITCH_ESL_IP 8021 > /dev/null; do
2017-02-21 03:11:22 +08:00
echo -n "."
sleep 1
done
fi
echo
/etc/init.d/nginx start
/etc/init.d/$RED5 start
/etc/init.d/${SERVLET_CONTAINER} start
# monit will start libreoffice and bbb-rap-worker
/etc/init.d/monit start
echo
echo "Note: monit will automatically start bbb-record-core and LibreOffice within 60 seconds."
echo
2019-02-08 07:10:55 +08:00
BBB_WEB=$(cat ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | sed -n '/^bigbluebutton.web.serverURL/{s/.*\///;p}')
2017-02-21 03:11:22 +08:00
if [ -f /etc/init/bbb-html5.conf ]; then
echo -n "Waiting for Meteor (HTML5 server) to finish starting up (this may take a minute): "
start bbb-html5
if ! wget -q -O - http://$BBB_WEB/html5client/check | grep running > /dev/null; then
while ! wget -q -O - http://$BBB_WEB/html5client/check | grep running > /dev/null; do
echo -n "."
sleep 1
done
fi
fi
if [ -f /etc/init/bbb-apps-akka.conf ]; then
service bbb-apps-akka start
fi
if [ -f /etc/init.d/bbb-apps-akka ]; then
/etc/init.d/bbb-apps-akka start
fi
if [ -f /etc/init/bbb-fsesl-akka.conf ]; then
service bbb-fsesl-akka start
fi
if [ -f /etc/init.d/bbb-fsesl-akka ]; then
/etc/init.d/bbb-fsesl-akka start
fi
if [ -f /etc/init/bbb-transcode-akka.conf ]; then
service bbb-transcode-akka start
fi
if [ -f /etc/init.d/bbb-transcode-akka ]; then
/etc/init.d/bbb-transcode-akka start
fi
2017-02-21 03:11:22 +08:00
#
# At this point the red5 and servlet container applications are starting up.
#
echo -n "Waiting for BigBlueButton to finish starting up (this may take a minute): "
2017-10-28 21:54:19 +08:00
NGINX_IP=$(cat /etc/nginx/sites-available/bigbluebutton | grep -v '#' | sed -n '/server_name/{s/.*server_name[ ]*//;s/;//;p}' | cut -d' ' -f1)
2017-02-21 03:11:22 +08:00
check_no_value server_name /etc/nginx/sites-available/bigbluebutton $NGINX_IP
#if ! wget http://$BBB_WEB/bigbluebutton/api -O - --quiet | grep -q SUCCESS; then
# echo "Startup unsuccessful: could not connect to http://$BBB_WEB/bigbluebutton/api"
# exit 1
#fi
fi
#
# Look for Starting up context to be recently added to the log files
#
COUNT=0
while [ $COUNT -lt 20 ]; do
let COUNT=COUNT+1
if [ -f $RED5_DIR/log/sip.log ] && [ -f $RED5_DIR/log/bigbluebutton.log ] && [ -f $RED5_DIR/log/red5.log ] && [ -f $RED5_DIR/log/video.log ] && [ -f $RED5_DIR/log/screenshare-slf.log ]; then
let COUNT=20
else
echo -n "."
sleep 1
fi
done
#
# All the log files exist, now check for the text "Starting up context"
#
COUNT=0
while [ $COUNT -lt 20 ]; do
let COUNT=COUNT+1
if [ -f $RED5_DIR/log/video.log ]; then
if ! cat $RED5_DIR/log/video.log | tail -n100 | grep -q "Starting up context"; then
echo -n "."
sleep 1
else
let COUNT=20
fi
fi
done
echo
BBB_APPS="sip video bigbluebutton screenshare-slf"
for bbb_app in $BBB_APPS ; do
if [ -a $RED5_DIR/log/$bbb_app.log ]; then
if ! grep -q "Starting up context" $RED5_DIR/log/$bbb_app.log; then
echo "# $bbb_app may not have started properly"
fi
else
echo "# $RED5_DIR/log/$bbb_app.log not found"
fi
done
}
display_bigbluebutton_status () {
if command -v systemctl >/dev/null; then
2019-02-11 14:23:10 +08:00
units="red5 $TOMCAT_SERVICE nginx freeswitch $REDIS_SERVICE bbb-apps-akka bbb-transcode-akka bbb-fsesl-akka"
2018-02-09 01:26:31 +08:00
if [ -f /usr/lib/systemd/system/bbb-html5.service ]; then
units="$units mongod bbb-html5 bbb-webrtc-sfu kurento-media-server"
fi
2018-02-09 01:26:31 +08:00
2019-02-08 09:23:00 +08:00
if [ -f /lib/systemd/system/bbb-web.service ]; then
units="$units bbb-web"
fi
2018-12-12 23:58:32 +08:00
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
2017-02-21 03:11:22 +08:00
else
/etc/init.d/nginx status
/etc/init.d/$RED5 status
/etc/init.d/${SERVLET_CONTAINER} status
2017-02-21 03:11:22 +08:00
fi
}
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
2017-02-21 03:11:22 +08:00
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
2019-02-08 07:10:55 +08:00
BBB_WEB_URL=$(cat ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | sed -n '/^bigbluebutton.web.serverURL/{s/.*=//;p}')
SECRET=$(cat ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | grep securitySalt | cut -d= -f2);
2017-02-21 03:11:22 +08:00
echo
echo " URL: $BBB_WEB_URL/bigbluebutton/"
echo " Secret: $SECRET"
echo
echo " Link to the API-Mate:"
echo " http://mconf.github.io/api-mate/#server=$BBB_WEB_URL/bigbluebutton/&sharedSecret=$SECRET"
echo
2017-02-21 03:11:22 +08:00
exit 0
fi
shift; shift
continue
fi
2017-02-21 03:11:22 +08:00
if [ "$1" = "--lti" -o "$1" = "-lti" ]; then
if [ -z "$SECRET" ]; then
if [ -f ${LTI_DIR}/WEB-INF/classes/lti-config.properties ]; then
LTI_URL='http://'$(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}')
2017-02-21 03:11:22 +08:00
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
2017-02-21 03:11:22 +08:00
usage
exit 1
done
2017-02-21 03:11:22 +08:00
#
# Version
#
if [ $VERSION ]; then
echo
dpkg -l | grep bbb
exit 0
fi
#
# Set Shared Secret
2017-02-21 03:11:22 +08:00
#
if [ $SECRET ]; then
2017-02-21 03:11:22 +08:00
need_root
2019-02-08 07:10:55 +08:00
change_var_salt ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties securitySalt $SECRET
2017-02-21 03:11:22 +08:00
if [ -f /usr/local/bigbluebutton/bbb-webhooks/config_local.coffee ]; then
sed -i "s|\(^[ \t]*config.bbb.sharedSecret[ =]*\).*|\1\"$SECRET\"|g" /usr/local/bigbluebutton/bbb-webhooks/config_local.coffee
fi
if [ -f /usr/local/bigbluebutton/bbb-webhooks/config_local.js ]; then
sed -i "s|\(^[ \t]*config.bbb.sharedSecret[ =]*\).*|\1\"$SECRET\"|g" /usr/local/bigbluebutton/bbb-webhooks/config_local.js
fi
2017-02-21 03:11:22 +08:00
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
2017-02-21 03:11:22 +08:00
fi
if [ -f /usr/share/bbb-apps-akka/conf/application.conf ]; then
sed -i "s/sharedSecret[ ]*=[ ]*\"[^\"]*\"/sharedSecret=\"$SECRET\"/g" \
2017-02-21 03:11:22 +08:00
/usr/share/bbb-apps-akka/conf/application.conf
fi
echo "Changed BigBlueButton's shared secret to $SECRET"
echo
echo "You must restart BigBlueButton for the changes to take effect"
echo " $SUDO bbb-conf --restart"
2017-02-21 03:11:22 +08:00
echo
fi
#
# Setup samba
#
if [ $SAMBA ]; then
check_root
#
# Instal Samba
#
if ! dpkg-query -s samba > /dev/null 2>&1; then
2018-12-09 08:23:20 +08:00
$SUDO apt-get install -y --force-yes samba ant
2017-02-21 03:11:22 +08:00
fi
#
# Add a share to samba
#
if ! grep -q $USER /etc/samba/smb.conf; then
echo ";
; BigBlueButton: Share the development directory
[$USER]
comment = BigBlueButton Development share
path = /home/$USER
browseable = yes
read only = no
create mask = 0755
directory mask = 0775
guest ok = yes
force user = $USER
2018-12-09 08:23:20 +08:00
" | $SUDO tee -a /etc/samba/smb.conf > /dev/null 2>&1
2017-02-21 03:11:22 +08:00
2018-12-09 08:23:20 +08:00
$SUDO /etc/init.d/smbd restart
2017-02-21 03:11:22 +08:00
echo "
You can now access your development folder through:
\\\\${IP}\\$USER
If you are running a development environment on Windows (such as using Eclipse or FlexBuilder),
you can map the above path to a drive letter.
"
else
echo "Already detected a definition for $USER in /etc/samba/smb.conf"
echo "No changes were made to /etc/samba/smb.conf"
fi
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
ESL_HOST=$(cat /usr/share/red5/webapps/bigbluebutton/WEB-INF/bigbluebutton.properties | grep -v '#' | grep esl.host | sed 's/freeswitch.esl.host=//g')
check_no_value esl.host /usr/share/red5/webapps/bigbluebutton/WEB-INF/bigbluebutton.properties $ESL_HOST
if [ "$FREESWITCH_ESL_IP" != "::" ]; then
if [ "$FREESWITCH_ESL_IP" != "$ESL_HOST" ]; then
echo
echo "# The values for listen-ip in "
echo "# $FREESWITCH_EVENT_SOCKET"
echo "# do not match the settings for esl.host in"
echo "# /usr/share/red5/webapps/bigbluebutton/WEB-INF/bigbluebutton.properties"
echo
fi
fi
fi
#
2018-07-24 17:35:48 +08:00
# Check if BigBlueButton is defined in Nginx
2017-02-21 03:11:22 +08:00
#
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="$RED5_DIR/webapps/bigbluebutton/WEB-INF/bigbluebutton.properties \
2019-02-08 07:10:55 +08:00
${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties \
2017-02-21 03:11:22 +08:00
$RED5_DIR/webapps/sip/WEB-INF/bigbluebutton-sip.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 -q "^[^=]*=[ ]*$"; then
echo "# The following properties in $file have no value:"
echo "# $(grep '^[^=#]*=[ ]*$' $file | sed 's/=//g')"
fi
fi
done
#
# Check that the supporting applications are installed
#
2019-02-08 07:10:55 +08:00
VARFolder=$(cat $SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties | grep swfToolsDir | cut -d= -f2)
2017-02-21 03:11:22 +08:00
files="pdf2swf jpeg2swf png2swf"
for file in $package; do
if [ ! -x $VARFolder/$file ]; then
echo "# $file is not installed in $VARFolder"
fi
done
2019-02-08 07:10:55 +08:00
VARFolder=$(cat $SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties | grep imageMagickDir | cut -d= -f2)
2017-02-21 03:11:22 +08:00
if [ ! -x $VARFolder/convert ]; then
echo "# ImageMagick's convert is not installed in $VARFolder"
fi
#
# Check if the IP resolves to a different host
#
2017-10-28 21:54:19 +08:00
NGINX_IP=$(cat /etc/nginx/sites-available/bigbluebutton | grep -v '#' | sed -n '/server_name/{s/.*server_name[ ]*//;s/;//;p}' | cut -d' ' -f1)
2017-02-21 03:11:22 +08:00
check_no_value server_name /etc/nginx/sites-available/bigbluebutton $NGINX_IP
2017-02-21 03:11:22 +08:00
if which host > /dev/null 2>&1; then
HOSTS=$(which host)
if [ $HOSTS ]; then
HOSTS=`$HOSTS $NGINX_IP | awk '{ print $4 }' | head -n 1`
2017-02-21 03:11:22 +08:00
fi
fi
if [ "$IP" != "$NGINX_IP" ]; then
if [ "$IP" != "$HOSTS" ]; then
echo "# IP does not match:"
echo "# IP from ifconfig: $IP"
echo "# /etc/nginx/sites-available/bigbluebutton: $NGINX_IP"
fi
fi
if [ -f ${SERVLET_DIR}/demo/bbb_api_conf.jsp ]; then
#
# Make sure the shared secret for the API matches the server
2017-02-21 03:11:22 +08:00
#
2019-02-08 07:10:55 +08:00
SECRET_PROPERTIES=$(cat ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | tr -d '\r' | sed -n '/securitySalt/{s/.*=//;p}')
SECRET_DEMO=$(cat ${SERVLET_DIR}/demo/bbb_api_conf.jsp | grep -v '^//' | tr -d '\r' | sed -n '/salt[ ]*=/{s/.*=[ ]*"//;s/".*//g;p}')
2017-02-21 03:11:22 +08:00
if [ "$SECRET_PROPERTIES" != "$SECRET_DEMO" ]; then
echo "# Warning: API Shared Secret mismatch: "
2019-02-08 07:10:55 +08:00
echo "# ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties = $SECRET_PROPERTIES"
echo "# ${SERVLET_DIR}/demo/bbb_api_conf.jsp = $SECRET_DEMO"
2017-02-21 03:11:22 +08:00
echo
fi
API_IP=$(cat ${TOMCAT_DIR}/demo/bbb_api_conf.jsp | grep -v '^//' | sed -n '/String BigBlueButtonURL/{s/.*http[s]*:\/\///;s/\/.*//;p}' | tr -d '\015')
2017-02-21 03:11:22 +08:00
if [ "$IP" != "$API_IP" ]; then
echo "# Warning: API URL IPs do not match host:"
echo "#"
echo "# IP from ifconfig: $IP"
echo "# ${TOMCAT_DIR}/demo/bbb_api_conf.jsp: $API_IP"
2017-02-21 03:11:22 +08:00
echo
fi
fi
2019-02-08 07:10:55 +08:00
BBB_SECRET=$(cat ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | tr -d '\r' | sed -n '/securitySalt/{s/.*=//;p}')
2017-10-28 21:54:19 +08:00
NGINX_IP=$(cat /etc/nginx/sites-available/bigbluebutton | grep -v '#' | sed -n '/server_name/{s/.*server_name[ ]*//;s/;//;p}' | cut -d' ' -f1)
2017-02-21 03:11:22 +08:00
if [ -f /usr/lib/systemd/system/bbb-webhooks.service ]; then
if [ -f /usr/local/bigbluebutton/bbb-webhooks/config_local.js ]; then
WEBHOOKS_SECRET=$(cat /usr/local/bigbluebutton/bbb-webhooks/config_local.js | grep '^[ \t]*config.bbb.sharedSecret[ =]*' | cut -d '"' -f2)
WEBHOOKS_CONF=/usr/local/bigbluebutton/bbb-webhooks/config_local.js
fi
if [ -f /usr/local/bigbluebutton/bbb-webhooks/config_local.coffee ]; then
WEBHOOKS_SECRET=$(cat /usr/local/bigbluebutton/bbb-webhooks/config_local.coffee | grep '^[ \t]*config.bbb.sharedSecret[ =]*' | cut -d '"' -f2)
WEBHOOKS_CONF=/usr/local/bigbluebutton/bbb-webhooks/config_local.coffee
fi
if [ "$BBB_SECRET" != "$WEBHOOKS_SECRET" ]; then
echo "# Warning: Webhooks API Shared Secret mismatch: "
2019-02-08 07:10:55 +08:00
echo "# ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties = $BBB_SECRET"
echo "# $WEBHOOKS_CONF = $WEBHOOKS_SECRET"
echo
fi
WEBHOOKS_PROXY_PORT=$(cat /etc/bigbluebutton/nginx/webhooks.nginx | grep -v '#' | grep '^[ \t]*proxy_pass[ \t]*' | sed 's|.*http[s]\?://[^:]*:\([^;]*\);.*|\1|g')
WEBHOOKS_APP_PORT=$(cat $WEBHOOKS_CONF | grep config.server.port | sed "s/.*config.server.port[ =\"]*//g" | sed 's/[;\"]*//g')
if [ "$WEBHOOKS_PROXY_PORT" != "$WEBHOOKS_APP_PORT" ]; then
echo "# Warning: Webhooks port mismatch: "
echo "# /etc/bigbluebutton/nginx/webhooks.nginx = $WEBHOOKS_PROXY_PORT"
echo "# $WEBHOOKS_CONF = $WEBHOOKS_APP_PORT"
echo
fi
fi
2017-02-21 03:11:22 +08:00
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}')
2019-02-08 07:10:55 +08:00
BBB_SECRET=$(cat ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | tr -d '\r' | sed -n '/securitySalt/{s/.*=//;p}')
2017-02-21 03:11:22 +08:00
if [ "$LTI_SECRET" != "$BBB_SECRET" ]; then
echo "# Warning: LTI shared secret mismatch:"
echo "# ${LTI_DIR}/WEB-INF/classes/lti-config.properties = $LTI_SECRET"
2019-02-08 07:10:55 +08:00
echo "# ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties = $BBB_SECRET"
2017-02-21 03:11:22 +08:00
echo
fi
fi
PROTOCOL=$(cat /etc/bigbluebutton/nginx/sip.nginx | sed -n '/proxy_pass/{s/.*proxy_pass [ ]*//;s/:.*//;p}')
if [[ $PROTOCOL == "https" ]]; then
if ! grep wss-binding $FREESWITCH_EXTERNAL > /dev/null; then
echo "# Warning: Websockets is using HTTPS in /etc/bigbluebutton/nginx/sip.nginx"
echo "# but no definition for wss-binding found in "
echo "#"
echo "# $FREESWITCH_EXTERNAL"
echo
fi
if [ -f $HTML5_CONFIG_OLD ]; then
if grep \"enableListenOnly\".*true $HTML5_CONFIG_OLD > /dev/null; then
if ! grep -q ws-binding $FREESWITCH_EXTERNAL ; then
echo "# Warning: You have enabled listen-only audio via Kurento"
echo "# but FreeSWITCH is not listening on port 5066. You should edit "
echo "#"
echo "# $FREESWITCH_EXTERNAL"
echo "#"
echo "# and add a line that enables ws-binding on port 5066."
echo
fi
fi
fi
2017-02-21 03:11:22 +08:00
fi
if [ $DISTRIB_ID != "centos" ]; then
libreoffice_version=`dpkg-query -W --showformat='${Version}\n' libreoffice | sed 's/.*://g' | sed 's/\.[^\.]*$//g'`
if [[ "$libreoffice_version" > 1.0 ]]; then
if [[ "$libreoffice_version" < 4.4 ]]; then
echo "# Warning: Detected your running an older version of LibreOffice: $libreoffice_version"
echo "#"
echo "# Recommend updated to the latest version of LibreOffice 4.x (4.4 or later)"
echo
fi
fi
fi
if [ "$(ls -ld /var/bigbluebutton/screenshare | cut -d' ' -f3)" != "red5" ]; then
echo "# Warning: Detected the directory"
echo "# /var/bigbluebutton/screenshare"
echo "# is not owned by red5"
fi
if [ "$(ls -ld /usr/share/red5/webapps/video/streams | cut -d' ' -f3)" != "red5" ]; then
echo "# Warning: Detected the directory"
echo "# /usr/share/red5/webapps/video/streams"
echo "# is not owned by red5"
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
2017-02-21 03:11:22 +08:00
echo "# Warning: Detected the directory"
echo "# /var/bigbluebutton"
echo "# is not owned by $BBB_USER"
2017-02-21 03:11:22 +08:00
fi
if [ $PROTOCOL == "https" ]; then
2017-02-21 03:11:22 +08:00
if ! grep jnlpUrl /usr/share/red5/webapps/screenshare/WEB-INF/screenshare.properties | grep -q https; then
echo "# Warning: Detected the value for jnlpUrl is not configured for HTTPS"
echo "# /usr/share/red5/webapps/screenshare/WEB-INF/screenshare.properties"
echo "#"
fi
fi
}
check_state() {
echo
print_header
check_configuration
#
# Check for potential problems in the BigBlueButton configuration
#
RUNNING_APPS=""
NOT_RUNNING_APPS=""
if ! ps aux | grep -v grep | grep 'org.red5.server.Bootstrap' > /dev/null; then
print_header
NOT_RUNNING_APPS="${NOT_RUNNING_APPS} red5"
else
RUNNING_APPS="${RUNNING_APPS} red5"
fi
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
2019-02-08 07:10:55 +08:00
if ! netstat -ant | grep '8090' > /dev/null; then
2017-02-21 03:11:22 +08:00
print_header
NOT_RUNNING_APPS="${NOT_RUNNING_APPS} ${SERVLET_CONTAINER} 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 "# ${SERVLET_CONTAINER}: noticed you are running grails run-app instead of ${SERVLET_CONTAINER}"
else
RUNNING_APPS="${RUNNING_APPS} ${SERVLET_CONTAINER}"
fi
fi
if ! netstat -ant | grep '8100' > /dev/null; then
print_header
NOT_RUNNING_APPS="${NOT_RUNNING_APPS} LibreOffice"
else
RUNNING_APPS="${RUNNING_APPS} LibreOffice"
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 /var/www/bigbluebutton /etc/bigbluebutton/nginx/client.nginx > /dev/null; then
NEW_LOCATION=$(cat /etc/bigbluebutton/nginx/client.nginx | grep -v '#' | sed -n '/root/{s/[ \t]*root[ \t]*//;s/;//;p}' | head -n 1)
echo "# Warning: nginx is not serving the client from /var/www/bigbluebutton/."
echo "# Instead, it's being served from"
echo "#"
echo "# $NEW_LOCATION"
echo "#"
echo "# (This is OK if you have setup a development environment.) "
echo
if [ ! -d $NEW_LOCATION ]; then
echo "# Warning: The directory"
echo "#"
echo "# $NEW_LOCATION"
echo "#"
echo "# does not exist. The BigBlueButton client will not load."
echo
fi
fi
#
# Check if running development environment
#
2019-02-08 07:10:55 +08:00
if ! grep 8090 /etc/bigbluebutton/nginx/web.nginx > /dev/null; then
2017-02-21 03:11:22 +08:00
echo "# Warning: nginx is not serving BigBlueButton's web application"
2019-02-08 07:10:55 +08:00
echo "# from port 8090"
2017-02-21 03:11:22 +08:00
echo "#"
echo "# (This is OK if you have setup a development environment.) "
echo
fi
#
# Check red5 applications
#
AVAIL_RED5_APPS=""
UNAVAIL_RED5_APPS=""
DIRECTORIES="bigbluebutton sip video screenshare"
for dir in $DIRECTORIES ; do
if [ ! -d $RED5_DIR/webapps/$dir ]; then
UNAVAIL_RED5_APPS="${UNAVAIL_RED5_APPS} $dir"
else
AVAIL_RED5_APPS="${AVAIL_RED5_APPS} $dir"
fi
done
if [ "$UNAVAIL_RED5_APPS" != "" ]; then
echo "# Unavailable red5 apps ($RED5_DIR/webapps/): ${UNAVAIL_RED5_APPS}"
fi
#
# Checking red5 apps log
#
# Give the files a chance to be created (in case we got started with a clean)
COUNT=0
while [ $COUNT -lt 20 ]; do
let COUNT=COUNT+1
if [ -f $RED5_DIR/log/sip.log ] && [ -f $RED5_DIR/log/bigbluebutton.log ] && [ -f $RED5_DIR/log/red5.log ] && [ -f $RED5_DIR/log/video.log ] && [ -f $RED5_DIR/log/screenshare-slf.log ]; then
let COUNT=20
else
echo -n "."
sleep 1
fi
done
RED5_LOG_FILES="bigbluebutton red5 sip video screenshare-slf"
AVAIL_RED5_LOG=""
UNAVAIL_RED5_LOG=""
for file in $RED5_LOG_FILES ; do
if [ ! -f $RED5_DIR/log/$file.log ]; then
UNAVAIL_RED5_LOG="${UNAVAIL_RED5_LOG} $file.log"
else
AVAIL_RED5_LOG="${AVAIL_RED5_LOG} $file.log"
fi
done
if [ "$UNAVAIL_RED5_LOG" != "" ]; then
echo "# Error: Red5 log files not found"
echo
echo "# Unavailable red5 logs ($RED5_DIR/log): $UNAVAIL_RED5_LOG"
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
#
if ! echo "/quit" | /opt/freeswitch/bin/fs_cli - > /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
#
2017-05-04 16:57:43 +08:00
COMMANDS="ruby gem pdftocairo pdf2swf"
2017-02-21 03:11:22 +08:00
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')
2017-02-21 03:11:22 +08:00
case "$FFMPEG_VERSION" in
2019-01-04 03:07:46 +08:00
4.*.*)
2018-06-23 02:58:30 +08:00
# 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"
2018-06-23 02:58:30 +08:00
echo "#"
echo
;;
esac
2017-02-21 03:11:22 +08:00
if [ -f /usr/share/red5/log/sip.log ]; then
#
# Checking if voice app registered successfully
#
if cat /usr/share/red5/log/sip.log | grep -q "Failed to register with Sip Server"; then
echo "# Warning: The voice application may not have registered with the sip server."
echo "# Try running: "
echo "#"
echo "# $SUDO bbb-conf --clean"
2017-02-21 03:11:22 +08:00
echo "#"
echo
fi
#
# check if sip.log has warnings where the user is not registered.
#
if cat /usr/share/red5/log/sip.log | tail -n1 | grep -q "Call request for default but not registered"; then
echo "# Error: The voice app is not registered with SIP server. Audio might not be working correctly."
echo
fi
else
echo "# Error: The following log file was not found"
echo "# /usr/share/red5/log/sip.log "
echo
fi
#
# Check that the servlet container has started properly and has created log files
#
if [ -z "$(ls -A $SERVLET_LOGS)" ]; then
echo "# empty directory: $SERVLET_LOGS contains no logs"
fi
#
# Check that bigbluebutton in red5 has started properly (less than 100 lines indicates that it
# didn't start)
#
if [ -f $RED5_DIR/log/bigbluebutton.log ]; then
BBB_RED5_LOG=$(stat -c%s $RED5_DIR/log/bigbluebutton.log)
if [ $BBB_RED5_LOG -lt 100 ]; then
echo "# Log file too short (less than 100 lines): $RED5_DIR/log/bigbluebutton.log (red5)"
fi
else
echo "# No $RED5_DIR/log/bigbluebutton.log"
fi
#
# Check if the user is running their own bbb-web
#
if grep -q 8888 /etc/bigbluebutton/nginx/web.nginx; then
if ! netstat -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
#
2019-02-08 07:10:55 +08:00
BBB_WEB=$(cat ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | sed -n '/^bigbluebutton.web.serverURL/{s/.*\///;p}')
2017-02-21 03:11:22 +08:00
check_no_value server_name /etc/nginx/sites-available/bigbluebutton $BBB_WEB
COUNT=0
while [ $COUNT -lt 30 ]; do
2017-02-21 03:11:22 +08:00
let COUNT=COUNT+1
timeout 1s wget $PROTOCOL://$BBB_WEB/bigbluebutton/api -O - --quiet | grep -q SUCCESS
2017-02-21 03:11:22 +08:00
if [ $? -eq 0 ]; then
let COUNT=40
2017-02-21 03:11:22 +08:00
else
echo -n "."
sleep 1
fi
done
echo
if ! wget $PROTOCOL://$BBB_WEB/bigbluebutton/api -O - --quiet | grep -q SUCCESS; then
2017-02-21 03:11:22 +08:00
echo "# Error: Could not connect to the configured hostname/IP address"
echo "#"
echo "# $PROTOCOL://$BBB_WEB/"
2017-02-21 03:11:22 +08:00
echo "#"
echo "# If your BigBlueButton server is behind a firewall, see FAQ."
echo
fi
#
# Check that BigBlueButton can connect to port 1935
#
if [[ ! -z $NGINX_IP && $DISTRIB_ID != "centos" ]]; then
if ! nc -w 3 $NGINX_IP 1935 > /dev/null; then
2017-02-21 03:11:22 +08:00
echo "# Error: Unable to connect to port 1935 (RTMP) on $NGINX_IP"
echo
fi
fi
BBB_SIP_APP_IP=$(cat /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties | grep -v '#' | sed -n '/^bbb.sip.app.ip=/{s/.*=//;s/;//;p}')
if [ $BBB_SIP_APP_IP != "127.0.0.1" ]; then
if [ "$BBB_SIP_APP_IP" != $IP ]; then
echo "# Warning: The setting of $BBB_SIP_APP_IP for bbb.sip.app.ip in"
echo "#"
echo "# /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties"
echo "#"
echo "# does not match the local IP address ($IP)."
echo "# (This is OK if you've manually changed the values to an external "
echo "# FreeSWITCH server.)"
echo
fi
SIP_IP=$(netstat -ant | grep 5060 | head -n1 | awk -F" " '{print $4}' | cut -d: -f1)
if [ -z $SIP_IP ]; then
echo "# Error: Could not detect FreeSWITCH listening on port 5060"
echo
else
if [ "$BBB_SIP_APP_IP" != $SIP_IP ]; then
echo "# Error: FreeSWITCH is listening on IP address $SIP_IP for SIP calls, but "
echo "# The IP address ($BBB_SIP_APP_IP) set bbb.sip.app.ip."
echo "#"
echo
fi
fi
fi
SIP_NGINX_IP=$(cat /etc/bigbluebutton/nginx/sip.nginx | grep -v '#' | sed -n '/proxy_pass/{s/.*proxy_pass http[s]*:\/\///;s/:.*//;p}')
if [ "$SIP_NGINX_IP" != $IP ]; then
if [ "$SIP_NGINX_IP" != "\$freeswitch_addr" ]; then
2017-02-21 03:11:22 +08:00
echo "# Warning: The setting of $SIP_NGINX_IP for proxy_pass in"
echo "#"
echo "# /etc/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
2017-02-21 03:11:22 +08:00
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 ${LTI_DIR} ]; then
if test ${TOMCAT_DIR}/webapps/lti.war -nt ${LTI_DIR}; then
2017-02-21 03:11:22 +08:00
echo "# Error: The updated lti.war did not deploy. To manually deploy:"
echo "#"
echo "# $SUDO touch ${SERVLET_DIR}/lti.war"
2017-02-21 03:11:22 +08:00
echo "#"
echo
fi
fi
if [ -d ${TOMCAT_DIR}/webapps/demo ]; then
if test ${TOMCAT_DIR}/webapps/demo.war -nt ${TOMCAT_DIR}/webapps/demo; then
2017-02-21 03:11:22 +08:00
echo "# Error: The updated demo.war did not deploy. To manually deploy:"
echo "#"
echo "# $SUDO touch ${SERVLET_DIR}/demo.war"
2017-02-21 03:11:22 +08:00
echo "#"
echo
fi
fi
if (( $MEM < 3940 )); then
2017-02-21 03:11:22 +08:00
echo "# Warning: You are running BigBlueButton on a server with less than 4G of memory. Your"
echo "# performance may suffer."
echo
fi
if [ -f ${TOMCAT_DIR}/webapps/demo/demo1.jsp ]; then
2019-02-08 09:23:00 +08:00
BBB_WEB_URL=$(cat $SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | sed -n '/^bigbluebutton.web.serverURL/{s/.*=//;p}')
2017-02-21 03:11:22 +08:00
echo "# Warning: The API demos are installed and accessible from:"
echo "#"
echo "# $BBB_WEB_URL/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"
2017-02-21 03:11:22 +08:00
echo
fi
if [ -f /var/www/bigbluebutton/check/conf/config.xml ]; then
CHECK_HOST=$(cat /var/www/bigbluebutton/check/conf/config.xml | grep "<uri>rtmp" | head -1 | sed 's/.*rtmp[s]*:\/\///g' | sed 's/\/.*//g' | tr -d '\015')
2019-02-08 07:10:55 +08:00
BBB_WEB_URL=$(cat ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | sed -n '/^bigbluebutton.web.serverURL/{s/.*=//;p}')
2017-02-21 03:11:22 +08:00
echo "# Warning: The client self check is installed and accessible from:"
echo "#"
echo "# $BBB_WEB_URL/check"
echo "#"
echo
fi
if [ -f ${LTI_DIR}/WEB-INF/classes/lti-config.properties ]; then
LTI_URL='http://'$(cat ${LTI_DIR}/WEB-INF/classes/lti-config.properties | grep -v '#' | sed -n '/^ltiEndPoint/{s/^.*=//;p}')'/lti/tool'
2017-02-21 03:11:22 +08:00
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
2019-02-08 07:10:55 +08:00
BBB_WEB=$(cat ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | sed -n '/^bigbluebutton.web.serverURL/{s/.*=//;p}')
DEFAULT_PDF=$(cat ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | sed -n '/^beans.presentationService.defaultUploadedPresentation/{s/.*=//;p}')
2017-02-21 03:11:22 +08:00
if echo $DEFAULT_PDF | grep -q "bigbluebutton.web.serverURL"; then
if ! echo "$BBB_WEB$(echo $DEFAULT_PDF | sed 's/${bigbluebutton.web.serverURL}//g')" | xargs wget -q -O /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"
2019-02-08 07:10:55 +08:00
echo "# ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties"
2017-02-21 03:11:22 +08:00
fi
else
if ! echo "$DEFAULT_PDF" | xargs wget -q -O /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"
2019-02-08 07:10:55 +08:00
echo "# ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties"
2017-02-21 03:11:22 +08:00
fi
fi
if [ -f /var/run/red5.pid ]; then
RED5_PID_PS=$(ps -u red5 | grep java | sed 's/^[ ]*//g' | cut -d" " -f1)
RED5_PID_FILE=$(cat /var/run/red5.pid)
if [[ "$RED5_PID_PS" != "$RED5_PID_FILE" ]]; then
if [ "$(ps -aef | grep "su -p -s /bin/sh red5 " | wc --lines)" == "2" ]; then
RED5_PID_PS=$(ps -aef | grep "su -p -s /bin/sh red5 " | head -n 1 | awk '{print $2}')
if [[ "$RED5_PID_PS" != "$RED5_PID_FILE" ]]; then
echo "# Error: red5 process ID does not match value in PID file"
echo "#"
echo "# pid from top: $RED5_PID_PS"
echo "# /var/run/red5.pid: $RED5_PID_FILE"
echo "#"
fi
else
echo "# Error: red5 process ID does not match value in PID file"
echo "#"
echo "# pid from top: $RED5_PID_PS"
echo "# /var/run/red5.pid: $RED5_PID_FILE"
echo "#"
fi
fi
fi
if [ "$(cat /usr/share/bbb-apps-akka/conf/application.conf | sed -n '/sharedSecret.*/{s/[^"]*"//;s/".*//;p}')" == "changeme" ]; then
2019-02-08 07:10:55 +08:00
BBB_WEB_IP=$(cat ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | sed -n '/^bigbluebutton.web.serverURL/{s/.*\///;p}')
2017-02-21 03:11:22 +08:00
echo "# Error: Detected that /usr/share/bbb-apps-akka/conf/application.conf has the default"
echo "# configuration values. To update, run"
echo "#"
echo "# $SUDO bbb-conf --setip $BBB_WEB_IP"
2017-02-21 03:11:22 +08:00
echo "#"
fi
if [ -z $(cat /usr/share/red5/webapps/screenshare/WEB-INF/screenshare.properties | tr -d '\r' | sed -n "/useH264[ ]*=[ ]*/{s/useH264[ ]*=[ ]*//;p}") ]; then
echo "# Error: Detected there is no value set for useH264 in"
echo "#"
echo "# /usr/share/red5/webapps/screenshare/WEB-INF/screenshare.properties"
echo "#"
fi
if bbb-conf --status | grep -q inactive; then
echo "# Error: Detected some processes have not started correctly"
echo "#"
echo "# $(bbb-conf --status | grep inactive)"
echo "#"
fi
2019-01-17 04:22:10 +08:00
if systemctl status freeswitch | grep -q SETSCHEDULER; then
echo "# Error: FreeSWITCH failed to start with SETSCHEDULER error, see"
echo "#"
echo "# http://docs.bigbluebutton.org/install/install.html#freeswitch-fails-to-start-with-a-setscheduler-error"
echo "#"
fi
2019-01-26 01:47:41 +08:00
NCPU=`nproc --all`
if [ "$NCPU" -lt "4" ]; then
echo "# Warning: found only $NCPU cores, whereas this sherver should have (at least) 4 CPU cores"
echo "# to run BigBlueButton in production."
echo "#"
echo "# http://docs.bigbluebutton.org/install/install.html#minimum-server-requirements"
echo "#"
fi
2017-02-21 03:11:22 +08:00
exit 0
}
#
# Print out the status of the current setup and look for configuration issues
#
if [ $CHECK ]; then
need_root
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
echo " Kernel version:" `uname -r`
if [ $DISTRIB_ID == "centos" ]; then
echo -n " Distribution: $(cat /etc/redhat-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
echo "$BBB_WEB_CONFIG (bbb-web)"
2019-02-11 12:40:36 +08:00
echo " bigbluebutton.web.serverURL: $(cat $BBB_WEB_CONFIG | grep -v '#' | sed -n '/^bigbluebutton.web.serverURL/{s/.*=//;p}')"
echo " defaultGuestPolicy: $(cat $BBB_WEB_CONFIG | grep -v '#' | sed -n '/^defaultGuestPolicy/{s/.*=//;p}')"
2017-02-21 03:11:22 +08:00
echo
echo "/etc/nginx/sites-available/bigbluebutton (nginx)"
2017-10-28 21:54:19 +08:00
NGINX_IP=$(cat /etc/nginx/sites-available/bigbluebutton | grep -v '#' | sed -n '/server_name/{s/.*server_name[ ]*//;s/;//;p}' | cut -d' ' -f1)
2017-02-21 03:11:22 +08:00
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
BBB_CLIENT_DOC_ROOT=$(cat /etc/bigbluebutton/nginx/client.nginx | grep -v '#' | grep \/client -A 1 | head -n 2 | grep root | sed -n '{s/[ \t]*root[ ]*//;s/;//;p}')
echo " bbb-client dir: $BBB_CLIENT_DOC_ROOT"
echo
echo "/var/www/bigbluebutton/client/conf/config.xml (bbb-client)"
PORT_IP=$(cat /var/www/bigbluebutton/client/conf/config.xml | sed -n '/porttest /{s/.*host="//;s/".*//;p}')
echo " Port test (tunnel): $PORT_IP"
RED5_IP=$(cat /var/www/bigbluebutton/client/conf/config.xml | sed -n '/uri.*video/{s/.*rtmp[s]*:\/\///;s/\/.*//;p}')
WEBRTC_ENABLED_CLIENT=`xmlstarlet sel -t -m "config/modules/module[@name='PhoneModule']" -v @useWebRTCIfAvailable /var/www/bigbluebutton/client/conf/config.xml`
echo " red5: $RED5_IP"
echo " useWebrtcIfAvailable: $WEBRTC_ENABLED_CLIENT"
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)"
2017-02-21 03:11:22 +08:00
if [ -f ${SERVLET_DIR}/demo/bbb_api_conf.jsp ]; then
2019-02-08 07:10:55 +08:00
BBB_WEB_URL=$(cat ${SERVLET_DIR}//WEB-INF/classes/bigbluebutton.properties | grep -v '#' | sed -n '/^bigbluebutton.web.serverURL/{s/.*\///;p}')
2017-02-21 03:11:22 +08:00
echo
echo "${SERVLET_DIR}/demo/bbb_api_conf.jsp (API demos)"
echo " url: $BBB_WEB_URL"
fi
# 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
2017-02-21 03:11:22 +08:00
if [ -f /var/www/bigbluebutton/check/conf/config.xml ]; then
CHECK_URL=$(cat /var/www/bigbluebutton/check/conf/config.xml | grep "<uri>rtmp" | head -1 | sed 's/.*rtmp[s]*:\/\///g' | sed 's/\/.*//g' | tr -d '\015')
echo
echo "/var/www/bigbluebutton/check/conf/config.xml (client check)"
echo " client check: $CHECK_URL"
fi
if [ -f $RECORD_CONFIG ]; then
2017-02-21 03:11:22 +08:00
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)"
2018-06-25 03:56:09 +08:00
echo " ffmpeg: $(ffmpeg -version 2>/dev/null | grep ffmpeg | cut -d ' ' -f3 | sed 's/--.*//g' | tr -d '\n')"
2017-02-21 03:11:22 +08:00
fi
if [ -f $SIP_CONFIG ]; then
echo
echo "$SIP_CONFIG (sip.nginx)"
echo " proxy_pass: $(cat $SIP_CONFIG | grep proxy_pass | sed 's/.*proxy_pass //g' | sed 's/;//'g )"
fi
if [ -f $KURENTO_CONFIG ]; then
echo
echo "$KURENTO_CONFIG (Kurento SFU)"
echo " kurento.ip: $(yq r $KURENTO_CONFIG kurento[0].ip)"
echo " kurento.url: $(yq r $KURENTO_CONFIG kurento[0].url)"
echo " localIpAddress: $(yq r $KURENTO_CONFIG localIpAddress)"
echo " recordScreenSharing: $(yq r $KURENTO_CONFIG recordScreenSharing)"
echo " recordWebcams: $(yq r $KURENTO_CONFIG recordWebcams)"
echo " codec_video_main: $(yq r $KURENTO_CONFIG conference-media-specs.codec_video_main)"
echo " codec_video_content: $(yq r $KURENTO_CONFIG conference-media-specs.codec_video_content)"
fi
if [ -f $HTML5_CONFIG ]; then
echo
echo "/usr/share/meteor/bundle/programs/server/assets/app/config/settings.yml (HTML5 client)"
echo " build: $(yq r $HTML5_CONFIG public.app.html5ClientBuild)"
echo " kurentoUrl: $(yq r $HTML5_CONFIG public.kurento.wsUrl)"
echo " enableListenOnly: $(yq r $HTML5_CONFIG public.kurento.enableListenOnly)"
fi
2017-02-21 03:11:22 +08:00
check_state
echo
exit 0
fi
#
2018-07-24 17:35:48 +08:00
# Zip log files
2017-02-21 03:11:22 +08:00
#
if [ $ZIP ]; then
need_root
LOG_FILE="$(date +'%Y%m%d')-$(date +%H)"
#
# Check log files
#
rm -f /tmp/$LOG_FILE.tar
rm -f /tmp/$LOG_FILE.tar.gz
rm -f /tmp/a
touch /tmp/empty
tar cf /tmp/$LOG_FILE.tar /tmp/empty > /dev/null 2>&1
tar rfh /tmp/$LOG_FILE.tar $RED5_DIR/log > /dev/null 2>&1
tar rfh /tmp/$LOG_FILE.tar $SERVLET_LOGS > /dev/null 2>&1
tar rf /tmp/$LOG_FILE.tar /var/log/bigbluebutton/* > /dev/null 2>&1
tar rf /tmp/$LOG_FILE.tar /var/log/bbb-apps-akka > /dev/null 2>&1
tar rf /tmp/$LOG_FILE.tar /var/log/bbb-transcode-akka > /dev/null 2>&1
2017-02-21 03:11:22 +08:00
tar rf /tmp/$LOG_FILE.tar /var/log/bbb-fsesl-akka > /dev/null 2>&1
tar rf /tmp/$LOG_FILE.tar /var/log/nginx/error.log > /dev/null 2>&1
if [ $DISTRIB_ID == "ubuntu" ]; then
tar rf /tmp/$LOG_FILE.tar /var/log/syslog > /dev/null 2>&1
fi
tar tf /tmp/$LOG_FILE.tar
gzip /tmp/$LOG_FILE.tar
mv /tmp/$LOG_FILE.tar.gz /root/$LOG_FILE.tar.gz
echo
echo " Created: /root/$LOG_FILE.tar.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
rm -rf /tmp/t
grep --directories=skip ERROR $RED5_DIR/log/* > /tmp/t
if [ -s /tmp/t ]; then
echo " -- ERRORS found in $RED5_DIR/log/* -- "
cat /tmp/t
echo
fi
rm -rf /tmp/t
grep --directories=skip Exception $RED5_DIR/log/* > /tmp/t
if [ -s /tmp/t ]; then
echo " -- Exceptions found in $RED5_DIR/log/* -- "
cat /tmp/t
echo
fi
rm -rf /tmp/t
2018-12-09 08:23:20 +08:00
$SUDO grep --directories=skip Exception $SERVLET_LOGS/* | grep -v CacheExceptionHandlerFactory > /tmp/t
2017-02-21 03:11:22 +08:00
if [ -s /tmp/t ]; then
echo " -- Exceptions found in $SERVLET_LOGS/ -- "
cat /tmp/t
echo
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
2018-12-09 08:23:20 +08:00
$SUDO grep --directories=skip -i exception /var/log/syslog > /tmp/t
2017-02-21 03:11:22 +08:00
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
2018-12-09 08:23:20 +08:00
$SUDO grep --directories=skip ERROR /var/log/bigbluebutton/* > /tmp/t
2017-02-21 03:11:22 +08:00
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
2018-12-09 08:23:20 +08:00
$SUDO grep --directories=skip -i exception /var/log/bigbluebutton/* > /tmp/t
2017-02-21 03:11:22 +08:00
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
#
# Just use the IP for port test in /var/www/bigbluebutton/client/conf/config.xml
#
echo "Assigning $HOST for testing for firewall in /var/www/bigbluebutton/client/conf/config.xml"
2018-12-09 08:23:20 +08:00
$SUDO sed -i "s/porttest host=\(\"[^\"]*\"\)/porttest host=\"$PROTOCOL_RTMP:\/\/$HOST\"/g" /var/www/bigbluebutton/client/conf/config.xml
2017-02-21 03:11:22 +08:00
echo "Assigning $HOST for rtmp:// in /var/www/bigbluebutton/client/conf/config.xml"
2018-12-09 08:23:20 +08:00
$SUDO sed -i "s/rtmp[s]*:\/\/\([^\"\/]*\)\([\"\/]\)/$PROTOCOL_RTMP:\/\/$HOST\2/g" /var/www/bigbluebutton/client/conf/config.xml
2017-02-21 03:11:22 +08:00
echo "Assigning $HOST for servername in /etc/nginx/sites-available/bigbluebutton"
2018-12-09 08:23:20 +08:00
$SUDO sed -i "s/server_name .*/server_name $HOST;/g" /etc/nginx/sites-available/bigbluebutton
2017-02-21 03:11:22 +08:00
#
# Update configuration for BigBlueButton client (and preserve hostname for chromeExtensionLink if exists)
#
2018-02-03 23:39:12 +08:00
# Extract the chrome store URL before updating config.xml. We will be able to restore it.
chromeExtensionLinkURL=$(cat /var/www/bigbluebutton/client/conf/config.xml | sed -n '/chromeExtensionLink/{s/.*https*:\/\///;s/\/.*//;p}')
echo "Assigning $HOST for http[s]:// in /var/www/bigbluebutton/client/conf/config.xml"
$SUDO sed -i "s/http[s]*:\/\/\([^\"\/]*\)\([\"\/]\)/$PROTOCOL:\/\/$HOST\2/g" \
/var/www/bigbluebutton/client/conf/config.xml
if ! echo "$chromeExtensionLinkURL" | grep -q '""'; then
2018-12-09 08:23:20 +08:00
$SUDO sed -i "s/chromeExtensionLink=\"https:\/\/[^\/]*/chromeExtensionLink=\"https:\/\/$chromeExtensionLinkURL/g" \
/var/www/bigbluebutton/client/conf/config.xml
fi
2018-02-03 23:39:12 +08:00
echo "Assigning $HOST for publishURI in /var/www/bigbluebutton/client/conf/config.xml"
2018-12-09 08:23:20 +08:00
$SUDO sed -i "s/publishURI=\"[^\"]*\"/publishURI=\"$HOST\"/" /var/www/bigbluebutton/client/conf/config.xml
2017-02-21 03:11:22 +08:00
#
# Update configuration for BigBlueButton web app
#
2019-02-08 07:10:55 +08:00
echo "Assigning $HOST for web application URL in ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties"
2017-02-21 03:11:22 +08:00
$SUDO sed -i "s/bigbluebutton.web.serverURL=http[s]*:\/\/.*/bigbluebutton.web.serverURL=$PROTOCOL:\/\/$HOST/g" \
2019-02-08 07:10:55 +08:00
${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties
2017-02-21 03:11:22 +08:00
2018-12-09 08:23:20 +08:00
$SUDO sed -i "s/screenshareRtmpServer=.*/screenshareRtmpServer=$HOST/g" \
2019-02-08 07:10:55 +08:00
${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties
2017-02-21 03:11:22 +08:00
change_var_value /usr/share/red5/webapps/screenshare/WEB-INF/screenshare.properties streamBaseUrl rtmp://$HOST/screenshare
change_var_value /usr/share/red5/webapps/screenshare/WEB-INF/screenshare.properties jnlpUrl $PROTOCOL://$HOST/screenshare
change_var_value /usr/share/red5/webapps/screenshare/WEB-INF/screenshare.properties jnlpFile $PROTOCOL://$HOST/screenshare/screenshare.jnlp
2017-02-21 03:11:22 +08:00
if ! grep -q server_names_hash_bucket_size /etc/nginx/nginx.conf; then
2018-12-09 08:23:20 +08:00
$SUDO sed -i "s/gzip on;/gzip on;\n server_names_hash_bucket_size 64;/g" /etc/nginx/nginx.conf
2017-02-21 03:11:22 +08:00
fi
#
# Update bbb-apps-akka
#
echo "Assigning $HOST for web application URL in /usr/share/bbb-apps-akka/conf/application.conf"
if [ -f /usr/share/bbb-apps-akka/conf/application.conf ]; then
sed -i "s/bbbWebAPI[ ]*=[ ]*\"[^\"]*\"/bbbWebAPI=\"${PROTOCOL}:\/\/$HOST\/bigbluebutton\/api\"/g" \
2017-02-21 03:11:22 +08:00
/usr/share/bbb-apps-akka/conf/application.conf
sed -i "s/deskshareip[ ]*=[ ]*\"[^\"]*\"/deskshareip=\"$HOST\"/g" \
/usr/share/bbb-apps-akka/conf/application.conf
# Fix to ensure application.conf has the latest shared secret
2019-02-08 07:10:55 +08:00
SECRET=$(cat ${SERVLET_DIR}/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | grep securitySalt | cut -d= -f2);
2017-02-21 03:11:22 +08:00
sed -i "s/sharedSecret[ ]*=[ ]*\"[^\"]*\"/sharedSecret=\"$SECRET\"/g" \
/usr/share/bbb-apps-akka/conf/application.conf
fi
2019-02-08 09:39:41 +08:00
#
# Update api demos
#
if [ -f ${TOMCAT_DIR}/webapps/demo/bbb_api_conf.jsp ]; then
echo "Assigning $HOST for api demos in ${TOMCAT_DIR}/webapps/demo/bbb_api_conf.jsp"
$SUDO sed -i "s/BigBlueButtonURL = \"http[s]*:\/\/\([^\"\/]*\)\([\"\/]\)/BigBlueButtonURL = \"$PROTOCOL:\/\/$HOST\2/g" \
${TOMCAT_DIR}/webapps/demo/bbb_api_conf.jsp
2019-02-08 09:39:41 +08:00
fi
2017-02-21 03:11:22 +08:00
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"
2017-02-21 03:11:22 +08:00
# 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
2017-02-21 03:11:22 +08:00
sed -i "s/bigbluebuttonURL=https:\/\/.*/bigbluebuttonURL=https:\/\/$HOST\/bigbluebutton/g" \
${LTI_DIR}/WEB-INF/classes/lti-config.properties
2017-02-21 03:11:22 +08:00
sed -i "s/ltiEndPoint=.*/ltiEndPoint=$HOST/g" \
${LTI_DIR}/WEB-INF/classes/lti-config.properties
2017-02-21 03:11:22 +08:00
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 $redis_host playback_host $HOST
fi
echo -n "Assigning $HOST for playback of recordings: "
for metadata in $(find /var/bigbluebutton/published -name metadata.xml); do
echo -n "."
# Ensure we update both types of URLs
sed -i "/<link>/{s/http:\/\/\([^\"\/]*\)\/playback\/$type\([^<]\)/http:\/\/$HOST\/playback\/$type\2/g}" $metadata
sed -i "/<link>/{s/https:\/\/\([^\"\/]*\)\/playback\/$type\([^<]\)/https:\/\/$HOST\/playback\/$type\2/g}" $metadata
done
for metadata in $(find /var/bigbluebutton/unpublished -name metadata.xml); do
echo -n "."
# Ensure we update both types of URLs
sed -i "/<link>/{s/http:\/\/\([^\"\/]*\)\/playback\/$type\([^<]\)/http:\/\/$HOST\/playback\/$type\2/g}" $metadata
sed -i "/<link>/{s/https:\/\/\([^\"\/]*\)\/playback\/$type\([^<]\)/https:\/\/$HOST\/playback\/$type\2/g}" $metadata
done
echo
if [ -f /var/www/bigbluebutton/check/conf/config.xml ]; then
echo "Assigning $HOST for client self check to /var/www/bigbluebutton/check/conf/config.xml"
sed -i "s/rtmp[s]*:\/\/\([^\"\/]*\)\//$PROTOCOL_RTMP:\/\/$HOST\//g" /var/www/bigbluebutton/check/conf/config.xml
sed -i "s/rtmpt:\/\/\([^\"\/]*\)\//rtmpt:\/\/$HOST\//g" /var/www/bigbluebutton/check/conf/config.xml
fi
#
# Update HTML5 client
#
if [ -f $HTML5_CONFIG_OLD ]; then
2019-02-08 07:10:55 +08:00
WS=$(cat $SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | sed -n '/^bigbluebutton.web.serverURL/{s/.*=//;p}' | sed 's/https/wss/g' | sed s'/http/ws/g')
sed -i "s|\"wsUrl.*|\"wsUrl\": \"$WS/bbb-webrtc-sfu\",|g" $HTML5_CONFIG_OLD
fi
if [ -f $HTML5_CONFIG ]; then
2019-02-08 07:10:55 +08:00
WS=$(cat $SERVLET_DIR/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | sed -n '/^bigbluebutton.web.serverURL/{s/.*=//;p}' | sed 's/https/wss/g' | sed s'/http/ws/g')
2018-10-23 04:27:46 +08:00
change_yml_value $HTML5_CONFIG wsUrl "$WS/bbb-webrtc-sfu"
2018-10-23 04:27:46 +08:00
if [ -f /usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml ]; then
yq w -i /usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml kurento[0].url "ws://$HOST:8888/kurento"
2018-10-23 04:27:46 +08:00
fi
fi
2018-04-30 09:01:01 +08:00
#
# Update thumbnail links
#
find /var/bigbluebutton/published -name metadata.xml -exec \
sed -i "s/<image width=\"\([0-9]*\)\" height=\"\([0-9]*\)\" alt=\"\([^\"]*\)\">\(http[s]*\):\/\/[^\/]*\/\(.*\)/<image width=\"\1\" height=\"\2\" alt=\"\3\">\4:\/\/$HOST\/\5/g" \
2018-04-30 09:01:01 +08:00
'{}' \;
2017-02-21 03:11:22 +08:00
echo "Restarting the BigBlueButton $BIGBLUEBUTTON_RELEASE ..."
stop_bigbluebutton
echo
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
2017-09-26 10:25:19 +08:00
echo "Restarting BigBlueButton $BIGBLUEBUTTON_RELEASE (and cleaning out all log files) ..."
2017-02-21 03:11:22 +08:00
stop_bigbluebutton
#
# Clean log files
#
echo " ... cleaning log files"
rm -f /var/log/bigbluebutton/bbb-web.log*
rm -f /var/log/bigbluebutton/*.log
2018-05-11 07:54:30 +08:00
rm -f /opt/freeswitch/var/log/freeswitch/*.log
2017-02-21 03:11:22 +08:00
#
# Clean out the log files for record and playback
#
rm -f /var/log/bigbluebutton/bbb-rap-worker.log*
rm -f /var/log/bigbluebutton/archive.log*
2018-12-10 04:47:13 +08:00
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 [ -d /var/log/bigbluebutton/screenshare ]; then
rm -f /var/log/bigbluebutton/screenshare/*
2017-02-21 03:11:22 +08:00
fi
if [ $RED5_DIR ]; then
rm -rf $RED5_DIR/log/*
fi
if [ $SERVLET_LOGS ]; then
rm -rf $SERVLET_LOGS/*
fi
rm -rf /var/log/nginx/*
#if [ $DISTRO == "ubuntu" ]; then
# mv /var/log/syslog /tmp/syslog.$$
# echo "" > /var/log/syslog
# chown syslog:adm /var/log/syslog
#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-transcode-akka ]; then
rm -f /var/log/bbb-transcode-akka/*
fi
2018-06-25 06:45:30 +08:00
if [ -d /var/log/bbb-webrtc-sfu ]; then
rm -f /var/log/bbb-webrtc-sfu/*
2018-06-25 06:45:30 +08:00
fi
2018-12-10 04:47:13 +08:00
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
2018-06-25 06:45:30 +08:00
2017-02-21 03:11:22 +08:00
start_bigbluebutton
check_state
fi
if [ $NETWORK ]; then
netstat -ant | egrep ":1935|:80\ " | egrep -v ":::|0.0.0.0" > /tmp/t_net
2017-02-21 03:11:22 +08:00
REMOTE=$(cat /tmp/t_net | cut -c 45-68 | cut -d ":" -f1 | sort | uniq)
2017-02-21 03:11:22 +08:00
if [ "$REMOTE" != "" ]; then
echo -e "netstat\t\t\t80\t1935"
2017-02-21 03:11:22 +08:00
for IP in $REMOTE ; do
PORT_1935=$(cat /tmp/t_net | grep :1935 | cut -c 45-68 | cut -d ":" -f1 | grep $IP | wc -l)
PORT_80=$(cat /tmp/t_net | grep :80 | cut -c 45-68 | cut -d ":" -f1 | grep $IP | wc -l )
echo -e "$IP\t\t$PORT_80\t$PORT_1935"
2017-02-21 03:11:22 +08:00
done
fi
fi
2017-02-21 03:11:22 +08:00
if [ $WATCH ]; then
need_root
watch -n 2 "top -n 1 -b | head -n 5; echo; bbb-conf --network; bbb-conf --debug"
fi