Mercurial > hg > soundsoftware-site
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" |