blob: d5a27435b9ef37ed1ed4e0b278089ebd1a869ac8 [file] [log] [blame]
#
# Monitor status of svn updates
#
=begin
Sample input:
See DATA section after __END__
Output status level can be:
Success - workspace is up to date
Info - one or more files updated
Warning - partial response
Danger - unexpected text in log file
=end
require 'fileutils'
# Match revision messages
REV_RE = %r{^(Checked out|\s*Updated ('[^']+' )?to|At|List updated from \d+ to|List is at) (revision |r)\d+\s*\.$}
def Monitor.svn(previous_status)
logdir = File.expand_path('../../../logs', __FILE__)
archive = File.join(logdir,'archive')
FileUtils.mkdir(archive) unless File.directory?(archive)
# read cron log
if $0 == __FILE__ and ARGV.first == '__DATA__'
log = nil
fdata = DATA.read
else
log = File.expand_path('../../../logs/svn-update', __FILE__)
fdata = File.open(log) {|file| file.flock(File::LOCK_EX); file.read}
end
updates = fdata.split(%r{\n(?:/\w+)*/srv/svn/})[1..-1]
status = {}
seen_level = {}
# extract status for each repository
updates.each do |update|
level = 'success'
title = nil
data = revision = update[REV_RE] # data === String
lines = update.split("\n")
repository = lines.shift.to_sym
lines.reject! do |line|
line =~ %r{Updating '.+':} or
line == "Summary of updates:" or
# must agree with Rakefile/PREFIX
line.start_with?('#!: ') or
line =~ REV_RE # this was processed above
end
unless lines.empty?
level = 'info'
data = lines.dup # array
end
lines.reject! {|line| line =~ /^([ADU] |[ U]U) /}
if lines.empty?
if not data
title = "partial response"
level = 'warning'
seen_level[level] = true
elsif String === data # only saw revision message
title = "No files updated"
elsif data.length == 1
title = "1 file updated"
else
title = "#{data.length} files updated"
end
data << revision if revision and data.instance_of? Array
else
next if lines == ['Skipping']
level = 'danger'
data = lines.dup
seen_level[level] = true
end
status[repository] = {level: level, data: data, href: '../logs/svn-update'}
status[repository][:title] = title if title
end
# save as the highest level seen
%w{danger warning}.each do |lvl|
if seen_level[lvl] and log
# Save a copy of the log; append the severity so can track more problems
file = File.basename(log)
FileUtils.copy log, File.join(archive, file + '.' + lvl), preserve: true
break
end
end
{data: status}
end
# for debugging purposes
if __FILE__ == $0
if ARGV.first == '__DATA__'
response = Monitor.svn(nil) # must agree with method name above
data = response[:data]
data.each do |k,v|
puts "#{k} #{data[k][:level]} #{data[k][:title]} #{data[k][:data]}"
end
else
require_relative 'unit_test'
runtest('svn') # must agree with method name above
end
end
# test data
__END__
/srv/svn/Bills
Skipping
/srv/svn/cclas
#!: Updating listing file
List updated from 0 to revision 93888 .
/srv/svn/iclas
#!: Updating listing file
List is at revision 93865.
/srv/svn/Meetings
Updating '.':
At revision 67610.
/srv/svn/site-root
Updating '.':
U index.html
Updated to revision 1797393.
/srv/svn/site-root
A site-root/extpaths.txt
U site-root
Checked out revision 1797381.
/x1/srv/svn/personnel-duties
Updating '.':
svn: E175002: Unexpected HTTP status 400 'Bad Request' on '/repos/private/!svn/rvr/76960/foundation/officers/personnel-duties'
/x1/srv/svn/personnel-duties
#!: failed!
#!: Updating '.':
#!: svn: E175002: Unexpected HTTP status 400 'Bad Request' on '/repos/private/!svn/rvr/76960/foundation/officers/personnel-duties'
#!: will retry in 10 seconds
Updating '.':
svn: E175002: Unexpected HTTP status 400 'Bad Request' on '/repos/private/!svn/rvr/76960/foundation/officers/personnel-duties'
Updated to revision 1797393.
/srv/svn/qmail_control1
#!: svn update badrcptto badrcptto_patterns
Updating 'badrcptto':
At revision 1053537.
Updating 'badrcptto_patterns':
At revision 1053537.
Summary of updates:
Updated 'badrcptto' to r1053537.
Updated 'badrcptto_patterns' to r1053537.
/srv/svn/qmail_control2
#!: update depth from 'files' to 'empty'
D badheaders
D badheaders.new
D badheaderthresh
D badmailfrom
D badrcptto
D badrcptto_patterns
D concurrencylocal
D concurrencyremote
D defaultdelivery
D defaultdomain
D doublebounceto
D helohost
D locals
D me
D me.asf
D newsmtp
D plusdomain
D queuelifetime
D rcpthosts
D rcpthosts.asf
D signatures
D smtproutes
D timeoutconnect
D timeoutremote
D timeoutsmtpd
D virtualdomains
Updating '.':
Updated to revision 1053537.
#!: svn update badrcptto badrcptto_patterns
Updating 'badrcptto':
A badrcptto
Updated to revision 1053537.
Updating 'badrcptto_patterns':
A badrcptto_patterns
Updated to revision 1053537.
Summary of updates:
Updated 'badrcptto' to r1053537.
Updated 'badrcptto_patterns' to r1053537.
/srv/svn/qmail_control3
Checked out revision 1053537.
Updating 'badrcptto':
A badrcptto
Updated to revision 1053537.
Updating 'badrcptto_patterns':
A badrcptto_patterns
Updated to revision 1053537.
Summary of updates:
Updated 'badrcptto' to r1053537.
Updated 'badrcptto_patterns' to r1053537.