www/status/index.cgi (122 lines of code) (raw):

#!/usr/bin/env ruby $LOAD_PATH.unshift '/srv/whimsy/lib' require 'json' require 'time' require 'whimsy/asf/status' start = $prev = Time.now $timings1 = [] # more debug timing timings2 = [] def timediff(what) now = Time.now $timings1 << [what, now - $prev] $prev = now end json = File.expand_path('../status.json', __FILE__) begin status = JSON.parse(File.read(json, encoding: Encoding::UTF_8), {symbolize_names: true}) rescue Exception => e $stderr.puts "index.cgi: Failed to read status.json: #{e}" status = {} end timediff('parsed') # Get new status every minute if not status[:mtime] or Time.now - Time.parse(status[:mtime]) > 60 begin require_relative './monitor' t1a = Time.now sm = StatusMonitor.new t1b = Time.now status = sm.status || {} t1c = Time.now timings2 = sm.timings || [] t1d = Time.now rescue Exception => e print "Status: 500 Internal Server Error\r\n" print "Context-Type: text/plain\r\n\r\n" puts e.to_s puts "\nbacktrace:" e.backtrace.each {|line| puts " #{line}"} exit end timediff('reparsed') end # The following is what infrastructure team sees: if %w(success info warning).include? status[:level] summary_status = "200 OK" else summary_status = "400 #{status[:title] || 'failure'}" # Log error for later investigation $stderr.puts JSON.pretty_generate(status) end print "Status: #{summary_status}\r\n\r\n" git_branch = `git branch --show-current`.strip git_info = `git show --format="%h %ci %cr" -s HEAD`.strip rescue "?" timediff('git show') # This is a remote check, so may be delayed git_repo = `git ls-remote origin #{git_branch}`.strip rescue "?" timediff('git ls-remote') hostname = `hostname` noticetext, noticepath, noticeclass = Status.notice # is there a notice file? if noticetext notice = "<h3 class='#{noticeclass}'><a href=#{noticepath}>#{noticetext}</a></h3><br>" else notice = '' end # What the browser sees: print <<-EOF <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <title>Whimsy Status</title> <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"/> <link rel="stylesheet" type="text/css" href="css/status.css"/> <script type="text/javascript" src="js/jquery.min.js"></script> <script type="text/javascript" src="js/bootstrap.min.js"></script> <script type="text/javascript" src="js/status.js"></script> </head> <body> <a href="/"> <img alt="Whimsy logo" title="Whimsy logo" src="../whimsy.svg" class="logo"/> </a> <h1>Whimsy Status for #{hostname}</h1> #{notice} <div class="list-group list-group-root well"> Loading... </div> <p> Overall status: #{summary_status} </p> <table class="status-legend"> <tr> <td class="alert-success">Success</td> <td class="alert-info">Info</td> <td class="alert-warning">Warning</td> <td class="alert-danger">Danger</td> <td class="alert-fatal">Fatal</td> </tr> </table> <br/> <p> This status is monitored by: <a href="https://nodeping.com/reports/status/70MTNEPXE6">NodePing</a>. <a href="https://nodeping.com/reports/statusevents/check/2018042000290QH9Q-UMFGNACX">Whimsy(Status)</a>. <a href="https://nodeping.com/reports/statusevents/check/2018042000290QH9Q-OZZ2KBZC">Whimsy(Website)</a>. </p> <h2>Additional status</h2> <ul> <li><a href="../member/logs">Apache HTTPD error logs</a> (ASF member only)</li> <li><a href="passenger">Passenger</a> (ASF committer only)</li> <li><a href="svn">Subversion</a> (ASF committer only)</li> <li>Git code info: #{git_info} (#{git_branch})</li> <li>Git repo info: #{git_repo}</li> </ul> </body> </html> EOF timediff('done') # sets $prev if $prev - start > 2 # seconds $stderr.puts "Times1: #{$timings1} Overall: #{$prev - start}" $stderr.puts "Times2: #{timings2}" end