diff --git a/bbb-webrtc-sfu b/bbb-webrtc-sfu index 400fe63..8dfb34d 160000 --- a/bbb-webrtc-sfu +++ b/bbb-webrtc-sfu @@ -1 +1 @@ -Subproject commit 400fe636e63563437fb112c2df0261d6be9f103e +Subproject commit 8dfb34d808b4648873340877904500629ba55dc6 diff --git a/conf/sip_profiles/example.xml b/conf/sip_profiles/example.xml index fe8dd5b..513d245 100644 --- a/conf/sip_profiles/example.xml +++ b/conf/sip_profiles/example.xml @@ -6,6 +6,7 @@ + --> diff --git a/docker-compose.greenlight.yml b/docker-compose.greenlight.yml index 0ca79fa..9dc0b6e 100644 --- a/docker-compose.greenlight.yml +++ b/docker-compose.greenlight.yml @@ -2,7 +2,6 @@ version: '3.6' services: greenlight: - container_name: greenlight image: bigbluebutton/greenlight:v2 restart: unless-stopped env_file: .env @@ -25,4 +24,4 @@ services: POSTGRES_USER: postgres POSTGRES_PASSWORD: password volumes: - - ./postgres-data:/var/lib/postgresql/data \ No newline at end of file + - ./postgres-data:/var/lib/postgresql/data diff --git a/docker-compose.recordings.yml b/docker-compose.recordings.yml new file mode 100644 index 0000000..b6b188c --- /dev/null +++ b/docker-compose.recordings.yml @@ -0,0 +1,15 @@ +version: '3.6' +services: + recordings: + build: mod/recordings + depends_on: + - redis + environment: + DOMAIN: ${DOMAIN} + volumes: + - bigbluebutton:/var/bigbluebutton + - vol-freeswitch:/var/freeswitch/meetings + - vol-kurento:/var/kurento + networks: + bbb-net: + ipv4_address: 10.7.7.16 \ No newline at end of file diff --git a/docker-compose.webhooks.yml b/docker-compose.webhooks.yml index b7ed70b..556afb2 100644 --- a/docker-compose.webhooks.yml +++ b/docker-compose.webhooks.yml @@ -6,8 +6,8 @@ services: environment: DOMAIN: ${DOMAIN} SHARED_SECRET: ${SHARED_SECRET} - extra_hosts: - - "redis:10.7.7.5" + depends_on: + - redis networks: bbb-net: ipv4_address: 10.7.7.15 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index c124ac7..8511856 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,7 @@ services: environment: DEV_MODE: ${DEV_MODE:-} DOMAIN: ${DOMAIN} + ENABLE_RECORDING: ${ENABLE_RECORDING:-false} SHARED_SECRET: ${SHARED_SECRET} WELCOME_MESSAGE: ${WELCOME_MESSAGE:-} WELCOME_FOOTER: ${WELCOME_FOOTER} @@ -17,6 +18,8 @@ services: TURN_SECRET: ${TURN_SECRET:-} volumes: - bigbluebutton:/var/bigbluebutton + - vol-freeswitch:/var/freeswitch/meetings + - vol-kurento:/var/kurento networks: bbb-net: ipv4_address: 10.7.7.2 @@ -41,10 +44,11 @@ services: volumes: - ./conf/sip_profiles:/etc/freeswitch/sip_profiles/external - ./conf/dialplan_public:/etc/freeswitch/dialplan/public_docker + - vol-freeswitch:/var/freeswitch/meetings network_mode: host nginx: - image: nginx:1.19-alpine + build: mod/nginx restart: unless-stopped depends_on: - etherpad @@ -54,8 +58,6 @@ services: - "8080:80" volumes: - bigbluebutton:/var/bigbluebutton - - ./mod/nginx/bbb:/etc/nginx/bbb - - ./mod/nginx/bigbluebutton:/etc/nginx/conf.d/default.conf - ${DEFAULT_PRESENTATION:-/dev/null}:/etc/nginx/html/default.pdf network_mode: host extra_hosts: @@ -79,8 +81,6 @@ services: redis: image: redis:6.0-alpine restart: unless-stopped - ports: - - "127.0.0.1:6379:6379" # TODO: remove as soon as we updated all redis host references networks: bbb-net: ipv4_address: 10.7.7.5 @@ -103,6 +103,8 @@ services: KMS_TURN_URL: KMS_NETWORK_INTERFACES: ${NETWORK_INTERFACE:-} network_mode: host + volumes: + - vol-kurento:/var/kurento webrtc-sfu: build: @@ -167,6 +169,8 @@ services: volumes: bigbluebutton: + vol-freeswitch: + vol-kurento: networks: bbb-net: diff --git a/mod/core/Dockerfile b/mod/core/Dockerfile index 5833bde..7b4cdcb 100644 --- a/mod/core/Dockerfile +++ b/mod/core/Dockerfile @@ -4,7 +4,6 @@ MAINTAINER ffdixon@bigbluebutton.org # TODO: # - separate bbb-apps into an own container # - separate bbb-web -# - remove systemd ENV DEBIAN_FRONTEND noninteractive ENV container docker @@ -45,7 +44,7 @@ RUN apt-get update && apt-get install -y bbb-web \ bbb-fsesl-akka bbb-apps-akka bbb-transcode-akka bbb-apps \ bbb-apps-video bbb-apps-screenshare bbb-apps-video-broadcast -# -- avoid blocking java +# -- avoid blocking java # https://github.com/bigbluebutton/bigbluebutton/issues/8959 RUN sed -i 's|securerandom.source=file:/dev/random|securerandom.source=file:/dev/urandom|g' /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/java.security @@ -69,8 +68,6 @@ COPY red5-webapps/screenshare/application.conf /usr/share/red5/webapps/screensha COPY red5-webapps/video/bigbluebutton-video.properties /usr/share/red5/webapps/video/WEB-INF/bigbluebutton-video.properties COPY red5-webapps/video-broadcast/video-broadcast.properties /usr/share/red5/webapps/video-broadcast/WEB-INF/video-broadcast.properties -COPY bigbluebutton.yml /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml - COPY web/bigbluebutton.properties /usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties.tmpl COPY web/turn-stun-servers.xml /usr/share/bbb-web/WEB-INF/classes/spring/turn-stun-servers.xml.tmpl @@ -79,6 +76,10 @@ COPY bbb-fsesl-akka/application.conf /etc/bbb-fsesl-akka/application.conf COPY bbb-transcode-akka/application.conf /etc/bbb-transcode-akka/application.conf COPY web-run.sh /usr/share/bbb-web/run-prod.sh +# add default presentation thumbnail +RUN mkdir -p /usr/share/bigbluebutton/blank \ + && wget -O /usr/share/bigbluebutton/blank/blank-thumb.png https://raw.githubusercontent.com/bigbluebutton/bigbluebutton/v2.2.20/bigbluebutton-config/slides/blank-thumb.png + COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY entrypoint.sh /entrypoint.sh @@ -87,4 +88,3 @@ RUN mkdir -p /var/log/supervisor ENTRYPOINT ["/entrypoint.sh"] CMD [] - diff --git a/mod/core/entrypoint.sh b/mod/core/entrypoint.sh index bb06ca8..ac2585d 100755 --- a/mod/core/entrypoint.sh +++ b/mod/core/entrypoint.sh @@ -3,16 +3,27 @@ export LANG=en_US.UTF-8 # generate bbb folders +mkdir -p /var/bigbluebutton/events +mkdir -p /var/bigbluebutton/captions +mkdir -p /var/bigbluebutton/captions/inbox +mkdir -p /var/bigbluebutton/basic_stats mkdir -p /var/bigbluebutton/recording/raw mkdir -p /var/bigbluebutton/recording/process mkdir -p /var/bigbluebutton/recording/publish +mkdir -p /var/bigbluebutton/recording/publish/presentation +mkdir -p /var/bigbluebutton/recording/status mkdir -p /var/bigbluebutton/recording/status/recorded mkdir -p /var/bigbluebutton/recording/status/archived mkdir -p /var/bigbluebutton/recording/status/processed mkdir -p /var/bigbluebutton/recording/status/sanity mkdir -p /var/bigbluebutton/published +mkdir -p /var/bigbluebutton/published/presentation mkdir -p /var/bigbluebutton/deleted mkdir -p /var/bigbluebutton/unpublished +mkdir -p /var/bigbluebutton/playback + +# add playback-presentation to /var/bigbluebutton volume +cp -r /usr/src/bbb-src-playback/* /var/bigbluebutton/playback # -- fix directory permissions chown -R bigbluebutton:bigbluebutton /var/bigbluebutton diff --git a/mod/core/supervisord.conf b/mod/core/supervisord.conf index 2a581a5..44d39f7 100644 --- a/mod/core/supervisord.conf +++ b/mod/core/supervisord.conf @@ -41,6 +41,4 @@ directory=/usr/share/bbb-transcode-akka stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 stderr_logfile=/dev/fd/2 -stderr_logfile_maxbytes=0 - - +stderr_logfile_maxbytes=0 \ No newline at end of file diff --git a/mod/core/web/bigbluebutton.properties b/mod/core/web/bigbluebutton.properties index 2af6d9f..3f499c9 100644 --- a/mod/core/web/bigbluebutton.properties +++ b/mod/core/web/bigbluebutton.properties @@ -19,7 +19,7 @@ # # These are the default properites for BigBlueButton Web application -# Default loglevel. +# Default loglevel. appLogLevel=DEBUG #---------------------------------------------------- @@ -189,18 +189,22 @@ userInactivityThresholdInMinutes=30 # warning before being logged out. userActivitySignResponseDelayInMinutes=5 -# Disable recording by default. +# Disable recording by default. # true - don't record even if record param in the api call is set to record # false - when record param is passed from api, override this default +{{ if isTrue .Env.ENABLE_RECORDING }} +disableRecordingDefault=false +{{ else }} disableRecordingDefault=true +{{ end }} # Start recording when first user joins the meeting. # For backward compatibility with 0.81 where whole meeting -# is recorded. +# is recorded. autoStartRecording=false # Allow the user to start/stop recording. -allowStartStopRecording=false +allowStartStopRecording=true # Allow webcams streaming reception only to and from moderators webcamsOnlyForModerator=false diff --git a/mod/etherpad/settings.json b/mod/etherpad/settings.json index 1261824..c5bd1a9 100644 --- a/mod/etherpad/settings.json +++ b/mod/etherpad/settings.json @@ -310,7 +310,12 @@ * instead of the reverse proxy's IP. */ "trustProxy": true, - + + /* + * When embedding the pads in an iframe set this to true. + */ + "forceSameSiteNone": false, + /* * Privacy: disable IP logging */ diff --git a/mod/freeswitch/Dockerfile b/mod/freeswitch/Dockerfile index a15c4fc..5b0ce8a 100644 --- a/mod/freeswitch/Dockerfile +++ b/mod/freeswitch/Dockerfile @@ -75,6 +75,16 @@ RUN cd /etc \ && svn checkout https://github.com/alangecker/bbb-packages/tags/$GIT_TAG/bbb-freeswitch-core/data/opt/freeswitch/etc/freeswitch \ && rm -rf /etc/freeswitch/.svn +# the current available freeswitch-mod-opusfile is broken, +# it can't write any .opus files. +# there is already a fix, but it is not included yet. +# https://github.com/signalwire/freeswitch/pull/719/files +# we rather switch to the binary built by bigbluebutton and add its dependencies +RUN wget -O /usr/lib/freeswitch/mod/mod_opusfile.so https://github.com/bbb-pkg/bbb-freeswitch-core/raw/43f3a47af1fcf5ea559e16bb28b900c925a7f2c3/opt/freeswitch/lib/freeswitch/mod/mod_opusfile.so \ + && wget -O /tmp/libopusenc0_0.2.1-1bbb1_amd64.deb https://launchpad.net/~bigbluebutton/+archive/ubuntu/support/+files/libopusenc0_0.2.1-1bbb1_amd64.deb \ + && dpkg -i /tmp/libopusenc0_0.2.1-1bbb1_amd64.deb \ + && rm /tmp/libopusenc0_0.2.1-1bbb1_amd64.deb + # add modifications COPY ./conf /etc/freeswitch/ diff --git a/mod/freeswitch/entrypoint.sh b/mod/freeswitch/entrypoint.sh index d252b27..072bcba 100755 --- a/mod/freeswitch/entrypoint.sh +++ b/mod/freeswitch/entrypoint.sh @@ -15,6 +15,9 @@ for IP in "${ADDR[@]}"; do iptables -I INPUT -p udp --dport 5060 -s $IP -j ACCEPT done +chown -R freeswitch:daemon /var/freeswitch/meetings +chmod 777 /var/freeswitch/meetings + dockerize \ -template /etc/freeswitch/vars.xml.tmpl:/etc/freeswitch/vars.xml \ -template /etc/freeswitch/autoload_configs/conference.conf.xml.tmpl:/etc/freeswitch/autoload_configs/conference.conf.xml \ diff --git a/mod/html5/Dockerfile b/mod/html5/Dockerfile index 96d1e7b..1be4b9c 100644 --- a/mod/html5/Dockerfile +++ b/mod/html5/Dockerfile @@ -14,7 +14,7 @@ USER meteor ENV METEOR_VERSION 1.8.1 RUN curl -sL https://install.meteor.com?release=$METEOR_VERSION | sed s/--progress-bar/-sL/g | /bin/sh -ENV TAG v2.2.22 +ENV TAG v2.2.23 RUN cd ~ \ && svn checkout https://github.com/bigbluebutton/bigbluebutton/tags/$TAG/bigbluebutton-html5 \ && mv ~/bigbluebutton-html5 ~/source \ @@ -51,4 +51,4 @@ USER meteor ENTRYPOINT ["/entrypoint.sh"] # lets set the tag again, so that it is include in the image for later version retrieval -ENV TAG v2.2.22 +ENV TAG v2.2.23 diff --git a/mod/html5/settings.yml b/mod/html5/settings.yml index 2f0b247..789d06b 100644 --- a/mod/html5/settings.yml +++ b/mod/html5/settings.yml @@ -11,7 +11,7 @@ public: appName: BigBlueButton HTML5 Client bbbServerVersion: 2.2 copyright: "©2020 BigBlueButton Inc." - html5ClientBuild: 992 + html5ClientBuild: 1006 helpLink: https://bigbluebutton.org/html5/ lockOnJoin: true cdn: "" @@ -160,15 +160,15 @@ public: constraints: frameRate: 10 - id: low - name: Low quality + name: Low default: false bitrate: 100 - id: medium - name: Medium quality + name: Medium default: true bitrate: 200 - id: high - name: High quality + name: High default: false bitrate: 500 - id: hd @@ -200,11 +200,26 @@ public: profile: low-u25 - threshold: 30 profile: low-u30 + pagination: + # whether to globally enable or disable pagination. + enabled: false + # how long (in ms) the negotiation will be debounced after a page change. + pageChangeDebounceTime: 2500 + # video page sizes for DESKTOP endpoints. It stands for the number of SUBSCRIBER streams. + # PUBLISHERS aren't accounted for . + # A page size of 0 (zero) means that the page size is unlimited (disabled). + desktopPageSizes: + moderator: 0 + viewer: 5 + # video page sizes for MOBILE endpoints + mobilePageSizes: + moderator: 2 + viewer: 2 pingPong: clearUsersInSeconds: 180 pongTimeInSeconds: 15 allowOutsideCommands: - toggleRecording: false + toggleRecording: true toggleSelfVoice: false poll: enabled: true diff --git a/mod/nginx/Dockerfile b/mod/nginx/Dockerfile new file mode 100644 index 0000000..97a0877 --- /dev/null +++ b/mod/nginx/Dockerfile @@ -0,0 +1,14 @@ +FROM nginx:1.19-alpine + +RUN apk add subversion + +ENV TAG v2.2.20 + +# get bbb-playback-presentation web files +RUN mkdir /www \ + && cd /www \ + && svn checkout https://github.com/bigbluebutton/bigbluebutton/tags/$TAG/record-and-playback/presentation/playback/presentation/ \ + && rm -rf /www/presentation/.svn /www/presentation/0.* + +COPY ./bbb /etc/nginx/bbb +COPY ./bigbluebutton /etc/nginx/conf.d/default.conf \ No newline at end of file diff --git a/mod/nginx/bbb/presentation.nginx b/mod/nginx/bbb/presentation.nginx index 20ed5b4..6f8abca 100644 --- a/mod/nginx/bbb/presentation.nginx +++ b/mod/nginx/bbb/presentation.nginx @@ -16,18 +16,8 @@ # with BigBlueButton; if not, see . # - location /playback/presentation/playback.html { - return 301 /playback/presentation/0.81/playback.html?$query_string; - # If you have recordings from 0.9.0 beta versions and are sure - # that you will never want to play recordings made with - # BigBlueButton 0.81, comment the line above and uncomment the - # following line: - #return 301 /playback/presentation/0.9.0/playback.html?$query_string; - } - location /playback/presentation { - root /var/bigbluebutton; - index index.html index.htm; + alias /www/presentation; } location /presentation { diff --git a/mod/recordings/Dockerfile b/mod/recordings/Dockerfile new file mode 100644 index 0000000..ed793d7 --- /dev/null +++ b/mod/recordings/Dockerfile @@ -0,0 +1,84 @@ + +FROM ruby:2.4-slim-buster + +# install apt dependencies +RUN apt-get update && apt-get install -y \ + wget \ + subversion \ + rsync \ + build-essential \ + libsystemd-dev \ + python3 \ + python3-pyinotify \ + python3-lxml \ + python3-icu \ + ffmpeg \ + poppler-utils \ + imagemagick + +# compile and install mkclean +RUN cd /tmp \ + && wget https://netcologne.dl.sourceforge.net/project/matroska/mkclean/mkclean-0.8.10.tar.bz2 \ + && tar -xf /tmp/mkclean-0.8.10.tar.bz2 \ + && cd /tmp/mkclean-0.8.10 \ + && sed -i 's/\r//g' ./mkclean/configure.compiled \ + && ./mkclean/configure.compiled \ + && make -C mkclean \ + && cp ./release/gcc_linux_x64/mkclean /usr/bin/mkclean \ + && rm -r /tmp/mkclean-0.8.10 + +# add dockerize +ENV DOCKERIZE_VERSION v0.6.1 +RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz + +RUN mkdir -p \ + /usr/local/bigbluebutton \ + /usr/local/bigbluebutton/core \ + /etc/bigbluebutton \ + /var/log/bigbluebutton \ + /var/log/bigbluebutton/presentation + +ENV TAG v2.2.23 + +# add bbb-record-core (lib, scripts and Gemfile) +RUN cd /usr/local/bigbluebutton/core \ + && svn checkout https://github.com/bigbluebutton/bigbluebutton/tags/$TAG/record-and-playback/core/lib \ + && svn checkout https://github.com/bigbluebutton/bigbluebutton/tags/$TAG/record-and-playback/core/scripts \ + && rm -rf /usr/local/bigbluebutton/core/*/.svn \ + && wget https://raw.githubusercontent.com/bigbluebutton/bigbluebutton/$TAG/record-and-playback/core/Gemfile.lock \ + && wget https://raw.githubusercontent.com/bigbluebutton/bigbluebutton/$TAG/record-and-playback/core/Gemfile + + +# add bbb-playback-presentation scripts +RUN cd /tmp \ + && svn checkout https://github.com/bigbluebutton/bigbluebutton/tags/$TAG/record-and-playback/presentation/scripts \ + && rsync -av /tmp/scripts/ /usr/local/bigbluebutton/core/scripts/ \ + && rm -rf /tmp/scripts + +# install ruby dependencies +RUN cd /usr/local/bigbluebutton/core \ + && gem install builder \ + && gem install bundler \ + && /usr/local/bin/bundle + +# add bbb-record with some adjustments so bbb-record works in this environment +RUN cd /usr/bin \ + && wget https://raw.githubusercontent.com/bigbluebutton/bigbluebutton/$TAG/bigbluebutton-config/bin/bbb-record \ + && chmod +x /usr/bin/bbb-record \ + && sed -i 's/^BBB_WEB.*/BBB_WEB=""/' /usr/bin/bbb-record \ + && sed -i 's/systemctl.*//' /usr/bin/bbb-record \ + && echo "BIGBLUEBUTTON_RELEASE=$TAG" > /etc/bigbluebutton/bigbluebutton-release \ + && touch /var/log/bigbluebutton/bbb-web.log + +# create user +# the ID should matcht the one creating the files in `core` +RUN groupadd -g 998 bigbluebutton && useradd -m -u 998 -g bigbluebutton bigbluebutton + +COPY bigbluebutton.yml /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml.tmpl +ADD log-collector.py /log-collector.py +ADD entrypoint.sh /entrypoint.sh +ENTRYPOINT dockerize \ + -template /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml.tmpl:/usr/local/bigbluebutton/core/scripts/bigbluebutton.yml \ + /entrypoint.sh \ No newline at end of file diff --git a/mod/core/bigbluebutton.yml b/mod/recordings/bigbluebutton.yml similarity index 92% rename from mod/core/bigbluebutton.yml rename to mod/recordings/bigbluebutton.yml index b6ade01..c20328a 100644 --- a/mod/core/bigbluebutton.yml +++ b/mod/recordings/bigbluebutton.yml @@ -1,4 +1,4 @@ -bbb_version: '2.1.0' +bbb_version: '2.2.23' raw_audio_src: /var/freeswitch/meetings raw_video_src: /usr/share/red5/webapps/video/streams kurento_video_src: /var/kurento/recordings @@ -7,7 +7,7 @@ raw_screenshare_src: /usr/share/red5/webapps/screenshare/streams raw_webrtc_deskshare_src: /usr/share/red5/webapps/video-broadcast/streams raw_deskshare_src: /var/bigbluebutton/deskshare raw_presentation_src: /var/bigbluebutton -notes_endpoint: http://localhost:9001/p +notes_endpoint: http://etherpad:9001/p # Specify the notes formats we archive # txt, doc and odt are also supported notes_formats: @@ -25,7 +25,7 @@ events_dir: /var/bigbluebutton/events recording_dir: /var/bigbluebutton/recording published_dir: /var/bigbluebutton/published captions_dir: /var/bigbluebutton/captions -playback_host: meet.livingutopia.org +playback_host: {{ .Env.DOMAIN }} playback_protocol: https # For DEVELOPMENT diff --git a/mod/recordings/entrypoint.sh b/mod/recordings/entrypoint.sh new file mode 100644 index 0000000..f4b8318 --- /dev/null +++ b/mod/recordings/entrypoint.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# print all logs to stdout +python3 -u /log-collector.py & + +cd /usr/local/bigbluebutton/core/scripts +PATH_CHECK="/var/bigbluebutton/recording/status" +while true; do + echo "execute workers..." + if [[ $(compgen -G "$PATH_CHECK/recorded/*.done") ]];then + bundle exec ruby rap-archive-worker.rb + fi + if [[ $(compgen -G "$PATH_CHECK/archived/*.done") ]];then + bundle exec ruby rap-sanity-worker.rb + fi + if [[ $(compgen -G "$PATH_CHECK/sanity/*.done") ]];then + bundle exec ruby rap-process-worker.rb + fi + if [[ $(compgen -G "$PATH_CHECK/processed/*.done") ]];then + bundle exec ruby rap-publish-worker.rb + fi + #bundle exec ruby rap-caption-inbox.rb + if [[ $(compgen -G "$PATH_CHECK/ended/*.done") ]];then + bundle exec ruby rap-events-worker.rb + fi + sleep 30s +done diff --git a/mod/recordings/log-collector.py b/mod/recordings/log-collector.py new file mode 100644 index 0000000..af683e6 --- /dev/null +++ b/mod/recordings/log-collector.py @@ -0,0 +1,45 @@ +# this script sends all entries from different logfiles +# to stdout, so that they appear in the docker logs + +import threading +import subprocess +import time +import pyinotify +import os +import re +import sys + +log_dir = '/var/log/bigbluebutton' + +def thread_function(name, filename): + f = subprocess.Popen(['tail','-F', '-n', '0', filename],\ + stdout=subprocess.PIPE,stderr=subprocess.PIPE) + while True: + line = f.stdout.readline().decode('utf-8').strip() + if len(line): + print(name.ljust(10)+' |', line) + sys.stdout.flush() + +def tail_file(name, filename): + x = threading.Thread(target=thread_function, args=(name, filename,)) + x.start() + + +tail_file('rap-worker', log_dir+'/bbb-rap-worker.log') +tail_file('sanity', log_dir+'/sanity.log') +tail_file('publish', log_dir+'/post_publish.log') + +class EventHandler(pyinotify.ProcessEvent): + def process_IN_CREATE(self, event): + filename = os.path.basename(event.pathname) + if re.match('^archive-.*\.log$', filename): + tail_file('archive', event.pathname) + elif re.match('^process-.*\.log$', filename): + tail_file('process', event.pathname) + + +wm = pyinotify.WatchManager() +handler = EventHandler() +notifier = pyinotify.Notifier(wm, handler) +wdd = wm.add_watch(log_dir, pyinotify.IN_CREATE, rec=True) +notifier.loop() \ No newline at end of file diff --git a/sample.env b/sample.env index 8782e2a..89da73b 100644 --- a/sample.env +++ b/sample.env @@ -24,6 +24,14 @@ ENABLE_GREENLIGHT=true # https://yourdomain/bbb-exporter #ENABLE_PROMETHEUS_EXPORTER=true +# Recording +# IMPORTANT: this is currently a big privacy issues, because it will +# record everything which happens in the conference, even when the button +# suggets, that it does not. +# https://github.com/bigbluebutton/bigbluebutton/issues/9202 +# make sure that you get peoples consent, before they join a room +#ENABLE_RECORDING=true + # ==================================== # SECRETS # ==================================== diff --git a/scripts/bbb-record b/scripts/bbb-record new file mode 100755 index 0000000..64ec423 --- /dev/null +++ b/scripts/bbb-record @@ -0,0 +1,20 @@ +#!/bin/bash +set -e + +cd $(dirname $0)/.. + +# load .env +if [ -f .env ] +then + # exclude WELCOME_FOOTER because it may contain invalid characters + export $(cat .env | sed 's/#.*//g' | grep -v "WELCOME_FOOTER" | grep -v "WELCOME_MESSAGE" | xargs) +fi + +if [ ! "$ENABLE_RECORDING" == true ]; then + echo "Error: recording is disabled why can't use bbb-record" + echo "set ENABLE_RECORDING in .env if you want to use it" + exit 1 +fi + +./scripts/compose exec recordings bbb-record $@ +./scripts/compose logs --tail=15 recordings \ No newline at end of file diff --git a/scripts/compose b/scripts/compose index 7d9d785..a560126 100755 --- a/scripts/compose +++ b/scripts/compose @@ -57,4 +57,8 @@ if [ "$ENABLE_PROMETHEUS_EXPORTER" == true ]; then COMPOSE_FILES="$COMPOSE_FILES -f docker-compose.prometheus.yml" fi +if [ "$ENABLE_RECORDING" == true ]; then + COMPOSE_FILES="$COMPOSE_FILES -f docker-compose.recordings.yml" +fi + docker-compose $COMPOSE_FILES $@ diff --git a/scripts/setup b/scripts/setup index d04e93c..04fe462 100755 --- a/scripts/setup +++ b/scripts/setup @@ -45,6 +45,18 @@ while [[ -z "$DOMAIN" ]]; do read -p "Please enter the domain name: " DOMAIN done +recording="" +echo "Should the recording feature be included?" +echo " IMPORTANT: this is currently a big privacy issues, because it will " +echo " record everything which happens in the conference, even when the button" +echo " suggets, that it does not." +echo " make sure that you awalys get peoples consent, before they join a room!" +echo " https://github.com/bigbluebutton/bigbluebutton/issues/9202" +while [[ ! $recording =~ ^(y|n)$ ]]; do + + read -p "Choice (y/n): " recording +done + ip_correct="" while [[ ! $ip_correct =~ ^(y|n)$ ]]; do read -p "Is $EXTERNAL_IPv4 your external IPv4 address? (y/n): " ip_correct @@ -92,6 +104,11 @@ then sed -i "s/ENABLE_HTTPS_PROXY.*/#ENABLE_HTTPS_PROXY=true/" .env fi +if [ "$recording" == "y" ] +then + sed -i "s/#ENABLE_RECORDING.*/ENABLE_RECORDING=true/" .env +fi + if [ "$coturn" == "y" ] then sed -i "s/.*TURN_SERVER=.*/TURN_SERVER=turns:$DOMAIN:465?transport=tcp/" .env