aboutsummaryrefslogtreecommitdiff
path: root/www/bigbluebutton/files/bbb-conf.in
blob: 9415932f8175e3feec31f6f49b3d6e1ef30bf8c4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
#!/bin/sh -e
#
# $FreeBSD$
#

# Script variables
SCRIPT="$(basename $0)"
BACKUP=".$(date "+%Y.%m.%d_%H:%M:%S")"

# System path
PREFIX="%%PREFIX%%"
RED5_HOME="%%RED5_HOME%%"
RED5_LOGS="%%RED5_LOGS%%"
RED5_USER="%%RED5_USER%%"
RED5_GROUP="%%RED5_GROUP%%"
TOMCAT_HOME="%%TOMCAT_HOME%%"
TOMCAT_LOGS="%%TOMCAT_LOGS%%"
TOMCAT_USER="%%TOMCAT_USER%%"
TOMCAT_GROUP="%%TOMCAT_GROUP%%"
FREESWITCH_USER="%%FREESWITCH_USER%%"
FREESWITCH_GROUP="%%FREESWITCH_GROUP%%"
WWWROOT="%%WWWROOT%%"
WWWDIR="%%WWWDIR%%"
ASTERISK_ETC="$PREFIX/etc/asterisk"
FREESWITCH_ETC="$PREFIX/etc/freeswitch"
NGINX_ETC="$PREFIX/etc/nginx"

# System commands
INSTALL_CMD="install -B $BACKUP"

# BBB security salt
BBB_SALT=""

# BBB common
BBB_SHAREDIR="%%DATADIR%%"
BBB_PRESENTATIONDIR="/var/spool/%%PORTNAME%%"
BBB_SRV_LIST=""
BBB_INSTALL_CONF="$BBB_PRESENTATIONDIR/conf.txt"

# BBB JDBC properties
BBB_DATABASE_TYPE="mysql"
BBB_DATABASE_HOST=""
BBB_DATABASE_NAME="%%PORTNAME%%"
BBB_DATABASE_URL=""
BBB_DATABASE_DRIVER="com.mysql.jdbc.Driver"
BBB_DATABASE_USERNAME="%%PORTNAME%%"
BBB_DATABASE_PASSWORD=""

# Conference module and type
BBB_CONFERENCE_MODULE=""
BBB_CONFERENCE_TYPE=""

# FreeSWITCH Event Socket Library (ESL)
BBB_ESL_HOST=""
BBB_ESL_PORT="8021"
BBB_ESL_PASSWORD=""

# Asterisk Management Interface (AMI)
BBB_AMI_HOST=""
BBB_AMI_PORT="5038"
BBB_AMI_USERNAME="bbb"
BBB_AMI_PASSWORD=""

# SIP
BBB_SIP_HOST=""
BBB_SIP_PORT="5070"
BBB_SIP_USERNAME="bbbuser"
BBB_SIP_PASSWORD=""

# All vars list
BBB_VAR_LIST="PREFIX WWWROOT WWWDIR \
	RED5_HOME RED5_LOGS RED5_USER RED5_GROUP \
	TOMCAT_HOME TOMCAT_LOGS TOMCAT_USER TOMCAT_GROUP \
	ASTERISK_ETC NGINX_ETC BBB_HOSTNAME BBB_IP_ADDRESS BBB_SALT \
	BBB_SHAREDIR BBB_PRESENTATIONDIR BBB_SRV_LIST BBB_INSTALL_CONF \
	BBB_DATABASE_TYPE BBB_DATABASE_HOST BBB_DATABASE_NAME BBB_DATABASE_URL \
	BBB_DATABASE_DRIVER BBB_DATABASE_USERNAME BBB_DATABASE_PASSWORD \
	BBB_CONFERENCE_MODULE BBB_CONFERENCE_TYPE \
	BBB_NO_KONFERENCE BBB_NO_MEETME \
	BBB_ESL_HOST BBB_ESL_PORT BBB_ESL_PASSWORD \
	BBB_AMI_HOST BBB_AMI_PORT BBB_AMI_USERNAME BBB_AMI_PASSWORD \
	BBB_SIP_HOST BBB_SIP_PORT BBB_SIP_USERNAME BBB_SIP_PASSWORD"

