From 82bd5e4a6f002bfbe5059447f8f6075d7dc7ee9b Mon Sep 17 00:00:00 2001
From: Richard Alam <ritzalam@gmail.com>
Date: Thu, 4 Jul 2019 11:00:59 -0700
Subject: [PATCH]  - run keep-events worker separate from archive-worker

---
 .../core/scripts/events/events.rb             | 17 ++--
 .../core/scripts/rap-archive-worker.rb        | 24 ------
 .../core/scripts/rap-events-worker.rb         | 80 +++++++++++++++++++
 .../systemd/bbb-rap-events-worker.service     | 10 +++
 .../core/systemd/bbb-record-core.target       |  2 +-
 5 files changed, 103 insertions(+), 30 deletions(-)
 mode change 100644 => 100755 record-and-playback/core/scripts/events/events.rb
 create mode 100755 record-and-playback/core/scripts/rap-events-worker.rb
 create mode 100755 record-and-playback/core/systemd/bbb-rap-events-worker.service
 mode change 100644 => 100755 record-and-playback/core/systemd/bbb-record-core.target

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 78d174d79f..781b2c4f91
--- 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 b7716d1281..138d35e287 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 0000000000..c308f3aed2
--- /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 0000000000..88e40e3474
--- /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 6af71b4a5c..0c4eb7120d
--- 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
-- 
GitLab