diff --git a/.gitignore b/.gitignore index f35b614..088a994 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,10 @@ -src/ -web/ +# Testing outputs +src/HelloWorld +src/HelloWorld/** +src/ascii-invaders +src/ascii-invaders/** pkg/ testing.log -*.pkg.tar.xz + +# Packaging outputs +*.pkg.tar.zst diff --git a/MaatIcon.png b/MaatIcon.png new file mode 100644 index 0000000..62aa986 Binary files /dev/null and b/MaatIcon.png differ diff --git a/Makefile b/Makefile index 0805b2f..f8d061d 100644 --- a/Makefile +++ b/Makefile @@ -1,24 +1,27 @@ installDir = ${pkgdir}/usr/local/bin -list = ./maat-builder -systemdList = ./maat-builder.timer ./maat-builder.service +list = ./maat +systemdList = ./maat.timer ./maat.service serverRoot = /srv/maat/ -owner=root +owner=maat perms=0755 fileperms=0644 compile: /bin/bash @echo Nothing to compile. -install: ${list} +install: ${list} MaatIcon.png mkdir -p ${installDir} mkdir -p ${pkgdir}${serverRoot}/src mkdir -p ${pkgdir}${serverRoot}/pkg + install -m ${fileperms} -o ${owner} ./MaatIcon.png ${pkgdir}${serverRoot}/pkg mkdir -p ${pkgdir}/usr/lib/systemd/system - for i in ${list}; do install -m ${perms} -o ${owner} $$i ${installDir}; done + for i in ${list}; do install -m ${perms} -o root $$i ${installDir}; done + install -m ${perms} -o ${owner} -d ${pkgdir}/usr/local/etc/Maat/ + touch ${pkgdir}/usr/local/etc/Maat/aur.list; chown ${owner} ${pkgdir}/usr/local/etc/Maat/aur.list; chmod ${fileperms} ${pkgdir}/usr/local/etc/Maat/aur.list for i in ${systemdList}; do install -m 0644 -o root $$i ${pkgdir}/usr/lib/systemd/system; done clean: - cat .gitignore | xargs rm -Rf + cat .gitignore | sudo xargs rm -Rf uninstall: for i in ${list}; do rm -Rf ${installDir}/$$i; done @@ -27,31 +30,32 @@ uninstall: rmdir -p ${pkgdir}${serverRoot}/pkg test: clean - ./maat-builder -T + sudo ./maat -u $$USER -T test -d src - test -d src/cower - test -d src/cower/.git + test -d src/ascii-invaders + test -d src/ascii-invaders/.git test -d src/HelloWorld test -d src/HelloWorld/.git test -d pkg test -d pkg/aur test -f pkg/AniNIX.db test -f pkg/AniNIX.db.sig - test -f pkg/helloworld*.tar.xz + test -f pkg/HelloWorld*.tar.zst test -f pkg/aur/aur.db test -f pkg/aur/aur.db.sig - test -f pkg/aur/cower*.tar.xz + test -f pkg/aur/ascii-invaders*.tar.zst [ `wc -l pkg/index.html | cut -f 1 -d ' '` -eq 24 ] + make clean @echo @echo Tests passed successfully. diff: - for i in ${list}; do if [ -f ${installDir}/$$i ]; then diff "$$i" "${installDir}/$$i"; fi done + for i in ${list}; do if [ -f ${installDir}/$$i ]; then diff "$$i" "${installDir}/$$i"; fi done reverse: - for i in ${list}; do if [ -f ${installDir}/$$i ]; then cp "${installDir}/$$i" "$$i"; fi done + for i in ${list}; do if [ -f ${installDir}/$$i ]; then cp "${installDir}/$$i" "$$i"; fi done checkperm: chown -R ${owner}: ${pkgdir}${serverRoot}/src chown -R ${owner}: ${pkgdir}${serverRoot}/pkg - for i in ${list}; do chown -R ${owner}: "${installDir}/$$i"; chmod ${perms} "${installDir}/$$i"; done + for i in ${list}; do chown -R ${owner}: "${installDir}/$$i"; sudo chmod ${perms} "${installDir}/$$i"; done diff --git a/PKGBUILD b/PKGBUILD index 5f7f2b4..73f9e26 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -19,7 +19,7 @@ conflicts=() replaces=("${pkgname,,}", "aninix-${pkgname,,}") backup=() options=() -install= +install=install changelog= source=() noextract=() @@ -28,7 +28,7 @@ validpgpkeys=() prepare() { git pull - make -C .. test + make -C .. test && make -C .. clean } build() { diff --git a/install b/install new file mode 100644 index 0000000..455adf7 --- /dev/null +++ b/install @@ -0,0 +1,9 @@ +pre_install() { + groupadd maat &>/dev/null + useradd -g maat -d /srv/maat -s /bin/false maat &> /dev/null + chown -R maat:maat /srv/maat &> /dev/null +} + +pre_remove() { + getent passwd maat &>/dev/null && userdel maat &> /dev/null +} diff --git a/maat-builder b/maat similarity index 67% rename from maat-builder rename to maat index c8d1d26..11f8e03 100755 --- a/maat-builder +++ b/maat @@ -9,7 +9,11 @@ # Copyright: WTFPL # # Author: DarkFeather -# +# + +# Arch keys to look for +pkgExt=".pkg.tar.zst" +deprivuser="maat" ### Printing defaults passCell="PASS"; @@ -30,11 +34,11 @@ function Usage() { ### Put the initial content in the webfile function SeedWebFile() { - printf '\n\nAniNIX/Maat -- Build Results\n\n\n\n\n\n\n\n

