Skip to content

Commit

Permalink
feat: Changed Mail collector rules
Browse files Browse the repository at this point in the history
* Changed Mail collector rules:
Attachment e-mails...
 - can be sent to multiple chemotion instances
 - can be sent to chemotion user in 'cc' or 'to'. The e-mail addresses in to and cc are treated equally
 - can be sent to different e-mails. All emails in "cc" or "to" belonging to a registered user will trigger the creation of an attachment. All non-registered e-mails are ignored.

Additionally, if an e-mail throws an error the collector keeps running. -> mailcollector line 25

* style: rubocop -A


Refs: #1566
  • Loading branch information
StarmanMartin authored and Lan Le committed Mar 5, 2024
1 parent fa064f0 commit 8e85fbb
Show file tree
Hide file tree
Showing 10 changed files with 153 additions and 137 deletions.
5 changes: 5 additions & 0 deletions bin/run_mail_collector
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/usr/bin/env ruby

require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment'))
CollectDataFromMailJob.perform_now

22 changes: 13 additions & 9 deletions lib/datacollector/collector_helper.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
# frozen_string_literal: true

class CollectorHelper
attr_reader :sender, :sender_container, :recipient

def initialize(from, cc = nil)
if from.is_a?(Device) && cc.is_a?(User)
if (from.is_a?(Device) && cc.is_a?(User)) || (from.is_a?(User) && from == cc)
@sender = from
@recipient = cc
prepare_containers
elsif cc
@sender = Device.find_by email: from
@sender = Device.find_by email: from.downcase unless @sender
@sender ||= Device.find_by email: from.downcase
@recipient = User.find_by email: cc
@recipient = User.find_by email: cc.downcase unless @recipient
@recipient ||= User.find_by email: cc.downcase
prepare_containers if @sender && @recipient
else
@sender = User.find_by email: from
@sender = User.find_by email: from.downcase unless @sender
@sender ||= User.find_by email: from.downcase
@recipient = @sender
prepare_containers if @sender
end
Expand All @@ -26,19 +28,21 @@ def sender_recipient_known?

def prepare_new_dataset(subject)
return nil unless sender_recipient_known?

Container.create(
name: subject,
container_type: 'dataset',
parent: @sender_container
parent: @sender_container,
)
end

def prepare_dataset(subject)
return nil unless sender_recipient_known?

Container.where(
name: subject,
container_type: 'dataset',
parent: @sender_container
parent: @sender_container,
).first_or_create
end

Expand All @@ -65,14 +69,14 @@ def prepare_containers
unless @recipient.container
@recipient.container = Container.create(
name: 'inbox',
container_type: 'root'
container_type: 'root',
)
end
sender_box_id = 'sender_box_' + @sender.id.to_s
sender_box_id = "sender_box_#{@sender.id}"
@sender_container = Container.where(
name: @sender.first_name,
container_type: sender_box_id,
parent_id: @recipient.container.id
parent_id: @recipient.container.id,
).first_or_create
end
end
17 changes: 17 additions & 0 deletions lib/datacollector/collector_helper_set.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# frozen_string_literal: true

class CollectorHelperSet
attr_reader :helper_set

def initialize(from, cc_list)
@helper_set = []
cc_list.each do |cc|
h = CollectorHelper.new(from, cc)
@helper_set.push(h) if h.sender_recipient_known?
end
end

