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