AniNIX/Maat -- Build Status

\nWEBSTATSGOHERE\n

AnINIX Packages

\n

These are packages written by the AniNIX. Their source is in AniNIX/Foundation.

\n' > "$webfile" + printf '\n\nAniNIX/Maat -- Build Results\n\n\n\n\n\n\n\n

AniNIX/Maat -- Build Status

\nWEBSTATSGOHERE\n

AnINIX Packages

\n

These are packages written by the AniNIX. Their source is in AniNIX/Foundation.

\n' > "$webfile" printf "$tableHead" >> "$webfile" } -### Update the webfile to close up table tags and add stats. +### Update the webfile to close up table tags and add stats. function UpdateWebFile() { sed -i "s#WEBSTATSGOHERE#

These are the AniNIX testing results. We found $passcount passing and $failcount failing packages, with $warncount warnings. It took $runtime seconds to finish.

#" "$webfile" printf '\n\n\n' >> "$webfile" @@ -43,21 +47,23 @@ function UpdateWebFile() { ### Build the package. Assumes a PKGBUILD is resent in the repo. # param suffix: where to store the final package -function BuildPackage() { +function BuildPackage() { suffix="$1" [ `pgrep -afc pacman` -eq 0 ] && rm -Rf /var/lib/pacman/db.lck - nice -n 10 timeout --preserve-status 20m sudo -u "depriv" /usr/sbin/makepkg -sfc --noconfirm --sign &>> "$pkgdir"/"$repodir".txt + nice -n 10 timeout --preserve-status 60m sudo -u "$deprivuser" /usr/sbin/makepkg -sfc --noconfirm --sign &>> "$pkgdir"/"$repodir".txt if [ $? -ne 0 ]; then # Build failed. - printf "$failCell""$warnCell" >> "$webfile" + printf "$failCell""$warnCell" >> "$webfile" else # Build passed. printf "$passCell""" >> "$webfile" # List passing versions - for pkg in `find . -type f | egrep ".pkg.tar.xz$"`; do + for pkg in `find . -type f | grep -E "${pkgExt}""\$"`; do printf "$pkg
" >> "$webfile" - mv "$pkg" "$pkgdir"/"$suffix"; - mv "$pkg"".sig" "$pkgdir"/"$suffix"; + pkgname="$(basename "$pkg" | cut -f 1 -d '.' | sed 's/-[[:digit:]]\+$//')" + find "${pkgdir}/${suffix}/" -name "${pkgname}-[0-9]*" -exec rm {} \; + mv "$pkg" "$pkgdir"/"$suffix"; + mv "$pkg"".sig" "$pkgdir"/"$suffix"; done printf "" >> "$webfile" fi @@ -76,20 +82,27 @@ function BuildRepo() { if [ ! -d "$repodir" ]; then git clone "$repo" fi - cd "$repodir" + cd "$repodir" git reset --hard origin &>/dev/null output="$(git pull 2>&1)" - chown -R "depriv": . - + if [ -n "$incremental" ] && [ $( echo "$output" | grep -c 'Already up to date.' ) -eq 1 ]; then + return; + fi + + chown -R "$deprivuser": . echo "$output" > "$pkgdir"/"$repodir".txt # Find the PKGBuilds in the repo for pkgbuild in `find . -type f -name PKGBUILD`; do cd "$(dirname "$pkgbuild")" # Tell the status file about it. printf ''"$repodir -- $pkgbuild"'' >> "$webfile" - if [ -f Makefile ] && [ `egrep -c '^test:' Makefile` -ge 1 ]; then + if [ -f Makefile ] && [ `grep -E -c '^test:' Makefile` -ge 1 ]; then + # Have to try to install dependencies first + for dep in $(grep makedepends PKGBUILD | cut -f 2 -d '(' | cut -f 1 -d ')' | sed "s/'//g"); do + pacman -Sy "$dep" --noconfirm --needed + done # Check test status. - timeout --preserve-status "$timeout" sudo -u "depriv" /bin/bash -l -c 'make test' &>> "$pkgdir"/"$repodir".txt + timeout --preserve-status "$timeout" sudo -u "$deprivuser" /bin/bash -l -c "cd $PWD; make test" &>> "$pkgdir"/"$repodir".txt if [ $? -ne 0 ]; then # Testing failed. printf "$failCell""$warnCell""$warnCell" >> "$webfile" @@ -98,7 +111,7 @@ function BuildRepo() { printf "$passCell" >> "$webfile" BuildPackage "$suffix" fi - else + else # Can't test -- usually from non-AniNIX repos. printf "$warnCell" >> "$webfile" BuildPackage "$suffix" @@ -108,26 +121,26 @@ function BuildRepo() { cd "$cwd" if [ ! -z "$testing" ]; then break; fi done - cd "$cwd" + cd "$cwd" } -### Update the local repo -function UpdateLocalRepo() { +### Update the local repo +function UpdateLocalRepo() { set -x - cd "$pkgdir" - chown -R "depriv": . + cd "$pkgdir" + chown -R "$deprivuser": . # TODO Add deduplication of updated files -- keep latest 3 versions. - rm -Rf AniNIX.[db,files]* - sudo -u "depriv" repo-add --sign ./AniNIX.db.tar.xz `ls -1 *".pkg.tar.xz"` + rm -Rf AniNIX.[db,files]* + sudo -u "$deprivuser" repo-add --sign ./AniNIX.db.tar.zst `ls -1 *"${pkgExt}"` cd aur/ rm -Rf aur.[db,files]* - sudo -u "depriv" repo-add --sign ./aur.db.tar.xz `ls -1 *".pkg.tar.xz"` + sudo -u "$deprivuser" repo-add --sign ./aur.db.tar.zst `ls -1 *"${pkgExt}"` set +x } # Clear variables aurconf='/usr/local/etc/Maat/aur.list' -baseurl='https://foundation.aninix.net/AniNIX' +baseurl='https://aninix.net/AniNIX' homedir="/srv/maat/" unset incremental unset skipPatching @@ -138,7 +151,7 @@ timeout="90s" starttime=`date +%s` # Parse arguments -while getopts 'b:c:hil:st:Tv' OPTION; do +while getopts 'b:c:hil:st:Tu:v' OPTION; do case "${OPTION}" in b) homedir="${OPTARG}" ;; c) aurconf="${OPTARG}" ;; @@ -147,15 +160,17 @@ while getopts 'b:c:hil:st:Tv' OPTION; do l) cmdstring="$0"; for arg in $@; do if [ "$arg" != "-l" ] && [ "$arg" != "${OPTARG}" ]; then cmdstring="$cmdstring \"${arg}\""; fi; done; exec /bin/bash -c "$cmdstring | tee -a \"${OPTARG}\""; ;; s) skipPatching=1 ;; t) timeout="${OPTARG}" ;; - T) export MAATTESTINGVAR=1; exec $0 -l ./testing.log -v -s -c <(echo https://aur.archlinux.org/cower.git) -b . ;; + T) export MAATTESTINGVAR=1; exec $0 -l ./testing.log -u "$deprivuser" -v -s -c <(echo https://aur.archlinux.org/ascii-invaders.git) -b . ;; + u) deprivuser="${OPTARG}" ;; v) set -x ;; *) usage; exit 1 ;; esac done # Ensure we are up to date -- otherwise, building is not a good plan. -if [ -x `which pacman` ] && [ -z "$skipPatching" ]; then - pacman -Syu --noconfirm; +if [ -x `which pacman` ] && [ -z "$skipPatching" ]; then + pacman -Sc --noconfirm + pacman -Syu --noconfirm if [ $? -ne 0 ]; then echo "Self patching failed -- please investigate!" 1>&2 exit 1 @@ -163,7 +178,7 @@ if [ -x `which pacman` ] && [ -z "$skipPatching" ]; then fi # Ensure work directories live -if [ $( echo "$homedir" | egrep -c '^/') -ne 1 ]; then +if [ $( echo "$homedir" | grep -E -c '^/') -ne 1 ]; then homedir="${PWD}/${homedir}" fi @@ -190,7 +205,7 @@ printf "$tableHead" >> "$webfile" # Build AUR for repo in `cat "$aurconf"`; do - BuildRepo "$repo" aur/; + BuildRepo "$repo" aur; if [ ! -z "$MAATTESTINGVAR" ]; then break; fi done diff --git a/maat-builder.service b/maat.service similarity index 72% rename from maat-builder.service rename to maat.service index c9fae1b..49c0a55 100644 --- a/maat-builder.service +++ b/maat.service @@ -1,10 +1,10 @@ [Unit] -Description=AniNIX::Maat \\ Builder Service +Description=AniNIX/Maat | Builder Service ConditionPathExists=|!/srv/maat/pkg/.lock [Service] ExecStartPre=/usr/sbin/mkdir /srv/maat/pkg/.lock -ExecStart=/usr/local/bin/maat-builder +ExecStart=/usr/local/bin/maat ExecStopPost=/usr/sbin/rmdir /srv/maat/pkg/.lock Type=oneshot RemainAfterExit=no diff --git a/maat-builder.timer b/maat.timer similarity index 70% rename from maat-builder.timer rename to maat.timer index 442b015..936e5fb 100644 --- a/maat-builder.timer +++ b/maat.timer @@ -1,5 +1,5 @@ [Unit] -Description=AniNIX::Maat \\ Builder Timer +Description=AniNIX/Maat | Builder Timer [Timer] OnCalendar=daily