def sender_recipient_known?
@helper_set.length.positive?
end
end
4 changes: 2 additions & 2 deletions lib/datacollector/datacollector_file.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def delete
def attach(device)
att = Attachment.new(
filename: @name,
file_data: IO.binread(@path),
file_data: File.binread(@path),
content_type: MimeMagic.by_path(@name)&.type,
created_by: device.id,
created_for: recipient.id,
Expand Down Expand Up @@ -52,7 +52,7 @@ def attach_remote(device)

def add_attach_to_container(device, attach, _ = false)
helper = CollectorHelper.new(device, recipient)
dataset = helper.prepare_dataset(Time.now.strftime('%Y-%m-%d'))
dataset = helper.prepare_dataset(Time.zone.now.strftime('%Y-%m-%d'))
attach.update!(attachable: dataset)

# add notifications
Expand Down
2 changes: 1 addition & 1 deletion lib/datacollector/datacollector_folder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def zip_files(tmpzip)

def register_new_data(device, tmpzip)
att = Attachment.new(
filename: @name + '.zip',
filename: "#{@name}.zip",
created_by: device.id,
created_for: recipient.id,
content_type: 'application/zip',
Expand Down
2 changes: 2 additions & 0 deletions lib/datacollector/dc_logger.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# frozen_string_literal: true

class DCLogger
def self.log
@@fw_logger ||= Logger.new("#{Rails.root}/log/datacollector.log")
Expand Down
4 changes: 2 additions & 2 deletions lib/datacollector/fcollector.rb
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def execute(use_sftp)
inspect_folder(device)
@sftp = nil
end
rescue => e
rescue StandardError => e
log_error("#{e.message} >>> #{device.info}\n#{e.backtrace.join('\n')}")
end
end
Expand All @@ -77,7 +77,7 @@ def execute(use_sftp)
private

def devices(use_sftp)
sql = <<~SQL
sql = <<~SQL.squish
profiles."data"->>'method' = '#{self.class::FCOLL}watcher#{use_sftp ? 'sftp' : 'local'}'
SQL
Device.joins(:profile).where(sql).includes(:profile)
Expand Down
13 changes: 5 additions & 8 deletions lib/datacollector/filecollector.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,14 @@ class Filecollector < Fcollector
private

# rubocop:disable Metrics/AbcSize
# rubocop:disable Metrics/MethodLength

def inspect_folder(device)
directory = device.profile.data['method_params']['dir']
new_files(directory).each do |new_file_p| # rubocop:disable Metrics/BlockLength
@current_collector = DatacollectorFile.new(new_file_p, @sftp)
error = CollectorError.find_by error_code: CollectorHelper.hash(
@current_collector.path,
@sftp
@sftp,
)
begin
stored = false
Expand All @@ -31,10 +30,10 @@ def inspect_folder(device)
@current_collector.delete
log_info("Recipient unknown. File deleted! >>> #{device.info}")
end
rescue => e
rescue StandardError => e
if stored
CollectorHelper.write_error(
CollectorHelper.hash(@current_collector.path, @sftp)
CollectorHelper.hash(@current_collector.path, @sftp),
)
end
log_error("#{e.message} >>> #{device.info}\n#{e.backtrace.join('\n')}")
Expand All @@ -53,15 +52,13 @@ def new_files(monitored_folder_p)
File.join(monitored_folder_p, f.name)
end
else
new_files_p = Dir.glob(File.join(monitored_folder_p, '*')).reject { |e|
new_files_p = Dir.glob(File.join(monitored_folder_p, '*')).reject do |e|
File.directory?(e)
}
end
end
new_files_p.delete_if do |f|
f.end_with?('.filepart', '.part')
end
new_files_p
end

# rubocop:enable Metrics/MethodLength
end
36 changes: 17 additions & 19 deletions lib/datacollector/foldercollector.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,20 @@ class Foldercollector < Fcollector
private

def sleep_seconds(device)
30 || Rails.configuration.datacollectors.services &&
(Rails.configuration.datacollectors.services.find { |e|
30 || (Rails.configuration.datacollectors.services &&
(Rails.configuration.datacollectors.services.find do |e|
e[:name] == device.profile.data['method']
} || {})[:watcher_sleep]
end || {})[:watcher_sleep])
end

def modification_time_diff(device, folder_p)
time_now = Time.now
time_diff =
case device.profile.data['method']
when 'folderwatcherlocal' then time_now - File.mtime(folder_p)
when 'folderwatchersftp' then
time_now - (Time.at @sftp.file.open(folder_p).stat.attributes[:mtime])
else 30
end
time_diff
time_now = Time.zone.now
case device.profile.data['method']
when 'folderwatcherlocal' then time_now - File.mtime(folder_p)
when 'folderwatchersftp'
time_now - (Time.zone.at @sftp.file.open(folder_p).stat.attributes[:mtime])
else 30
end
end

# rubocop:disable Metrics/CyclomaticComplexity
Expand All @@ -45,7 +43,7 @@ def inspect_folder(device)
@current_collector.files = list_files
error = CollectorError.find_by error_code: CollectorHelper.hash(
@current_collector.path,
@sftp
@sftp,
)
begin
stored = false
Expand All @@ -66,10 +64,10 @@ def inspect_folder(device)
@current_collector.delete
log_info("Recipient unknown. Folder deleted! >>> #{device.info}")
end
rescue => e
rescue StandardError => e
if stored
CollectorHelper.write_error(
CollectorHelper.hash(@current_collector.path, @sftp)
CollectorHelper.hash(@current_collector.path, @sftp),
)
end
log_error("#{e.message} >>> #{device.info}\n#{e.backtrace.join('\n')}")
Expand All @@ -89,9 +87,9 @@ def list_files
)
all_files.map!(&:name)
else
all_files = Dir.entries(@current_collector.path).reject { |e|
all_files = Dir.entries(@current_collector.path).reject do |e|
File.directory?(File.join(@current_collector.path, e))
}
end
end
all_files.delete_if do |f|
f.end_with?('..', '.', '.filepart', '.part')
Expand All @@ -106,9 +104,9 @@ def new_folders(monitored_folder_p)
)
new_folders_p.map! { |dir| File.join(monitored_folder_p, dir.name) }
else
new_folders_p = Dir.glob(File.join(monitored_folder_p, '*')).select { |e|
new_folders_p = Dir.glob(File.join(monitored_folder_p, '*')).select do |e|
File.directory?(e)
}
end
end
new_folders_p
end
Expand Down
Loading

0 comments on commit 8e85fbb

Please sign in to comment.