2019-02-18 07:56:39 -06:00
#!/bin/bash
# File: maat-builder
#
# Description: This file allows a Maat host to build source packages
# and optionally upload to the AniNIX::Foundation
#
# Package: ConfigPackages/Maat
# Copyright: WTFPL
#
# Author: darkfeather@aninix.net
#
### Printing defaults
2019-04-08 05:05:08 -05:00
passCell = "<td style='color:green;'>PASS</td>" ;
failCell = "<td style='color:red;'>FAIL</td>" ;
warnCell = "<td style='color:yellow;'>N/A</td>" ;
2019-02-18 07:56:39 -06:00
### Add helptext.
function Usage() {
echo "Usage: $0 "
2019-04-08 05:05:08 -05:00
echo " $0 [ -b basedir ] [ -c AUR.git.list ] [ -u https://base.url/ ]"
echo " $0 [ -T ]"
2019-02-18 07:56:39 -06:00
echo " $0 -h"
echo
echo 'Add -v to increase verbosity or -h for help. Add the -l LOGFILE flags to log to a file'
2019-04-08 05:05:08 -05:00
echo "By default, $0 uses the depriv user to build packages. Override with -U"
2019-02-18 07:56:39 -06:00
}
### Put the initial content in the webfile
function SeedWebFile() {
printf '<html>\n<head>\n<title>AniNIX::Maat \\\\ Build Results</title>\n<link rel="icon" type="image/png" href=https://aninix.net/mediawiki/images/9/90/MaatIcon.png" />\n<link rel="icon" type="image/png" href="/mediawiki/images/9/90/MaatIcon.png">\n<meta name="apple-mobile-web-app-capable" content="yes" />\n<link rel="stylesheet" type="text/css" href="/style.css">\n<link rel="apple-touch-icon" sizes="180x180" href="mediawiki/images/9/90/MaatIcon.png" />\n</head>\n<body>\n<h1>AniNIX::Maat \\\\ Build Status</h1>\nWEBSTATSGOHERE\n' > " $webfile "
}
### Update the webfile to close up table tags and add stats.
function UpdateWebFile() {
2019-04-08 05:05:08 -05:00
sed -i "s#WEBSTATSGOHERE#<p>These are the AniNIX testing results. We found $passcount passing and $failcount failing packages, with $warncount warnings. It took $runtime seconds to finish.</p><table style='text-align: left;'><tr><th>Package</th><th>Testing Status</th><th>Build Status</th><th>Latest Build</th><th>Time of Run</th></tr>#" " $webfile "
2019-02-18 07:56:39 -06:00
echo '</table></body></html>' >> " $webfile "
}
### Build the package. Assumes a PKGBUILD is resent in the repo.
function BuildPackage() {
2019-04-08 05:05:08 -05:00
timeout --preserve-status 30s sudo -u " $user " makepkg -s --noconfirm & >/dev/null
2019-02-18 07:56:39 -06:00
if [ $? -ne 0 ] ; then
# Build failed.
2019-04-08 05:05:08 -05:00
printf " $failCell "" $warnCell " >> " $webfile "
2019-02-18 07:56:39 -06:00
else
# Build passed.
printf " $passCell ""<td>" >> " $webfile "
# List passing versions
ls -1 *.pkg.tar.xz | tr '\n' '`' | sed 's#`#<br/>#g' >> " $webfile "
printf "</td>" >> " $webfile "
fi
for pkg in ` find . -type f | egrep '.tar.xz$' ` ; do mv " $pkg " " $pkgdir " ; done
}
### Build the repo passed as argument
# param repo: the repo to build.
function BuildRepo() {
repo = " $1 "
cd " $srcdir "
if [ -z " $repo " ] ; then continue ; fi
2019-04-08 05:05:08 -05:00
repodir = " $( basename " $repo " | sed 's/\.git$//' ) "
2019-02-18 07:56:39 -06:00
#Set up the checkout
if [ ! -d " $repodir " ] ; then
git clone " $repo "
fi
2019-04-08 05:05:08 -05:00
chown -R " $user " : " $repodir "
2019-02-18 07:56:39 -06:00
cd " $repodir "
2019-04-08 05:05:08 -05:00
output = " $( git pull 2>& 1) "
if [ $? -eq 0 ] && [ -n " $incremental " ] && [[ " $output " = ~ Already\ up\ to\ date. ]] && [ -f *.tar.xz ] ; then
return ;
fi
2019-02-18 07:56:39 -06:00
# Find the PKGBuilds in the repo
for pkgbuild in ` find . -type f -name PKGBUILD` ; do
cd " $( dirname " $pkgbuild " ) "
# Tell the status file about it.
2019-04-08 05:05:08 -05:00
printf '<tr style="border: 1px solid #FFF;"><td>' "<a href=' $repo '> $repodir </a> -- $pkgbuild " '</td>' >> " $webfile "
2019-02-18 07:56:39 -06:00
if [ -f Makefile ] && [ ` egrep -c '^test:' Makefile` -ge 1 ] ; then
# Check test status.
2019-04-08 05:05:08 -05:00
timeout --preserve-status 30s /bin/bash -c "sudo -u \' $user \' make test" & >/dev/null
2019-02-18 07:56:39 -06:00
if [ $? -ne 0 ] ; then
# Testing failed.
printf " $failCell "" $warnCell "" $warnCell " >> " $webfile "
else
# Testing passed.
printf " $passCell " >> " $webfile "
BuildPackage
fi
else
# Can't test -- usually from non-AniNIX repos.
printf " $warnCell " >> " $webfile "
BuildPackage
fi
# Timestamp
2019-04-08 05:05:08 -05:00
printf "<td> $( date +%F-%R) </td></tr>\n" >> " $webfile "
2019-02-18 07:56:39 -06:00
cd " $cwd "
if [ ! -z " $testing " ] ; then break; fi
done
cd " $cwd "
}
### Update the local repo
function UpdateLocalRepo() {
cd " $pkgdir "
# TODO Add deduplication of updated files -- keep latest 3 versions.
repo-add --new ./AniNIX::Maat.db.tar.xz ` ls -1 *.tar.xz`
}
# Production defaults
baseurl = 'https://aninix.net/foundation/'
aurconf = '/usr/local/etc/Maat/aur.list'
homedir = /srv/maat/
unset upload
unset testing
2019-04-08 05:05:08 -05:00
unset incremental
user = "depriv"
2019-02-18 07:56:39 -06:00
# Stat tracking
starttime = ` date +%s`
# Parse arguments
2019-04-08 05:05:08 -05:00
while getopts 'b:c:hil:Tu:U:v' OPTION; do
2019-02-18 07:56:39 -06:00
case " ${ OPTION } " in
b) homedir = " ${ OPTARG } " ;;
c) aurconf = " ${ OPTARG } " ;;
h) Usage; exit 0 ;;
2019-04-08 05:05:08 -05:00
i) incremental = 1 ;;
2019-02-18 07:56:39 -06:00
l) cmdstring = " $0 " ; for arg in $@ ; do if [ " $arg " != "-l" ] && [ " $arg " != " ${ OPTARG } " ] ; then cmdstring = " $cmdstring \" ${ arg } \"" ; fi ; done ; exec /bin/bash -c " $0 $cmdstring | tee -a \" ${ OPTARG } \"" ;;
T) homedir = '.' ; testing = 1 ;;
u) baseurl = " ${ OPTARG } " ;;
2019-04-08 05:05:08 -05:00
U) user = " ${ OPTARG } " ;;
2019-02-18 07:56:39 -06:00
v) set -x ;;
*) usage; exit 1 ;;
esac
done
# Ensure work directories live
if [ $( echo " $homedir " | egrep -c '^/' ) -ne 1 ] ; then
homedir = " ${ PWD } / ${ homedir } "
fi
srcdir = " ${ homedir } /src" && mkdir -p " ${ srcdir } "
pkgdir = " ${ homedir } /pkg" && mkdir -p " ${ pkgdir } "
2019-04-08 05:05:08 -05:00
webdir = " $pkgdir "
webfile = " $webdir " /index.html
2019-02-18 07:56:39 -06:00
# For each repo listed at the CGIT URL and conf file
cwd = " $( pwd ) "
SeedWebFile
for aninixrepo in ` wget -q -O - " $baseurl " | grep toplevel-repo | cut -f 4 -d \' | sed "s#^# $baseurl #" ` ; do
BuildRepo " $aninixrepo "
if [ ! -z " $testing " ] ; then break; fi
done
for repo in ` cat " $aurconf " ` ; do
2019-04-08 05:05:08 -05:00
BuildRepo " $repo " ;
2019-02-18 07:56:39 -06:00
if [ ! -z " $testing " ] ; then break; fi
done
UpdateLocalRepo
runtime = $(( ` date +%s` - $starttime ))
# Update stats
failcount = $( grep -c " $failCell " " $webfile " )
warncount = $( grep -c " $warnCell " " $webfile " )
passcount = $( grep -v " $failCell " " $webfile " | grep -c " $passCell " )
UpdateWebFile
# Exit