freebsd-ports/Tools/portbuild/scripts/processlogs
Mark Linimon 18d0ec2618 Generalize the packge building scripts to be able to be run on more than
one 'head' node, rather than just pointyhat itself.

Constants are factored out into installation-specific files known as
portbuild/conf/server.conf and portbuild/conf/client.conf.  There is
only one server.conf file.  Individual <arch> directories may have
their own client.conf files, or may symlink to ../conf/client.conf.

Several bugs are fixed and improvements are made:

 - suppress error message if there are no logs yet.
 - change the misnomer filename 'cvsdone' to '.updated'.
 - fix a bug by un-escaping '_' in the timestamp.

Feature safe:	yes
2010-06-25 23:37:19 +00:00

370 lines
10 KiB
Bash
Executable file

#!/bin/sh
# Process the logs in a certain directory and construct the HTML pages
# summarizing them
#
# We only construct the new html pages if either
# * No HTML files exist yet
# * .force exists in this directory (set by pdispatch when a log is
# removed by package build success)
# * A new log file has appeared since the last run.
#
# Individual summary data for the logs is saved between runs instead of
# being recomputed each time. Removing the old data for logs that
# no longer exist is the responsibility of the dopackages script when
# starting a new build.
# echo 'processlogs: at '`date`', begin'
arch=$1
# establish which directory the logfiles live in (leave out for
# backwards compatibility)
buildlogdir=$(realpath .)
if [ "$2" != "" ]; then
buildlogdir="$2"
fi
baselogdir=$(basename ${buildlogdir})
# establish which directory INDEX lives in (leave out for
# backwards compatibility)
indexlogdir=$(realpath .)
if [ "$3" != "" ]; then
indexlogdir="$3";
fi
# allow this script to be run from anywhere in the tree
scriptdir=$(dirname $0)
errorscript=$scriptdir/processonelog
# Figure out which arch we're building for
pb=/var/portbuild
. ${pb}/conf/server.conf
. ${pb}/${arch}/portbuild.conf
# get the list of buildlogs.
cd ${buildlogdir}
if [ -e .force -o \! -e index.html ]; then
rm -f .force
force=1
else
force=0
fi
alllogs=$(find . -maxdepth 1 -type f \( -name '*.log' -o -name '*.log.bz2' \) | sed -e 's,^./,,' 2>/dev/null)
if [ -e .stamp -a ${#alllogs} -eq 0 ]; then
exit
fi
# create a name for the tempfile
of=.index.html
# XXX temporary
test -f .logs && rm -f .logs
mkdir -p .logs
#
# Read the log-files and write summaries to .logs in the format
# $filename|$portname|$affected|$logsize|$dir|$maintainer|\
# $reason|$tag|$broken|$datetime
#
echo "processlogs: at $(date), begin processing log files for ${arch} in ${baselogdir}"
rm -f .logs/.all
set -- ${alllogs}
gotnew=0
while [ $# -ge 1 ]; do
log=$1
shift
if [ ${log%.log.bz2} != ${log} -a -e ${log%.bz2} ]; then
# We have both a .log.bz2 and a .log, assume the former is stale
rm -f ${log}
continue
fi
# basename with .log and .log.bz2 stripped
base=${log%.bz2}
base=${log%.log}
if [ ${log} -nt .stamp -o ! -e .logs/${base} ]; then
# Save to the base name so the data persists after the log is
# compressed
${errorscript} ${log} ${indexlogdir} > .logs/${base}
gotnew=1
fi
cat .logs/${base} >> .logs/.all
done
touch .stamp
n_logs=0
if [ -e .logs/.all ]; then
n_logs=$(cat .logs/.all | wc -l)
fi
echo "processlogs: at "`date`", end processing log files for ${arch} in ${baselogdir}"
if [ ${force} -eq 0 -a ${gotnew} -eq 0 ]; then
# Nothing new to do
exit
fi
header() {
echo "<html><head><title>Package building errors</title>" >$of
echo "</head><body><h1>Package building errors</h1>" >>$of
echo "<p>View by " >>$of
echo "[ <a href=\"index.html\">port</a> " >>$of
echo "| <a href=\"index-maintainer.html\">maintainer</a> " >>$of
echo "| <a href=\"index-category.html\">category</a> " >>$of
echo "| <a href=\"index-reason.html\">error</a> " >>$of
echo "| <a href=\"index-builddate.html\">builddate</a> " >>$of
echo "]</p>" >>$of
if [ ${n_logs} = "0" ]; then
echo "No errors (yet)" >>$of
else
if [ -s .updated ]; then
echo "ports update finished at: $(cat .updated)<br>" >> $of
fi
latest=$(ls -rtTl *.log *.log.bz2 2> /dev/null | tail -1 | awk '{printf("%s %s %s %s\n",$6,$7,$8,$9)}')
echo "Timestamp of newest log: $latest<br><br>" >> $of
echo "\"Aff.\" is number of ports that depend on this one<br>" >> $of
echo "\"<font color=\"red\">[B]</font>\" indicates port is marked BROKEN (Note: BROKEN ports are not frequently rebuilt so they may not be listed here)<br><br>" >> $of
echo "<p>${n_logs} errors</p>" >> $of
echo "<table border=1>" >>$of
echo "<tr>$1</tr>" >>$of
fi
}
footer() {
echo "</table>" >>$of
echo "</body>" >>$of
echo "</html>" >>$of
}
# Now reread the .logs/.all file and create the reports.
# echo 'processlogs: at '`date`', create default output'
#
# Create "default" output, sorted on portname
#
header "<th>Port</th><th>Aff.</th><th>Size</th><th>CVS</th><th>Maintainer</th><th>Reason</th><th>Build date</th>"
if [ ${n_logs} -gt 0 ]; then
sort .logs/.all | while read line; do
IFS="|"
set -- ${line}
unset IFS
mailto="$6"
if [ "$6" != "" ] ; then
mailto="<a href=\"mailto:$6\">$6</a>"
fi
echo "<tr>" >> $of
echo "<td><a href=\"http://${MASTER_URL}/errorlogs/${arch}-errorlogs/${baselogdir}/$1\">$2</a></td>" >> $of
affby="$3"
test "${affby}" = "0" -o "${affby}" = "-1" && affby="&nbsp;"
echo "<td align=\"right\">${affby}</td><td align=\"right\">$4 Kb</td>" >> $of
echo "<td><a href=\"http://www.FreeBSD.org/cgi/cvsweb.cgi/ports/$5\">$5</a></td>" >> $of
echo "<td>$mailto</td>" >> $of
echo "<td>" >> $of
test "$9" = "yes" && echo "<font color=\"red\">[B]</font>" >> $of
reason="$7"
echo "<a href=\"http://${MASTER_URL}/#$8\">$reason</a>" >> $of
echo "</td>" >> $of
date=`echo ${10} | sed -e "s/_/ /g"`
echo "<td>$date</td>" >> $of
echo "</tr>" >> $of
done
fi
footer ""
mv -f $of index.html
# echo 'processlogs: at '`date`', create output sorted by category'
#
# Create output by category
#
header "<th>CVS</th><th>Aff.</th><th>Size</th><th>Port</th><th>Maintainer</th><th>Reason</th><th>Build date</th>"
if [ ${n_logs} -gt 0 ]; then
sort -t \| +4 .logs/.all | while read line; do
IFS="|"
set -- $line
unset IFS
mailto="$6"
if [ "$6" != "" ] ; then
mailto="<a href=\"mailto:$6\">$6</a>"
fi
echo "<tr>" >> $of
echo "<td><a href=\"http://www.FreeBSD.org/cgi/cvsweb.cgi/ports/$5\">$5</a></td>" >> $of
affby="$3"
test "${affby}" = "0" -o "${affby}" = "-1" && affby="&nbsp;"
echo "<td align=\"right\">${affby}</td><td align=\"right\">$4 Kb</td>" >> $of
echo "<td><a href=\"http://${MASTER_URL}/errorlogs/${arch}-errorlogs/${baselogdir}/$1\">$2</a></td>" >> $of
echo "<td>$mailto</td>" >> $of
echo "<td>" >> $of
test "$9" = "broken" && echo "<font color=\"red\">[B]</font>" >> $of
reason="$7"
echo "<a href=\"http://${MASTER_URL}/#$8\">$reason</a>" >> $of
echo "</td>" >> $of
date=`echo ${10} | sed -e "s/_/ /g"`
echo "<td>$date</td>" >> $of
echo "</tr>" >> $of
done
fi
footer ""
mv -f $of index-category.html
# echo 'processlogs: at '`date`', create output sorted by maintainer'
#
# Create output by maintainer
#
header "<th>Maintainer</th><th>Port</th><th>Aff.</th><th>Size</th><th>CVS</th><th>Reason</th><th>Build date</th>"
if [ ${n_logs} -gt 0 ]; then
sort -t \| +5 .logs/.all | while read line; do
IFS="|"
set -- $line
unset IFS
mailto="$6"
if [ "$6" != "" ] ; then
mailto="<a href=\"mailto:$6\">$6</a>"
fi
echo "<tr>" >> $of
echo "<td>$mailto</td>" >> $of
echo "<td><a href=\"http://${MASTER_URL}/errorlogs/${arch}-errorlogs/${baselogdir}/$1\">$2</a></td>" >> $of
affby="$3"
test "${affby}" = "0" -o "${affby}" = "-1" && affby="&nbsp;"
echo "<td align=\"right\">${affby}</td><td align=\"right\">$4 Kb</td>" >> $of
echo "<td><a href=\"http://www.FreeBSD.org/cgi/cvsweb.cgi/ports/$5\">$5</a></td>" >> $of
echo "<td>" >> $of
test "$9" = "broken" && echo "<font color=\"red\">[B]</font>" >> $of
reason="$7"
echo "<a href=\"http://${MASTER_URL}/#$8\">$reason</a>" >> $of
echo "</td>" >> $of
date=`echo ${10} | sed -e "s/_/ /g"`
echo "<td>$date</td>" >> $of
echo "</tr>" >> $of
done
fi
footer ""
mv -f $of index-maintainer.html
# echo 'processlogs: at '`date`', create output sorted by error'
#
# Create output by error
#
header "<th>Reason</th><th>Port</th><th>Aff.</th><th>Size</th><th>CVS</th><th>Maintainer</th><th>Build date</th>"
if [ ${n_logs} -gt 0 ]; then
sort -t \| +7 .logs/.all | while read line; do
IFS="|"
set -- ${line}
unset IFS
mailto="$6"
if [ "$6" != "" ] ; then
mailto="<a href=\"mailto:$6\">$6</a>"
fi
echo "<tr>" >> $of
echo "<td>" >> $of
test "$9" = "broken" && echo "<font color=\"red\">[B]</font>" >> $of
reason="$7"
echo "<a href=\"http://${MASTER_URL}/#$8\">$reason</a>" >> $of
echo "</td>" >> $of
echo "<td><a href=\"http://${MASTER_URL}/errorlogs/${arch}-errorlogs/${baselogdir}/$1\">$2</a></td>" >> $of
affby="$3"
test "${affby}" = "0" -o "${affby}" = "-1" && affby="&nbsp;"
echo "<td align=\"right\">${affby}</td><td align=\"right\">$4 Kb</td>" >> $of
echo "<td><a href=\"http://www.FreeBSD.org/cgi/cvsweb.cgi/ports/$5\">$5</a></td>" >> $of
echo "<td>$mailto</td>" >> $of
date=`echo ${10} | sed -e "s/_/ /g"`
echo "<td>$date</td>" >> $of
echo "</tr>" >> $of
done
fi
footer ""
mv -f $of index-reason.html
# echo 'processlogs: at '`date`', create output sorted by builddate'
#
# Create output by builddate
#
header "<th>Build date</th><th>Port</th><th>Aff.</th><th>Size</th><th>CVS</th><th>Maintainer</th><th>Reason</th>"
if [ ${n_logs} -gt 0 ]; then
sort -t \| +9 .logs/.all | while read line; do
IFS="|"
set -- ${line}
unset IFS
mailto="$6"
if [ "$6" != "" ] ; then
mailto="<a href=\"mailto:$6\">$6</a>"
fi
echo "<tr>" >> $of
date=`echo ${10} | sed -e "s/_/ /g"`
echo "<td>$date</td>" >> $of
echo "<td><a href=\"http://${MASTER_URL}/errorlogs/${arch}-errorlogs/${baselogdir}/$1\">$2</a></td>" >> $of
affby="$3"
test "${affby}" = "0" -o "${affby}" = "-1" && affby="&nbsp;"
echo "<td align=\"right\">${affby}</td><td align=\"right\">$4 Kb</td>" >> $of
echo "<td><a href=\"http://www.FreeBSD.org/cgi/cvsweb.cgi/ports/$5\">$5</a></td>" >> $of
echo "<td>$mailto</td>" >> $of
echo "<td>" >> $of
test "$9" = "broken" && echo "<font color=\"red\">[B]</font>" >> $of
reason="$7"
echo "<a href=\"http://${MASTER_URL}/#$8\">$reason</a>" >> $of
echo "</td>" >> $of
echo "</tr>" >> $of
done
fi
footer ""
mv -f $of index-builddate.html
# echo 'processlogs: at '`date`', create maintainer list'
#
# Get list of maintainers.
if [ ${n_logs} -gt 0 ]; then
cut -f 6 -d \| .logs/.all | sort -fu > maintainers
else
cat /dev/null > maintainers
fi
# echo 'processlogs: at '`date`', done'