bbb_usage() {
	cat <<-EOF

	$1

	Install initial configuration:
	$SCRIPT install -h <hostname|ip address> -c <konference|meetme|freeswitch>

	Start all BigBlueButton services:
	$SCRIPT start

	Stop all BigBlueButton services:
	$SCRIPT stop

	Restart all bbb services:
	$SCRIPT restart

	EOF

	exit 1
}

bbb_random() {
	openssl rand -base64 48 | sed -E 's|[^A-Za-z0-9]||g' | cut -c 1-$1
}

bbb_install() {
	CHECK_PKGS="swftools ImageMagick mysql-server activemq nginx tomcat"
	CHECK_PKGS="$CHECK_PKGS red5"
	CHECK_DIRS="RED5_HOME TOMCAT_HOME WWWROOT WWWDIR NGINX_ETC BBB_SHAREDIR"

	case "$BBB_CONFERENCE_MODULE" in
	konference|meetme)
		CHECK_PKGS="$CHECK_PKGS asterisk"
		CHECK_DIRS="$CHECK_DIRS ASTERISK_ETC"
		;;
	freeswitch)
		CHECK_PKGS="$CHECK_PKGS freeswitch"
		CHECK_DIRS="$CHECK_DIRS FREESWITCH_ETC"
		;;
	esac

	for pkg in $CHECK_PKGS; do
		echo -n "Check package $pkg: "
		pkg_info -E ${pkg}\* || usage "$SCRIPT required $pkg package"
	done

	for var in $CHECK_DIRS; do
		eval val=\$$var
		echo -n "Check $var = '$val': "
		if [ -n "$val" -a -d "$val" ]; then
			echo "ok"
		else
			echo "not found"
			exit 2
		fi
	done

	BBB_SALT="$(bbb_random 32)"
	BBB_DATABASE_PASSWORD="$(bbb_random 16)"
	BBB_ESL_PASSWORD="$(bbb_random 16)"
	BBB_AMI_PASSWORD="$(bbb_random 16)"
	BBB_SIP_PASSWORD="$(bbb_random 16)"
	BBB_IP_ADDRESS="$(getent hosts "$BBB_HOSTNAME" | awk '{print $1}')"
	BBB_DATABASE_HOST="$BBB_IP_ADDRESS"
	BBB_DATABASE_URL="jdbc:$BBB_DATABASE_TYPE://$BBB_DATABASE_HOST/$BBB_DATABASE_NAME"
	BBB_ESL_HOST="$BBB_IP_ADDRESS"
	BBB_AMI_HOST="$BBB_IP_ADDRESS"
	BBB_SIP_HOST="$BBB_IP_ADDRESS"

	for var in $BBB_VAR_LIST; do
		eval val=\$$var
		BBB_REPLACE="$BBB_REPLACE -e s|%%$var%%|$val|g"
	done

	$INSTALL_CMD -d -m 0777 $BBB_PRESENTATIONDIR
	mkdir -p /etc/rc.conf.d

	echo "Configure activemq: rc.conf"
	BBB_SRV_LIST="activemq"
	cat >/etc/rc.conf.d/activemq <<-EOF
	activemq_enable="YES"
	EOF

	echo -n "Configure $BBB_DATABASE_TYPE: drop/create/grant"
	(/usr/local/etc/rc.d/mysql-server onestatus || /usr/local/etc/rc.d/mysql-server onestart) >/dev/null 2>&1
	mysql -u root >/dev/null <<-EOF
	drop database if exists $BBB_DATABASE_NAME;
	create database $BBB_DATABASE_NAME;
	grant all on $BBB_DATABASE_NAME.* to '$BBB_DATABASE_USERNAME'@'$BBB_DATABASE_HOST' identified by '$BBB_DATABASE_PASSWORD';
	commit;
	EOF

	echo " rc.conf"
	BBB_SRV_LIST="$BBB_SRV_LIST mysql-server"
	cat >/etc/rc.conf.d/mysql <<-EOF
	mysql_enable="YES"
	EOF

	/usr/local/etc/rc.d/mysql-server stop >/dev/null 2>&1

	echo -n "Configure $BBB_CONFERENCE_TYPE:"
	case "$BBB_CONFERENCE_MODULE" in
	konference|meetme)
		cd $ASTERISK_ETC
		for i in extensions sip; do
			echo -n " bbb_$i.conf"
			$INSTALL_CMD -m 0600 $BBB_SHAREDIR/asterisk/bbb_$i.conf-dist bbb_$i.conf
			sed -i '' $BBB_REPLACE bbb_$i.conf
		done

		for i in $(jot - 3000 3029); do
			cat <<-EOF
			[$i]
			type=friend
			username=$i
			insecure=very
			qualify=yes
			nat=yes
			host=dynamic
			canreinvite=no
			context=bbb-voip
			disallow=all
			allow=ulaw

			EOF
		done >>bbb_sip.conf

		echo -n " extensions.conf"
		$INSTALL_CMD -m 0600 extensions.conf-dist extensions.conf
		cat >>extensions.conf <<-EOF
		#include "bbb_extensions.conf"
		EOF

		echo -n " sip.conf"
		$INSTALL_CMD -m 0600 sip.conf-dist sip.conf
		cat >>sip.conf <<-EOF
		#include "bbb_sip.conf"
		EOF

		echo -n " modules.conf"
		$INSTALL_CMD -m 0600 modules.conf-dist modules.conf
		case "$BBB_CONFERENCE_MODULE" in
		konference)
			cat >>modules.conf <<-EOF
			noload => codec_dahdi.so 
			noload => app_meetme.so
			load => app_konference.so
			EOF
			;;
		meetme)
			$INSTALL_CMD $PREFIX/etc/zaptel.conf.sample \
				$PREFIX/etc/zaptel.conf
			cat >>modules.conf <<-EOF
			noload => codec_dahdi.so 
			load => app_meetme.so
			noload => app_konference.so
			EOF

			BBB_SRV_LIST="$BBB_SRV_LIST zaptel"
			cat >/etc/rc.conf.d/zaptel <<-EOF
			zaptel_enable="YES"
			zaptel_kmod_load="zaptel.ko ztdummy.ko"
			EOF
			;;
		esac

		echo -n " manager.conf"
		$INSTALL_CMD -m 0600 manager.conf-dist manager.conf
		sed -i '' 's|^enabled.*$|enabled = yes|' manager.conf
		cat >>manager.conf <<-EOF
		[$BBB_AMI_USERNAME]
		secret = $BBB_AMI_PASSWORD
		permit = 0.0.0.0/0.0.0.0
		read = system,call,log,verbose,command,agent,user
		write = system,call,log,verbose,command,agent,user
		EOF

		echo " rc.conf"
		BBB_SRV_LIST="$BBB_SRV_LIST asterisk"
		cat >/etc/rc.conf.d/asterisk <<-EOF
		asterisk_enable="YES"
		EOF
		;;
	freeswitch)
		cd $FREESWITCH_ETC
		echo -n " backup"
		mv conf conf$BACKUP

		echo -n " extract"
		(cd $BBB_SHAREDIR/freeswitch && tar cf - conf) | tar xf -
		chown -R $FREESWITCH_USER:$FREESWITCH_GROUP conf
		cd conf

		echo -n " event_socket.conf.xml"
		$INSTALL_CMD -m 0600 -o $FREESWITCH_USER -g $FREESWITCH_GROUP \
			autoload_configs/event_socket.conf.xml-dist \
			autoload_configs/event_socket.conf.xml
		sed -i '' $BBB_REPLACE autoload_configs/event_socket.conf.xml

		echo -n " acl.conf.xml"
		$INSTALL_CMD -m 0600 -o $FREESWITCH_USER -g $FREESWITCH_GROUP \
			autoload_configs/acl.conf.xml-dist \
			autoload_configs/acl.conf.xml
		sed -i '' $BBB_REPLACE autoload_configs/acl.conf.xml

		echo -n " $BBB_SIP_USERNAME.xml"
		$INSTALL_CMD -m 0600 -o $FREESWITCH_USER -g $FREESWITCH_GROUP \
			directory/default/bbbuser.xml-dist \
			directory/default/$BBB_SIP_USERNAME.xml
		sed -i '' $BBB_REPLACE directory/default/$BBB_SIP_USERNAME.xml

		echo " rc.conf"
		BBB_SRV_LIST="$BBB_SRV_LIST freeswitch"
		cat >/etc/rc.conf.d/freeswitch <<-EOF
		freeswitch_enable="YES"
		freeswitch_flags="-ncwait -waste -nonat"
		EOF
		;;
	esac

	echo "Configure openoffice: rc.conf"
	BBB_SRV_LIST="$BBB_SRV_LIST openoffice"
	cat >/etc/rc.conf.d/openoffice <<-EOF
	openoffice_enable="YES"
	EOF

	echo -n "Configure tomcat:"
	chown -R $TOMCAT_USER:$TOMCAT_GROUP $TOMCAT_LOGS
	cd $TOMCAT_HOME/webapps/bigbluebutton

	echo -n " bbb_api_conf.jsp"
	$INSTALL_CMD -m 0600 -o $TOMCAT_USER -g $TOMCAT_GROUP \
		demo/bbb_api_conf.jsp-dist \
		demo/bbb_api_conf.jsp

	echo -n " bigbluebutton.properties"
	$INSTALL_CMD -m 0600 -o $TOMCAT_USER -g $TOMCAT_GROUP \
		WEB-INF/classes/bigbluebutton.properties-dist \
		WEB-INF/classes/bigbluebutton.properties

	echo -n " log4j.properties"
	$INSTALL_CMD -m 0600 -o $TOMCAT_USER -g $TOMCAT_GROUP \
		WEB-INF/classes/log4j.properties-dist \
		WEB-INF/classes/log4j.properties
	sed -i '' $BBB_REPLACE demo/bbb_api_conf.jsp \
		WEB-INF/classes/bigbluebutton.properties \
		WEB-INF/classes/log4j.properties

	echo " rc.conf"
	BBB_SRV_LIST="$BBB_SRV_LIST tomcat6"
	cat >/etc/rc.conf.d/tomcat60 <<-EOF
	tomcat60_enable="YES"
	tomcat60_stop_timeout="30"
	EOF

	echo -n "Configure red5:"
	if grep -q '127\.0\.0\.1' $RED5_HOME/conf/red5.properties; then
		echo -n " red5.properties"
		sed -i $BACKUP 's|127\.0\.0\.1|0.0.0.0|g' $RED5_HOME/conf/red5.properties
	fi

	cd $RED5_HOME/webapps/bigbluebutton/WEB-INF
	echo -n " red5-web.xml"
	$INSTALL_CMD -m 0600 -o $RED5_USER -g $RED5_GROUP \
		red5-web.xml-dist \
		red5-web.xml
	sed -i '' $BBB_REPLACE red5-web.xml

	echo -n " bigbluebutton.properties"
	$INSTALL_CMD -m 0600 -o $RED5_USER -g $RED5_GROUP \
		bigbluebutton.properties-dist \
		bigbluebutton.properties
	sed -i '' $BBB_REPLACE bigbluebutton.properties

	cd $RED5_HOME/webapps/sip/WEB-INF
	echo -n " bigbluebutton-sip.properties"
	$INSTALL_CMD -m 0600 -o $RED5_USER -g $RED5_GROUP \
		bigbluebutton-sip.properties-dist \
		bigbluebutton-sip.properties
	sed -i '' $BBB_REPLACE  bigbluebutton-sip.properties

	echo " rc.conf"
	BBB_SRV_LIST="$BBB_SRV_LIST red5"
	RED5_RMI_PORT=$(awk -F= '/^jmx.rmi.port.registry/{print $2}' $RED5_HOME/conf/red5.properties)
	RED5_RMI_USER=$(awk '/^[^#].+readwrite$/{print $1}' $RED5_HOME/conf/access.properties | head -1)
	RED5_RMI_PASSWD=$(awk '/^'$RED5_RMI_USER'[\ \t]+/{print $2}' $RED5_HOME/conf/password.properties)
	
	cat >/etc/rc.conf.d/red5 <<-EOF
	red5_enable="YES"
	red5_stop_timeout="30"
	red5_stop_class_opts="$RED5_RMI_PORT $RED5_RMI_USER $RED5_RMI_PASSWD"
	EOF

	echo -n "Configure nginx:"
	cd $NGINX_ETC
	mkdir -p sites-available sites-enabled

	echo -n " nginx.conf"
	$INSTALL_CMD $BBB_SHAREDIR/nginx/nginx.conf-dist nginx.conf

	echo -n " bigbluebutton.conf"
	$INSTALL_CMD $BBB_SHAREDIR/nginx/nginx-bigbluebutton.conf-dist \
		sites-available/bigbluebutton.conf
	sed -i '' $BBB_REPLACE nginx.conf sites-available/bigbluebutton.conf
	cd sites-enabled
	rm -f bigbluebutton.conf
	ln -s ../sites-available/bigbluebutton.conf \
		bigbluebutton.conf
	cd $WWWDIR/client/conf

	echo -n " config.xml"
	$INSTALL_CMD config.xml-dist config.xml
	sed -i '' $BBB_REPLACE config.xml

	echo " rc.conf"
	BBB_SRV_LIST="$BBB_SRV_LIST nginx"
	cat >/etc/rc.conf.d/nginx <<-EOF
	nginx_enable="YES"
	EOF

	echo -n "Save config:"
	$INSTALL_CMD -m 0600 /dev/null $BBB_INSTALL_CONF
	cat >$BBB_INSTALL_CONF <<-EOF
	#
	# ${BACKUP#.}
	#
	EOF

	for var in $BBB_VAR_LIST; do
		eval val=\$$var
		cat >>$BBB_INSTALL_CONF <<-EOF
		$var="$val"
		EOF
	done
	echo " $BBB_INSTALL_CONF"
}

