#!/bin/bash . /etc/sysconfig/autoport . /usr/share/autodist/webbuild-functions NUM=`echo "$QUERY_STRING" | sed -n 's/^.*NUM=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"` HOST=`echo "$QUERY_STRING" | sed -n 's/^.*HOST=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"` REP=`echo "$QUERY_STRING" | sed -n 's/^.*REP=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"` AS_HOST=`echo "$QUERY_STRING" | sed -n 's/^.*AS_HOST=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"` SHOWLOG=`echo "$QUERY_STRING" | sed -n 's/^.*SHOWLOG=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"` SHOWINDEX=`echo "$QUERY_STRING" | sed -n 's/^.*SHOWINDEX=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"` LINES=`echo "$QUERY_STRING" | sed -n 's/^.*LINES=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"` FORMAT=`echo "$QUERY_STRING" | sed -n 's/^.*FORMAT=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"` FULL=`echo "$QUERY_STRING" | sed -n 's/^.*FULL=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"` function resolve_logname() { local l=$1 local jobname=$2 unset SUBJOBNAME OPERATIONNAME OPERATIONSTATUS SUBJOBNAME=`echo $l | sed "s|.*/${jobname}_\(.*\)\..*|\1|"` [ "${SUBJOBNAME:0:1}" = "_" ] && SUBJOBNAME=$l [ "$SUBJOBNAME" = "$l" ] && SUBJOBNAME=`echo $l | sed "s|.*/\(.*\)\..*|\1|"` SUBJOBNAME=${SUBJOBNAME/__*} [ "${BUILDOPERATION[$b]}" ] && \ OPERATIONNAME=${BUILDOPERATION[$b]} || OPERATIONNAME=`echo $l | sed "s|\(.*\)/.*/.*|\1|"` [ "${BUILDOPERATIONSTATUS[$b]}" ] && \ OPERATIONSTATUS=${BUILDOPERATIONSTATUS[$b]} || OPERATIONSTATUS=`echo $l | sed "s|.*/\(.*\)/.*|\1|"` } [ ! "$FORMAT" ] && FORMAT=html [ "$LINES" ] || LINES=5 [ "$HOST" ] || HOST=0 [ "$AS_HOST" ] || AS_HOST=0 [ "$AS_HOST" -a "$HOST" != "0" ] && HOST_ADD="&HOST=$HOST" if [ "$AS_HOST" = "0" -a "$FORMAT" = "xml" ]; then echo -e "Content-type: text/xml\nPragma: no-cache\n" echo -n "<autodist><output><![CDATA[" RELOADTIME=3600000 else echo -e "Content-type: text/html; charset=UTF-8\n" fi if [ "$SHOWINDEX" ]; then echo "Host $AS_HOST:" for i in `seq 0 ${#AUTOPORT_ARCH[*]}`; do [ "${AUTOPORT_ARCH[$i]}" ] || continue [ "${AUTOPORT_DISABLE[$i]}" -a "${AUTOPORT_DISABLE[$i]}" != "0" ] && continue RNUM=-1 for r in ${AUTOPORT_REPOSITORIES[$i]}; do RNUM=`expr $RNUM + 1` if [ "${AUTOPORT_UPDATE[$i]}" ]; then echo "<a href=\"?NUM=$i&REP=$RNUM$HOST_ADD\">$r(${AUTOPORT_ARCH[$i]})</a> " elif [ "${AUTOPORT_CHROOT[$i]}" ]; then echo "<a href=\"?NUM=$i&REP=$RNUM$HOST_ADD\">$r(${AUTOPORT_ARCH[$i]})</a> " elif [ "${AUTOPORT_NATIVE[$i]}" ]; then echo "<a href=\"?NUM=$i&REP=$RNUM$HOST_ADD\">$r(${AUTOPORT_ARCH[$i]})</a> " elif [ "${AUTOPORT_CROSS[$i]}" ]; then echo "<a href=\"?NUM=$i&REP=$RNUM$HOST_ADD\">$r(${AUTOPORT_CROSS[$i]};${AUTOPORT_ARCH[$i]})</a> " fi done done echo "<br>" exit 0 elif [ "$AS_HOST" = "0" ]; then echo "Show: [<a href=\"?NUM=\">All hosts</a>] [<a href=\"?SHOWLOG=monitor\">Build hosts monitor</a>]<br>" for h in `seq 0 ${#AUTOPORT_CGI_HOST[*]}`; do curl --connect-timeout 20 "${AUTOPORT_CGI_HOST[$h]}?AS_HOST=$h&SHOWINDEX=1" 2>/dev/null done echo "<hr>" fi [ ! "$SHOWLOG" -a "$HOST" = "$AS_HOST" ] && echo "<h2>Host: `hostname -s` (`uname -m`, kernel `uname -r`)</h2>" if [ "$SHOWLOG" -a "$HOST" != "$AS_HOST" ]; then curl "${AUTOPORT_CGI_HOST[$HOST]}?AS_HOST=$HOST&SHOWLOG=$SHOWLOG&NUM=$NUM&REP=$REP&LOG=$LOG&FULL=$FULL" 2>/dev/null else for i in `seq 0 ${#AUTOPORT_ARCH[*]}`; do if [ "$SHOWLOG" = "monitor" ]; then echo "<h2>Build hosts monitor</h2>" icecream-monitor $ICECREAM_MONITOR_HOST listcs | \ while read line; do [ "${line:0:8}" = "200 done" ] && printon= if [ "$printon" ]; then set -- $line case $2 in \(*) echo "<b>$line</b><br>" ;; *) echo "$line<br>" ;; esac fi [ "${line:0:6}" = "listcs" ] && printon=1 done echo "<br>" RELOADTIME=15000 break fi RNUM=-1 for r in ${AUTOPORT_REPOSITORIES[$i]}; do [ "${AUTOPORT_ARCH[$i]}" ] || continue [ "${AUTOPORT_DISABLE[$i]}" -a "${AUTOPORT_DISABLE[$i]}" != "0" ] && continue RNUM=`expr $RNUM + 1` LOGDIR=`environment_logdir $i` AUTOPORTLOGDIR=`environment_autoport_logdir $i` ENVROOTDIR=`environment_rootdir $i` if [ "${AUTOPORT_UPDATE[$i]}" ]; then LOGFILE="$LOGDIR/autodist.log" LASTLOGFILE="$LOGDIR/autodist-last.log" STATEFILE="$LOGDIR/autoupdate-current" LASTSTATEFILE="$LOGDIR/autoupdate-last" elif [ "${AUTOPORT_CHROOT[$i]}" ]; then LOGFILE="/var/autodist/log/autoport-chroot-$r-${AUTOPORT_CHROOT[$i]}.log" LASTLOGFILE="/var/autodist/log/autoport-chroot-$r-${AUTOPORT_CHROOT[$i]}-last.log" AUTODISTLOGFILE="$AUTOPORTLOGDIR/${AUTOPORT_ARCH[$i]}/$r-current.log" AUTODISTSTATEFILE="$AUTOPORTLOGDIR/autoport-$r-current" elif [ "${AUTOPORT_NATIVE[$i]}" ]; then LOGFILE="/var/autodist/log/autoport-native-$r-${AUTOPORT_ARCH[$i]}.log" LASTLOGFILE="/var/autodist/log/autoport-native-$r-${AUTOPORT_ARCH[$i]}-last.log" AUTODISTLOGFILE="$AUTOPORTLOGDIR/${AUTOPORT_ARCH[$i]}/$r-current.log" AUTODISTSTATEFILE="$AUTOPORTLOGDIR/autoport-$r-current" elif [ "${AUTOPORT_CROSS[$i]}" ]; then LOGFILE="$LOGDIR/autoport-cross-$r-${AUTOPORT_CROSS[$i]}.log" LASTLOGFILE="$LOGDIR/autoport-cross-$r-${AUTOPORT_CROSS[$i]}-last.log" else continue fi if [ "$SHOWLOG" ]; then if [ "$HOST" = "$AS_HOST" -a "$NUM" = "$i" -a "$REP" = "$RNUM" ]; then echo -n "<p><h2>$SHOWLOG log in " if [ "${AUTOPORT_UPDATE[$i]}" ]; then echo -n "update" elif [ "${AUTOPORT_CHROOT[$i]}" ]; then echo -n "${AUTOPORT_CHROOT[i]} chroot" elif [ "${AUTOPORT_NATIVE[$i]}" ]; then echo -n "native" elif [ "${AUTOPORT_CROSS[$i]}" ]; then echo -n "cross" fi echo " environment for ${AUTOPORT_ARCH[$i]}" [ "${SHOWLOG}" = "current" -o "${SHOWLOG}" = "last" -a ! "${AUTOPORT_UPDATE[$i]}" ] && echo -n " ($r)" echo -n ":</h2>" cat << _EOF <div class="downloadbox" align="center"> <div class="output outputbox"> _EOF echo -n "<pre><code>" if [ "$SHOWLOG" = "current" ]; then RELOADTIME=3600000 cat $LOGFILE | parse_build_output elif [ "$SHOWLOG" = "last" ]; then cat $LASTLOGFILE | parse_build_output LASTLOGDETAILS=`tail $LASTLOGFILE | grep "See .* for details" | sed "s|.*See \(.*\) for details.*|\1|"` cat $ENVROOTDIR/$LASTLOGDETAILS | parse_build_output else # Security check [ "${SHOWLOG/\/\.}" != "${SHOWLOG}" ] && continue BUILDLOGDIR="$LOGDIR" if [ "${SHOWLOG/\/ok\/}" != "${SHOWLOG}" -o "${SHOWLOG/\failed\/}" != "${SHOWLOG}" ]; then SHOWLOGPKG=${SHOWLOG/*\/} [ "${SHOWLOGPKG}" ] || continue echo "<table style=\"color:black;width:auto;\"><tr><td colspan=3>Last ${SHOWLOGPKG} logs:</td>" for t in prepare update build install send; do echo -n "<tr><td>$t:</td><td>" [ -e ${BUILDLOGDIR}${t}/ok/${SHOWLOGPKG} ] && echo -n "<td><a style=\"color:green;text-decoration:none\" target=_autodist href=\"?NUM=$i&REP=$RNUM$HOST_ADD&SHOWLOG=${t}/ok/${SHOWLOGPKG}\">OK</a></td>" || echo "<td></td>" [ -e ${BUILDLOGDIR}${t}/failed/${SHOWLOGPKG} ] && echo -n "<td><a style=\"color:green;text-decoration:none\" target=_autodist href=\"?NUM=$i&REP=$RNUM$HOST_ADD&SHOWLOG=${t}/failed/${SHOWLOGPKG}\">FAILED</a></td>" || echo "<td></td>" echo "</tr>" done echo "</table>" fi if [ -r ${BUILDLOGDIR}${SHOWLOG} ]; then LOGFILESIZE=`stat -c %s ${BUILDLOGDIR}${SHOWLOG}` LOGDATE=`stat -c %y ${BUILDLOGDIR}${SHOWLOG}` echo -n "<b>${SHOWLOG} ($LOGDATE; $LOGFILESIZE):</b>" if [ $LOGFILESIZE -lt 2097152 -o "$FULL" != "" ]; then cat ${BUILDLOGDIR}${SHOWLOG} | parse_build_output else head -c 1048576 ${BUILDLOGDIR}${SHOWLOG} | parse_build_output echo "<br><font style=\"background-color:yellow;color:black\"><------ CUT (long file) ------></font>" tail -c 1048576 ${BUILDLOGDIR}${SHOWLOG} | parse_build_output fi fi fi echo -n "</pre></code>" echo -n "</div></div>" # break fi [ "${AUTOPORT_UPDATE[$i]}" ] && break elif [ ! "$SHOWLOG" ]; then RELOADTIME=600000 [[ "$NUM" && "$NUM" != "$i" ]] && continue [[ "$HOST" = "$AS_HOST" ]] || continue if [ "${AUTOPORT_UPDATE[$i]}" ]; then echo "<b>* <a target=_autodist href=\"?NUM=$i&REP=$RNUM&HOST=$AS_HOST\">$r</a>(${AUTOPORT_ARCH[$i]}) (type:autodist update)" echo " [ <a target=_autodist href=\"?SHOWLOG=current&NUM=$i&REP=$RNUM$HOST_ADD\">log</a> <a target=_autodist href=\"?SHOWLOG=last&NUM=$i&REP=$RNUM$HOST_ADD\">last</a> ]</b>" fi if [ "${AUTOPORT_CHROOT[$i]}" ]; then echo "<b>* <a target=_autodist href=\"?NUM=$i&REP=$RNUM&HOST=$AS_HOST\">$r</a>(${AUTOPORT_ARCH[$i]}) (type:chroot autoport</a> chroot:${AUTOPORT_CHROOT[$i]})" echo " [ <a target=_autodist href=\"?SHOWLOG=current&NUM=$i&REP=$RNUM$HOST_ADD\">log</a> <a target=_autodist href=\"?SHOWLOG=last&NUM=$i&REP=$RNUM$HOST_ADD\">last</a> ]</b>" fi if [ "${AUTOPORT_NATIVE[$i]}" ]; then echo "<b>* <a target=_autodist href=\"?NUM=$i&REP=$RNUM&HOST=$AS_HOST\">$r</a>(${AUTOPORT_ARCH[$i]}) (type:native autoport)" echo " [ <a target=_autodist href=\"?SHOWLOG=current&NUM=$i&REP=$RNUM$HOST_ADD\">log</a> <a target=_autodist href=\"?SHOWLOG=last&NUM=$i&REP=$RNUM$HOST_ADD\">last</a> ]</b>" fi if [ "${AUTOPORT_CROSS[$i]}" ]; then echo "<b>* <a target=_autodist href=\"?NUM=$i&REP=$RNUM&HOST=$AS_HOST\">cross-platform</a> autoport (arch:${AUTOPORT_CROSS[$i]})</b>" echo " [ <a target=_autodist href=\"?SHOWLOG=current&NUM=$i&REP=$RNUM$HOST_ADD\">last</a> ]</b>" fi cat << _EOF <div class="downloadbox" align="center"> <div align="left" class="showlogbox"> _EOF echo -n "<pre style='margin:1px;word-wrap:normal;white-space:pre;'>" unset BUILDNOWIDX BUILDLOG BUILDNOW BUILDNOWSTATUS SCHEDULED STARTTIME AUTODIST_PID ENDTIME if [ "${AUTOPORT_UPDATE[$i]}" ]; then BUILDNOWIDX=0 STARTTIME=`head $LOGFILE | grep "%% Autodist started" | sed "s|.* @ ||"` AUTODIST_PID=`head $LOGFILE | grep "%% Autodist started" | sed "s|.*PID \([0-9]*\) .*|\1|"` SCHEDULED=`head $LOGFILE | grep "%% autoupdate jobs:" | sed "s|.*autoupdate jobs: ||"` ENDTIME=`tail $LOGFILE | grep "%% All jobs done @" | sed "s|.*@ ||"` while read line; do set -- $line for c in `seq 0 ${#BUILDNOW[*]}`; do if [ "${BUILDNOW[c]}" = "$1" ]; then BUILDNOWIDX=$c break else BUILDNOWIDX=$c fi done BUILDNOW[$BUILDNOWIDX]="$1" [ "$4" ] && BUILDLOG[$BUILDNOWIDX]="${BUILDLOG[$BUILDNOWIDX]} `echo $4 | sed "s|.*autodist/log/||"`" # BUILDLOG[$BUILDNOWIDX]="${BUILDLOG[$BUILDNOWIDX]} $2/$3/$1.i586" BUILDNOWSTATUS[$BUILDNOWIDX]=$3 BUILDNOWIDX=`expr $BUILDNOWIDX + 1` done < $STATEFILE else STARTTIME=`head $LOGFILE | grep "^+ .*start at " | sed "s|.*start at ||"` # AUTODIST_PID=`head $LOGFILE | grep "%% Autodist started" | sed "s|.*PID \([0-9]*\) .*|\1|"` SCHEDULED=`head -n 40 $LOGFILE | grep -m 1 "^> .*Scheduled jobs: " | sed "s|.*Scheduled jobs: ||"` ENDTIME=`tail $LOGFILE | grep "^- .*end at " | sed "s|.*end at ||"` if [ -e "$AUTODISTSTATEFILE" ]; then while read line; do set -- $line for c in `seq 0 ${#BUILDNOW[*]}`; do if [ "${BUILDNOW[c]}" = "$1" ]; then BUILDNOWIDX=$c break else BUILDNOWIDX=$c fi done BUILDNOW[$BUILDNOWIDX]="$1" if [ "$4" ]; then BUILDLOG[$BUILDNOWIDX]="${BUILDLOG[$BUILDNOWIDX]} `echo $4 | sed "s|.*/log/||"`" else if [ "$2" = "port" ]; then CURRLOGFILE=build/$3/$1.${AUTOPORT_ARCH[$i]} else CURRLOGFILE=$2/$3/$1.${AUTOPORT_ARCH[$i]} fi BUILDLOG[$BUILDNOWIDX]="${BUILDLOG[$BUILDNOWIDX]} $CURRLOGFILE" fi # BUILDLOG[$BUILDNOWIDX]="${BUILDLOG[$BUILDNOWIDX]} $2/$3/$1.i586" BUILDNOWSTATUS[$BUILDNOWIDX]=$3 BUILDNOWIDX=`expr $BUILDNOWIDX + 1` done < $AUTODISTSTATEFILE for p in `dirname $LOGFILE`/current.*; do CURRENT_FILE=`basename $p` AUTODIST_PID=${p/*.} grep "autodist" /proc/$AUTODIST_PID/status &>/dev/null && break AUTODIST_PID= done fi fi [ "$STARTTIME" ] && echo "<b>Start:</b> $STARTTIME" [ "$SCHEDULED" ] && echo "<b>Scheduled jobs:</b> $SCHEDULED" LASTJOBNAME= for b in `seq 0 ${#BUILDNOW[*]}`; do # set -- ${BUILDNOW[$b]} JOBNAME=${BUILDNOW[$b]} [ "$JOBNAME" ] || continue if [ "$JOBNAME" != "$LASTJOBNAME" ]; then [ "$LASTJOBNAME" -a "$JOBNAME" ] && echo if [ "${BUILDLOG[$b]}" ]; then resolve_logname ${BUILDLOG[$b]/* } $JOBNAME if [ "${OPERATIONSTATUS}" = "ok" ]; then WEBBUILD_APPEND="&LOGSTATUSOK=true" else WEBBUILD_APPEND="&LOGSTATUSOK=false" fi echo -n "<a target=_webbuild href=\"$AUTOPORT_WEBBUILD_HOST?REQUEST=autobuildedit&ENVIRONMENT=$i&PACKAGE=$JOBNAME&LOGTYPE=$OPERATIONNAME${WEBBUILD_APPEND}\"><b>$JOBNAME</b></a>: " else echo -n "<a target=_webbuild href=\"$AUTOPORT_WEBBUILD_HOST?ENVIRONMENT=$i&PACKAGE=$JOBNAME\"><b>$JOBNAME</b></a>: " fi fi rowcnt=0 if [ "${BUILDLOG[$b]}" ]; then for l in ${BUILDLOG[$b]}; do resolve_logname $l $JOBNAME # if [ $rowcnt -ge 4 ]; then # echo # rowcnt=0 # fi case $OPERATIONNAME-$OPERATIONSTATUS in build-ok|send-ok|install-ok|retryinstall-ok) echo -n "<a target=_autodist href=\"?SHOWLOG=$l&NUM=$i&REP=$RNUM$HOST_ADD\">$OPERATIONNAME:$OPERATIONSTATUS</a>" ;; update-failed|autoupdate-failed) if [ "${BUILDNOWSTATUS[$b]}" = "4" ]; then echo -n "<a target=_autodist href=\"?SHOWLOG=$l&NUM=$i&REP=$RNUM$HOST_ADD\"><font color=green>$OPERATIONNAME:up-to-date</font></a>" elif [ "${BUILDNOWSTATUS[$b]}" = "3" ]; then echo -n "<a target=_autodist href=\"?SHOWLOG=$l&NUM=$i&REP=$RNUM$HOST_ADD\"><font color=darkgoldenrod>$OPERATIONNAME:unknown</font></a>" elif [ "${BUILDNOWSTATUS[$b]}" = "2" ]; then echo -n "<a target=_autodist href=\"?SHOWLOG=$l&NUM=$i&REP=$RNUM$HOST_ADD\"><font color=darkgoldenrod>$OPERATIONNAME:newer</font></a>" else echo -n "<a target=_autodist href=\"?SHOWLOG=$l&NUM=$i&REP=$RNUM$HOST_ADD\"><font color=red>$OPERATIONNAME:$OPERATIONSTATUS</font></a>" fi ;; *-ok) echo -n "<a target=_autodist href=\"?SHOWLOG=$l&NUM=$i&REP=$RNUM$HOST_ADD\"><font color=black>$OPERATIONNAME:$OPERATIONSTATUS</font></a>" ;; *) echo -n "<a target=_autodist href=\"?SHOWLOG=$l&NUM=$i&REP=$RNUM$HOST_ADD\"><font color=red>$OPERATIONNAME:$OPERATIONSTATUS</font></a>" ;; esac # [ "$SUBJOBNAME" != "$JOBNAME" ] && echo -en "(<a href=\"$AUTOPORT_WEBBUILD_HOST?ENVIRONMENT=$i&PACKAGE=$SUBJOBNAME\" target=\"webbuild\">$SUBJOBNAME</a>)" echo -n " " rowcnt=`expr $rowcnt + 1` done fi if [[ $b -eq $BUILDNOWIDX-1 && ! "$ENDTIME" ]]; then echo -n "<font color=green>${BUILDOPERATION[$b]}(in progress...)</font>" fi LASTJOBNAME=$JOBNAME done [ "$LASTJOBNAME" ] && echo if [ "$ENDTIME" ]; then echo "<b>End:</b> $ENDTIME" elif [ "$AUTODIST_PID" ]; then echo "<b>End: <a target=_autodist href=\"?SHOWLOG=current.$AUTODIST_PID&NUM=$i&REP=$RNUM$HOST_ADD\">in progress</a></b>" fi echo # grep -v "^=" $LOGFILE | tail -n "$LINES" | sed "s|.*\r||" # echo echo "</pre></div></div>" fi done done # only root host (0) calls other hosts if [ "$AS_HOST" = "0" -a ! "$SHOWLOG" ]; then for h in `seq 1 ${#AUTOPORT_CGI_HOST[*]}`; do WBHOSTURL=`echo ${AUTOPORT_CGI_HOST[$h]} | sed "s|^\(http[s]*://[^/]*\).*$|\1|"` if [ "$WBHOSTURL" ]; then curl -m1 -s -I ${WBHOSTURL} >/dev/null || continue if [ "$NUM" -a "$HOST" = "$h" ]; then curl "${AUTOPORT_CGI_HOST[$h]}?AS_HOST=$h&LINES=$LINES&NUM=$NUM&REP=$RNUM&HOST=$HOST" 2>/dev/null elif [ ! "$NUM" ]; then curl "${AUTOPORT_CGI_HOST[$h]}?AS_HOST=$h&LINES=$LINES" 2>/dev/null fi fi done fi fi if [ "$AS_HOST" = "0" ]; then echo "<p><i>Generated by autodist CGI interface. Last update: `date`</i>" if [ "$FORMAT" = "xml" ]; then echo -n "]]></output>" [ "$RELOADTIME" ] && echo -n "<reloadtime>$RELOADTIME</reloadtime>" echo "</autodist>" fi fi