in www/status/monitors/public_json.rb [18:146]
def StatusMonitor.public_json(previous_status)
danger_period = 86_400
warning_period = 5400
logdir = File.expand_path('../../www/logs')
logs = File.join(logdir, 'public-*')
archive = File.join(logdir,'archive')
FileUtils.mkdir(archive) unless File.directory?(archive)
status = {}
sendMail = Status.active?
Dir[logs].each do |log|
name = File.basename(log).sub('public-', '').to_sym
begin
status[name] = {
href: "../logs/#{File.basename(log)}",
mtime: File.mtime(log).gmtime.iso8601,
level: 'success'
}
contents = File.read(log, encoding: Encoding::UTF_8)
contents_save = contents.dup
contents.gsub!(/^(_INFO|_DEBUG) .*?\n+/, '')
if contents.gsub!(/^--- .*?\n\n?(\n|\Z)/m, '')
status[name].merge! level: 'info', title: 'updated'
end
warnings = contents.scan(/^_WARN (.*?)\n+/)
if warnings.length == 1
contents.sub!(/^_WARN (.*?)\n+/, '')
status[name].merge! level: 'warning', data: $1
elsif warnings.length > 0
contents.gsub!(/^_WARN (.*?)\n+/, '')
status[name].merge! level: 'warning', data: warnings.flatten,
title: "#{warnings.length} warnings"
end
if contents.gsub!(%r{^/((?:var|usr|/srv/gems)/lib/\S+): (warning:.*?)\n+}, '')
status[name].merge! level: 'warning', data: $2 unless $1.include? '/net/protocol.rb:'
end
if Time.now - File.mtime(log) > warning_period
status[name].merge! level: 'warning',
data: "Last updated: #{File.mtime(log).to_s} (more than 1.5 hours old)"
end
if Time.now - File.mtime(log) > danger_period
status[name].merge! level: 'danger',
data: "Last updated: #{File.mtime(log).to_s} (more than 24 hours old)"
end
contents.gsub!(%r{^\s+$} , '')
unless contents.empty?
status[name].merge! level: 'danger', data: contents.split("\n")
end
if status[name][:data]
status[name].delete_if { |k, v| k.eql? :title}
end
if previous_status[:data] and status[name] != previous_status[:data][name]
lvl = status[name][:level]
if lvl and lvl != 'info' and lvl != 'success'
file = File.basename(log)
FileUtils.copy log, File.join(archive, file + '.' + lvl), preserve: true
subject = "Problem (#{lvl}) detected in #{name} job"
if sendMail
begin
require 'mail'
$LOAD_PATH.unshift '/srv/whimsy/lib'
require 'whimsy/asf'
ASF::Mail.configure
mail = Mail.new do
from 'Public JSON job monitor <dev@whimsical.apache.org>'
to 'Notification List <notifications@whimsical.apache.org>'
subject subject
body "\nLOG:\n#{contents_save}\nSTATUS: #{status[name]}\n"
end
mail.charset = 'utf-8'
mail.message_id = "<#{Mail.random_tag}@#{::Socket.gethostname}.apache.org>"
mail.deliver!
rescue => e
$stderr.puts "Send mail failed: exception #{e}"
end
else
$stderr.puts "Did not detect active status, not sending mail: #{subject}"
end
end
end
rescue Exception => e
status[name] = {
level: 'danger',
data: {
exception: {
level: 'danger',
text: e.inspect,
data: e.backtrace
}
}
}
end
end
{data: status}
end