diff --git a/record-and-playback/core/scripts/events/events.rb b/record-and-playback/core/scripts/events/events.rb old mode 100644 new mode 100755 index 78d174d79f2f41b18ec67fc777bd2ae67723cef1..781b2c4f918f44b436bd6e820ef1a2359c2769ab --- a/record-and-playback/core/scripts/events/events.rb +++ b/record-and-playback/core/scripts/events/events.rb @@ -24,11 +24,17 @@ require 'logger' require 'trollop' require 'yaml' -def keep_events(meeting_id, redis_host, redis_port, events_dir, break_timestamp) +def keep_events(meeting_id, redis_host, redis_port, redis_password, events_dir, break_timestamp) BigBlueButton.logger.info("Keeping events for #{meeting_id}") - redis = BigBlueButton::RedisWrapper.new(redis_host, redis_port) + redis = BigBlueButton::RedisWrapper.new(redis_host, redis_port, redis_password) events_archiver = BigBlueButton::RedisEventsArchiver.new redis - events_xml = "#{events_dir}/#{meeting_id}/events.xml" + + target_dir = "#{events_dir}/#{meeting_id}" + if not FileTest.directory?(target_dir) + FileUtils.mkdir_p target_dir + end + + events_xml = "#{target_dir}/events.xml" events = events_archiver.store_events(meeting_id, events_xml, break_timestamp) end @@ -50,6 +56,7 @@ raw_archive_dir = "#{recording_dir}/raw" events_dir = props['events_dir'] redis_host = props['redis_host'] redis_port = props['redis_port'] +redis_password = props['redis_password'] log_dir = props['log_dir'] raw_events_xml = "#{raw_archive_dir}/#{meeting_id}/events.xml" @@ -72,11 +79,11 @@ if not FileTest.directory?(target_dir) events_xml = "#{events_dir}/#{meeting_id}/events.xml" FileUtils.cp(raw_events_xml, events_xml) else - keep_events(meeting_id, redis_host, redis_port, events_dir, break_timestamp) + keep_events(meeting_id, redis_host, redis_port, redis_password, events_dir, break_timestamp) # we need to delete the keys here because the sanity phase might not # automatically happen for this recording BigBlueButton.logger.info("Deleting redis keys") - redis = BigBlueButton::RedisWrapper.new(redis_host, redis_port) + redis = BigBlueButton::RedisWrapper.new(redis_host, redis_port, redis_password) events_archiver = BigBlueButton::RedisEventsArchiver.new(redis) events_archiver.delete_events(meeting_id) end diff --git a/record-and-playback/core/scripts/rap-archive-worker.rb b/record-and-playback/core/scripts/rap-archive-worker.rb index b7716d12816d7b356580770c3004b987de587585..138d35e287a4b7c2b7a64d8e6c74dcb23d333f60 100755 --- a/record-and-playback/core/scripts/rap-archive-worker.rb +++ b/record-and-playback/core/scripts/rap-archive-worker.rb @@ -84,29 +84,6 @@ def archive_recorded_meetings(recording_dir) end end -def keep_events_from_ended_meeting(recording_dir) - ended_done_files = Dir.glob("#{recording_dir}/status/ended/*.done") - ended_done_files.each do |ended_done| - ended_done_base = File.basename(ended_done, '.done') - meeting_id = nil - break_timestamp = nil - if match = /^([0-9a-f]+-[0-9]+)$/.match(ended_done_base) - meeting_id = match[1] - elsif match = /^([0-9a-f]+-[0-9]+)-([0-9]+)$/.match(ended_done_base) - meeting_id = match[1] - break_timestamp = match[2] - else - BigBlueButton.logger.warn("Ended done file for #{ended_done_base} has invalid format") - next - end - if !break_timestamp.nil? - ret = BigBlueButton.exec_ret("ruby", "events/events.rb", "-m", meeting_id, '-b', break_timestamp) - else - ret = BigBlueButton.exec_ret("ruby", "events/events.rb", "-m", meeting_id) - end - end -end - begin props = YAML::load(File.open('bigbluebutton.yml')) redis_host = props['redis_host'] @@ -124,7 +101,6 @@ begin BigBlueButton.logger.debug("Running rap-archive-worker...") archive_recorded_meetings(recording_dir) - keep_events_from_ended_meeting(recording_dir) BigBlueButton.logger.debug("rap-archive-worker done") diff --git a/record-and-playback/core/scripts/rap-events-worker.rb b/record-and-playback/core/scripts/rap-events-worker.rb new file mode 100755 index 0000000000000000000000000000000000000000..c308f3aed2df167cadff21595bd2642474a4631e --- /dev/null +++ b/record-and-playback/core/scripts/rap-events-worker.rb @@ -0,0 +1,80 @@ +#!/usr/bin/ruby +# encoding: UTF-8 + +# Copyright â“’ 2017 BigBlueButton Inc. and by respective authors. +# +# This file is part of BigBlueButton open source conferencing system. +# +# BigBlueButton 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 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/>. + +require '../lib/recordandplayback' +require 'rubygems' +require 'yaml' +require 'fileutils' + + +def keep_events_from_non_recorded_meeting(recording_dir, ended_done_file) + ended_done_base = File.basename(ended_done_file, '.done') + meeting_id = nil + break_timestamp = nil + + if match = /^([0-9a-f]+-[0-9]+)$/.match(ended_done_base) + meeting_id = match[1] + elsif match = /^([0-9a-f]+-[0-9]+)-([0-9]+)$/.match(ended_done_base) + meeting_id = match[1] + break_timestamp = match[2] + else + BigBlueButton.logger.warn("Ended done file for #{ended_done_base} has invalid format") + end + + if meeting_id != nil + if !break_timestamp.nil? + ret = BigBlueButton.exec_ret("ruby", "events/events.rb", "-m", meeting_id, '-b', break_timestamp) + else + ret = BigBlueButton.exec_ret("ruby", "events/events.rb", "-m", meeting_id) + end + end +end + +begin + props = YAML::load(File.open('bigbluebutton.yml')) + redis_host = props['redis_host'] + redis_port = props['redis_port'] + redis_password = props['redis_password'] + BigBlueButton.redis_publisher = BigBlueButton::RedisWrapper.new(redis_host, redis_port, redis_password) + + log_dir = props['log_dir'] + recording_dir = props['recording_dir'] + raw_archive_dir = "#{recording_dir}/raw" + events_dir = props['events_dir'] + + logger = Logger.new("#{log_dir}/bbb-rap-worker.log") + #logger = Logger.new(STDOUT) + logger.level = Logger::INFO + BigBlueButton.logger = logger + + BigBlueButton.logger.info("Running rap-events-worker...") + ended_done_files = Dir.glob("#{recording_dir}/status/ended/*.done") + ended_done_files.each do |ended_done| + ended_done_base = File.basename(ended_done, '.done') + keep_events_from_non_recorded_meeting(recording_dir, ended_done) + end + BigBlueButton.logger.debug("rap-events-worker done") + +rescue Exception => e + BigBlueButton.logger.error(e.message) + e.backtrace.each do |traceline| + BigBlueButton.logger.error(traceline) + end +end \ No newline at end of file diff --git a/record-and-playback/core/systemd/bbb-rap-events-worker.service b/record-and-playback/core/systemd/bbb-rap-events-worker.service new file mode 100755 index 0000000000000000000000000000000000000000..88e40e3474ee26ccf16a97a577f1181eb6fcbfa1 --- /dev/null +++ b/record-and-playback/core/systemd/bbb-rap-events-worker.service @@ -0,0 +1,10 @@ +[Unit] +Description=BigBlueButton recording and playback events worker +ConditionPathExistsGlob=/var/bigbluebutton/recording/status/ended/*.done + +[Service] +Type=simple +ExecStart=/usr/local/bigbluebutton/core/scripts/rap-events-worker.rb +WorkingDirectory=/usr/local/bigbluebutton/core/scripts +User=bigbluebutton +Slice=bbb_record_core.slice diff --git a/record-and-playback/core/systemd/bbb-record-core.target b/record-and-playback/core/systemd/bbb-record-core.target old mode 100644 new mode 100755 index 6af71b4a5cc6afd09fc6789d12e4f68d8298f1fc..0c4eb7120d435c272afb0fdde8dd3ad7fc1ff9c6 --- a/record-and-playback/core/systemd/bbb-record-core.target +++ b/record-and-playback/core/systemd/bbb-record-core.target @@ -1,4 +1,4 @@ [Unit] Description=BigBlueButton recording & playback processing -Wants=bbb-rap-archive-worker.service bbb-rap-sanity-worker.service bbb-rap-process-worker.service bbb-rap-publish-worker.service +Wants=bbb-rap-archive-worker.service bbb-rap-sanity-worker.service bbb-rap-process-worker.service bbb-rap-publish-worker.service bbb-rap-events-worker.service StopWhenUnneeded=true