changeset 223:c3544e9fd588 feature_20

* Some work on managing ownerships etc for doc extraction
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Tue, 15 Feb 2011 16:58:46 +0000
parents 292cde42265a
children 4d438600f46b
files extra/soundsoftware/extract-docs.sh extra/soundsoftware/extract-doxygen.sh extra/soundsoftware/extract-javadoc.sh
diffstat 3 files changed, 85 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/extra/soundsoftware/extract-docs.sh	Fri Feb 11 16:21:55 2011 +0000
+++ b/extra/soundsoftware/extract-docs.sh	Tue Feb 15 16:58:46 2011 +0000
@@ -7,6 +7,9 @@
 
 hgdir="/var/hg"
 docdir="/var/doc"
+logfile="/var/www/test-cannam/log/extract-docs.log"
+
+redgrp="redmine"
 
 apikey=""
 apihost=""
@@ -32,64 +35,107 @@
 {
     p="$1"
     if [ -n "$apiuser" ]; then
-	curl -u "$apiuser":"$apipass" "http://$apihost/sys/projects/$p/embedded.xml?enable=1&key=$apikey" -d ""
+	sudo -u docgen curl -u "$apiuser":"$apipass" "http://$apihost/sys/projects/$p/embedded.xml?enable=1&key=$apikey" -d ""
     else
-	curl "http://$apihost/sys/projects/$p/embedded.xml?enable=1&key=$apikey" -d ""
+	sudo -u docgen curl "http://$apihost/sys/projects/$p/embedded.xml?enable=1&key=$apikey" -d ""
     fi
 }
 
