DEV: IMAP debugging improvements (#11784)

Improvements to make console access to IncomingEmail more pleasant, and stopping certain IMAP logs from landing in the DB because they just create too much noise,
This commit is contained in:
Martin Brennan 2021-01-21 11:37:47 +10:00 committed by GitHub
parent b902de1727
commit f34fa999a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 36 additions and 8 deletions

View File

@ -9,20 +9,25 @@ class ImapSyncLog < ActiveRecord::Base
@levels ||= Enum.new(:debug, :info, :warn, :error)
end
def self.log(message, level, group_id = nil)
def self.log(message, level, group_id = nil, db = true)
now = Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")
new_log = create(message: message, level: ImapSyncLog.levels[level], group_id: group_id)
new_log = if db
create(message: message, level: ImapSyncLog.levels[level], group_id: group_id)
end
if ENV["DEBUG_IMAP"]
Rails.logger.send(:warn, "#{level[0].upcase}, [#{now}] [IMAP] (group_id #{group_id}) #{message}")
else
Rails.logger.send(level, "#{level[0].upcase}, [#{now}] [IMAP] (group_id #{group_id}) #{message}")
end
new_log
end
def self.debug(message, group_or_id)
def self.debug(message, group_or_id, db: true)
group_id = group_or_id.is_a?(Integer) ? group_or_id : group_or_id.id
log(message, :debug, group_id)
log(message, :debug, group_id, db)
end
def self.info(message, group_or_id)

View File

@ -29,6 +29,8 @@ class IncomingEmail < ActiveRecord::Base
SQL
end
scope :without_raw, -> { select(self.column_names - ["raw"]) }
def self.created_via_types
@types ||= Enum.new(
handle_mail: 1,
@ -38,6 +40,18 @@ class IncomingEmail < ActiveRecord::Base
)
end
def as_mail_message
@mail_message ||= Mail.new(self.raw)
end
def raw_headers
as_mail_message.header.raw_source
end
def raw_body
as_mail_message.body
end
def to_addresses_split
self.to_addresses&.split(";") || []
end

View File

@ -166,6 +166,10 @@ class Post < ActiveRecord::Base
includes(:post_details).find_by(post_details: { key: key, value: value })
end
def self.find_by_number(topic_id, post_number)
find_by(topic_id: topic_id, post_number: post_number)
end
def whisper?
post_type == Post.types[:whisper]
end

View File

@ -23,7 +23,7 @@ class Demon::EmailSync < ::Demon::Base
def start_thread(db, group)
Thread.new do
RailsMultisite::ConnectionManagement.with_connection(db) do
ImapSyncLog.debug("Thread started for group #{group.name} in db #{db}", group)
ImapSyncLog.debug("Thread started for group #{group.name} in db #{db}", group, db: false)
begin
syncer = Imap::Sync.new(group)
rescue Net::IMAP::NoResponseError => e
@ -44,7 +44,7 @@ class Demon::EmailSync < ::Demon::Base
)
if !syncer.can_idle? && status[:remaining] == 0
ImapSyncLog.debug("Going to sleep for group #{group.name} in db #{db} to wait for new emails", group)
ImapSyncLog.debug("Going to sleep for group #{group.name} in db #{db} to wait for new emails", group, db: false)
# Thread goes into sleep for a bit so it is better to return any
# connection back to the pool.
@ -133,7 +133,7 @@ class Demon::EmailSync < ::Demon::Base
# Spawn new threads for groups that are now synchronized.
groups.each do |group_id, group|
if !@sync_data[db][group_id]
ImapSyncLog.debug("Starting thread for group #{group.name} mailbox #{group.imap_mailbox_name}", group)
ImapSyncLog.debug("Starting thread for group #{group.name} mailbox #{group.imap_mailbox_name}", group, db: false)
@sync_data[db][group_id] = {
thread: start_thread(db, group),

View File

@ -60,7 +60,7 @@ module Imap
ActiveRecord::Base.connection_handler.clear_active_connections!
idle_polling_mins = SiteSetting.imap_polling_period_mins.minutes.to_i
ImapSyncLog.debug("Going IDLE for #{idle_polling_mins} seconds to wait for more work", @group)
ImapSyncLog.debug("Going IDLE for #{idle_polling_mins} seconds to wait for more work", @group, db: false)
@provider.imap.idle(idle_polling_mins) do |resp|
if resp.kind_of?(Net::IMAP::UntaggedResponse) && resp.name == 'EXISTS'

View File

@ -17,4 +17,9 @@ describe Jobs::CleanupImapSyncLog do
expect(ImapSyncLog.count).to eq(1)
end
it "does not write the log to the db if specified" do
ImapSyncLog.debug("test", Fabricate(:group), db: false)
expect(ImapSyncLog.count).to eq(0)
end
end