comparison extra/soundsoftware/extract-docs.sh @ 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 5b028aef59a7
comparison
equal deleted inserted replaced
218:292cde42265a 223:c3544e9fd588
5 # Enumerate Hg repos; make sure they're up to date; extract docs for 5 # Enumerate Hg repos; make sure they're up to date; extract docs for
6 # each 6 # each
7 7
8 hgdir="/var/hg" 8 hgdir="/var/hg"
9 docdir="/var/doc" 9 docdir="/var/doc"
10 logfile="/var/www/test-cannam/log/extract-docs.log"
11
12 redgrp="redmine"
10 13
11 apikey="" 14 apikey=""
12 apihost="" 15 apihost=""
13 apiuser="" 16 apiuser=""
14 apipass="" 17 apipass=""
30 33
31 enable_embedded() 34 enable_embedded()
32 { 35 {
33 p="$1" 36 p="$1"
34 if [ -n "$apiuser" ]; then 37 if [ -n "$apiuser" ]; then
35 curl -u "$apiuser":"$apipass" "http://$apihost/sys/projects/$p/embedded.xml?enable=1&key=$apikey" -d "" 38 sudo -u docgen curl -u "$apiuser":"$apipass" "http://$apihost/sys/projects/$p/embedded.xml?enable=1&key=$apikey" -d ""
36 else 39 else
37 curl "http://$apihost/sys/projects/$p/embedded.xml?enable=1&key=$apikey" -d "" 40 sudo -u docgen curl "http://$apihost/sys/projects/$p/embedded.xml?enable=1&key=$apikey" -d ""
38 fi 41 fi
39 } 42 }
43
44 # We want to ensure the doc extraction is done by the unprivileged
45 # user docgen, which is not a member of any interesting group
46 #
47 # To this end, we create the tmpdir with user docgen and group
48 # www-data, and use the www-data user to pull out an archive of the Hg
49 # repo tip into a location beneath that, before using the docgen user
50 # to extract docs from that location and write them into the tmpdir
51
52 # Same tmpdir for each project: we delete and recreate to avoid
53 # cleanup duty from lots of directories being created
54 #
55 tmpdir=$(mktemp -d "$docdir/tmp_XXXXXX")
56
57 fail()
58 {
59 message="$1"
60 echo "$message" 1>&2
61 case "$tmpdir" in
62 */tmp*) rm -rf "$tmpdir";;
63 *);;
64 esac
65 exit 1
66 }
67
68 case "$tmpdir" in
69 /*) ;;
70 *) fail "Temporary directory creation failed";;
71 esac
72
73 chown docgen.www-data "$tmpdir" || fail "Temporary directory ownership change failed"
74 chmod g+rwx "$tmpdir" || fail "Temporary directory permissions change failed"
40 75
41 for projectdir in "$hgdir"/* ; do 76 for projectdir in "$hgdir"/* ; do
42 77
43 if [ -d "$projectdir" ] && [ -d "$projectdir/.hg" ]; then 78 if [ -d "$projectdir" ] && [ -d "$projectdir/.hg" ]; then
44 79
80 if ! sudo -u www-data hg -R "$projectdir" -q update; then
81 echo "Failed to update Hg in $projectdir, skipping" 1>&2
82 continue
83 fi
84
45 project=$(basename "$projectdir") 85 project=$(basename "$projectdir")
46 echo "Found Hg repo: $projectdir for project $project"
47 86
48 ##!!! do as www-data: 87 tmptargetdir="$tmpdir/doc"
49 ( cd "$projectdir" ; sudo -u www-data hg -q update ) || exit 1 88 snapshotdir="$tmpdir/hgsnapshot"
50 89
51 tmpdir=$(mktemp -d "$docdir/tmp_XXXXXX") 90 rm -rf "$tmptargetdir" "$snapshotdir"
52 91
53 case "$tmpdir" in 92 mkdir -m 770 "$tmptargetdir" || fail "Snapshot directory creation failed"
54 /*) ;; 93 chown docgen.www-data "$tmptargetdir" || fail "Snapshot directory ownership change failed"
55 *) echo "Temporary directory creation failed"; exit 1;; 94
56 esac 95 mkdir -m 770 "$snapshotdir" || fail "Snapshot directory creation failed"
96 chown docgen.www-data "$snapshotdir" || fail "Snapshot directory ownership change failed"
97
98 hgparents=$(sudo -u www-data hg -R "$projectdir" parents)
99 if [ -z "$hgparents" ]; then
100 echo "Hg repo at $projectdir has no working copy (empty repo?), skipping"
101 continue
102 else
103 echo "Found non-empty Hg repo: $projectdir for project $project"
104 fi
105
106 if ! sudo -u www-data hg -R "$projectdir" archive -r tip -t files "$snapshotdir"; then
107 echo "Failed to pick archive from $projectdir, skipping" 1>&2
108 continue
109 fi
57 110
58 targetdir="$docdir/$project" 111 targetdir="$docdir/$project"
59 112
60 echo "Temporary dir is $tmpdir, eventual target is $targetdir" 113 echo "Temporary dir is $tmpdir, temporary doc dir is $tmptargetdir, snapshot dir is $snapshotdir, eventual target is $targetdir"
61 114
62 ##!!! do as docs user:
63 for x in $types; do 115 for x in $types; do
64 if "$progdir/extract-$x.sh" "$project" "$tmpdir"; then 116 if ! sudo -u docgen "$progdir/extract-$x.sh" "$project" "$snapshotdir" "$tmptargetdir" >> "$logfile" 2>&1; then
65 break
66 else
67 echo "Failed to extract via type $x" 117 echo "Failed to extract via type $x"
68 fi 118 fi
69 done 119 done
70 120
71 if [ -f "$tmpdir/index.html" ]; then 121 if [ -f "$tmptargetdir/index.html" ]; then
72 echo "Processing resulted in an index.html being created, looks good!" 122 echo "Processing resulted in an index.html being created, looks good!"
73 if [ ! -d "$targetdir" ] || [ ! -f "$targetdir/index.html" ]; then 123 if [ ! -d "$targetdir" ] || [ ! -f "$targetdir/index.html" ]; then
74 # # If we have just written something to a doc directory that was 124 echo "This project hasn't had doc extracted before: enabling Embedded"
75 # # previously empty, we should switch on Embedded for this project
76 echo "This project hasn't had doc extracted before -- I should switch on Embedded for it at this point"
77 enable_embedded "$project" 125 enable_embedded "$project"
78 fi 126 fi
79 127
80 if [ -d "$targetdir" ]; then 128 if [ -d "$targetdir" ]; then
81 mv "$targetdir" "$targetdir"_"$$" && \ 129 mv "$targetdir" "$targetdir"_"$$" && \
82 mv "$tmpdir" "$targetdir" && \ 130 mv "$tmptargetdir" "$targetdir" && \
83 rm -rf "$targetdir"_"$$" 131 rm -rf "$targetdir"_"$$"
132 chgrp -R "$redgrp" "$targetdir"
84 else 133 else
85 echo "Processing resulted in no index.html, skipping" 134 mv "$tmptargetdir" "$targetdir"
86 mv "$tmpdir" "$targetdir" 135 chgrp -R "$redgrp" "$targetdir"
87 fi 136 fi
88
89 else
90 # generated nothing (useful)
91 rm -rf "$tmpdir"
92 fi 137 fi
93 fi 138 fi
94 done 139 done
95 140
141 rm -rf "$tmpdir"