bbb_start() {
	for i in $BBB_SRV_LIST; do
		$PREFIX/etc/rc.d/$i start || true
	done
}

bbb_stop() {
	for i in $BBB_SRV_LIST; do
		REVERSE_SRV_LIST="$i $REVERSE_SRV_LIST"
	done

	for i in $REVERSE_SRV_LIST; do
		$PREFIX/etc/rc.d/$i stop || true
	done
}

bbb_restart() {
	bbb_stop
	bbb_start
}

if [ "`/usr/bin/id -u`" != "0" ]; then
	bbb_usage "$SCRIPT must be run as root"
fi

if [ $# -eq 0 ]; then
	bbb_usage "$SCRIPT <install|start|stop|restart> [options]"
fi

BBB_ACTION="$1"
shift

while getopts :h:c: OPT; do
	case "$OPT" in
	h)
		BBB_HOSTNAME="$OPTARG"
		;;
	c)
		BBB_CONFERENCE_MODULE="$OPTARG"
		;;
	*)
		bbb_usage "Error: '$OPTARG' is not a valid option"
		;;
	esac
done

case "$BBB_ACTION" in
install)
	if [ -z "$BBB_HOSTNAME" ]; then
		bbb_usage "Error: 'install' action required '-h' option"
	else
		if ! getent hosts "$BBB_HOSTNAME" >/dev/null 2>&1; then
			bbb_usage "Error: hostname '$BBB_HOSTNAME' not found by getent command"
		fi
	fi

	if [ -z "$BBB_CONFERENCE_MODULE" ]; then
		bbb_usage "Error: 'install' action required '-c' option"
	else
		case "$BBB_CONFERENCE_MODULE" in
		konference)
			test -f $PREFIX/lib/asterisk/modules/app_konference.so || bbb_usage "Error: app_konference.so not found. Please reinstall %%PORTNAME%% with KONFERENCE option"
			BBB_CONFERENCE_TYPE="asterisk"
			BBB_NO_KONFERENCE=""
			BBB_NO_MEETME=";"
			;;
		meetme)
			test -f $PREFIX/lib/asterisk/modules/app_meetme.so || bbb_usage "Error: app_meetme.so not found. Please reinstall %%PORTNAME%% with MEETME option"
			BBB_CONFERENCE_TYPE="asterisk"
			BBB_NO_KONFERENCE=";"
			BBB_NO_MEETME=""
			;;
		freeswitch)
			test -f $PREFIX/bin/freeswitch || bbb_usage "Error: freeswitch not found. Please reinstall %%PORTNAME%% with FREESWITCH option"
			BBB_CONFERENCE_TYPE="freeswitch"
			;;
		*)
			bbb_usage "Error: unknown conference module '$BBB_CONFERENCE_TYPE'"
			;;
		esac
	fi
	bbb_install
	;;
start|stop|restart)
	if [ -n "$BBB_HOSTNAME" -o -n "$BBB_CONFERENCE_MODULE" ]; then
		bbb_usage "Error: '$BBB_ACTION' action do not allow any options"
	fi

	if [ -s "$BBB_INSTALL_CONF" ]; then
		. $BBB_INSTALL_CONF
	else
		bbb_usage "Error: '$BBB_ACTION' action allow only after install"
	fi

	eval bbb_$BBB_ACTION
	;;
*)
	bbb_usage "Error: '$BBB_ACTION' is not valid action"
	;;
esac

exit 0