StatusMonitor.public_json

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