+# We want to ensure the doc extraction is done by the unprivileged
+# user docgen, which is not a member of any interesting group
+# 
+# To this end, we create the tmpdir with user docgen and group
+# www-data, and use the www-data user to pull out an archive of the Hg
+# repo tip into a location beneath that, before using the docgen user
+# to extract docs from that location and write them into the tmpdir
+
+# Same tmpdir for each project: we delete and recreate to avoid
+# cleanup duty from lots of directories being created
+#
+tmpdir=$(mktemp -d "$docdir/tmp_XXXXXX")
+
+fail()
+{
+    message="$1"
+    echo "$message" 1>&2
+    case "$tmpdir" in
+	*/tmp*) rm -rf "$tmpdir";;
+	*);;
+    esac
+    exit 1
+}
+
+case "$tmpdir" in
+    /*) ;;
+    *) fail "Temporary directory creation failed";;
+esac
+
+chown docgen.www-data "$tmpdir" || fail "Temporary directory ownership change failed"
+chmod g+rwx "$tmpdir" || fail "Temporary directory permissions change failed"
+
 for projectdir in "$hgdir"/* ; do
 
     if [ -d "$projectdir" ] && [ -d "$projectdir/.hg" ]; then
 
+	if ! sudo -u www-data hg -R "$projectdir" -q update; then
+	    echo "Failed to update Hg in $projectdir, skipping" 1>&2
+	    continue
+	fi
+
 	project=$(basename "$projectdir")
-	echo "Found Hg repo: $projectdir for project $project"
 
- ##!!! do as www-data:
-	( cd "$projectdir" ; sudo -u www-data hg -q update ) || exit 1
+	tmptargetdir="$tmpdir/doc"
+	snapshotdir="$tmpdir/hgsnapshot"
 
-	tmpdir=$(mktemp -d "$docdir/tmp_XXXXXX")
-	
-	case "$tmpdir" in
-	    /*) ;;
-	    *) echo "Temporary directory creation failed"; exit 1;;
-	esac
+	rm -rf "$tmptargetdir" "$snapshotdir"
+
+	mkdir -m 770 "$tmptargetdir" || fail "Snapshot directory creation failed"
+	chown docgen.www-data "$tmptargetdir" || fail "Snapshot directory ownership change failed"
+
+	mkdir -m 770 "$snapshotdir" || fail "Snapshot directory creation failed"
+	chown docgen.www-data "$snapshotdir" || fail "Snapshot directory ownership change failed"
+
+	hgparents=$(sudo -u www-data hg -R "$projectdir" parents)
+	if [ -z "$hgparents" ]; then
+	    echo "Hg repo at $projectdir has no working copy (empty repo?), skipping"
+	    continue
+	else
+	    echo "Found non-empty Hg repo: $projectdir for project $project"
+	fi
+
+	if ! sudo -u www-data hg -R "$projectdir" archive -r tip -t files "$snapshotdir"; then
+	    echo "Failed to pick archive from $projectdir, skipping" 1>&2
+	    continue
+	fi
 
 	targetdir="$docdir/$project"
 
-	echo "Temporary dir is $tmpdir, eventual target is $targetdir"
+	echo "Temporary dir is $tmpdir, temporary doc dir is $tmptargetdir, snapshot dir is $snapshotdir, eventual target is $targetdir"
 
- ##!!! do as docs user:
 	for x in $types; do
-	    if "$progdir/extract-$x.sh" "$project" "$tmpdir"; then
-		break
-	    else
+	    if ! sudo -u docgen "$progdir/extract-$x.sh" "$project" "$snapshotdir" "$tmptargetdir" >> "$logfile" 2>&1; then
 		echo "Failed to extract via type $x"
 	    fi
 	done
 
-        if [ -f "$tmpdir/index.html" ]; then
+        if [ -f "$tmptargetdir/index.html" ]; then
 	    echo "Processing resulted in an index.html being created, looks good!"
 	    if [ ! -d "$targetdir" ] || [ ! -f "$targetdir/index.html" ]; then
-# # If we have just written something to a doc directory that was
-# # previously empty, we should switch on Embedded for this project
-		echo "This project hasn't had doc extracted before -- I should switch on Embedded for it at this point"
+		echo "This project hasn't had doc extracted before: enabling Embedded"
 		enable_embedded "$project"
 	    fi
 
 	    if [ -d "$targetdir" ]; then
 		mv "$targetdir" "$targetdir"_"$$" && \
-		    mv "$tmpdir" "$targetdir" && \
+		    mv "$tmptargetdir" "$targetdir" && \
 		    rm -rf "$targetdir"_"$$"
+		chgrp -R "$redgrp" "$targetdir"
 	    else 
-		echo "Processing resulted in no index.html, skipping"
-		mv "$tmpdir" "$targetdir"
+		mv "$tmptargetdir" "$targetdir"
+		chgrp -R "$redgrp" "$targetdir"
 	    fi
-
-	else
-	    # generated nothing (useful)
-	    rm -rf "$tmpdir"
 	fi
     fi
 done
 
+rm -rf "$tmpdir"
--- a/extra/soundsoftware/extract-doxygen.sh	Fri Feb 11 16:21:55 2011 +0000
+++ b/extra/soundsoftware/extract-doxygen.sh	Tue Feb 15 16:58:46 2011 +0000
@@ -1,20 +1,18 @@
 #!/bin/bash
 
-hgdir="/var/hg"
 docdir="/var/doc"
 
 project="$1"
-targetdir="$2"
+projectdir="$2"
+targetdir="$3"
 
-projectdir="$hgdir/$project"
-
-if [ -z "$project" ] || [ -z "$targetdir" ]; then
-    echo "Usage: $0 <project> <targetdir>"
+if [ -z "$project" ] || [ -z "$targetdir" ] || [ -z "$projectdir" ]; then
+    echo "Usage: $0 <project> <projectdir> <targetdir>"
     exit 2
 fi
 
-if [ ! -d "$projectdir" ] || [ ! -d "$projectdir/.hg" ]; then
-    echo "No hg repo found at $projectdir"
+if [ ! -d "$projectdir" ]; then
+    echo "Project directory $projectdir not found"
     exit 1
 fi
 
--- a/extra/soundsoftware/extract-javadoc.sh	Fri Feb 11 16:21:55 2011 +0000
+++ b/extra/soundsoftware/extract-javadoc.sh	Tue Feb 15 16:58:46 2011 +0000
@@ -1,20 +1,18 @@
 #!/bin/bash
 
-hgdir="/var/hg"
 docdir="/var/doc"
 
 project="$1"
-targetdir="$2"
+projectdir="$2"
+targetdir="$3"
 
-projectdir="$hgdir/$project"
-
-if [ -z "$project" ] || [ -z "$targetdir" ]; then
-    echo "Usage: $0 <project> <targetdir>"
+if [ -z "$project" ] || [ -z "$targetdir" ] || [ -z "$projectdir" ]; then
+    echo "Usage: $0 <project> <projectdir> <targetdir>"
     exit 2
 fi
 
-if [ ! -d "$projectdir" ] || [ ! -d "$projectdir/.hg" ]; then
-    echo "No hg repo found at $projectdir"
+if [ ! -d "$projectdir" ]; then
+    echo "Project directory $projectdir not found"
     exit 1
 fi