rev |
line source |
pankso@5
|
1 #!/bin/sh
|
pankso@5
|
2 #
|
pankso@5
|
3 # SliTaz Cooker CGI/web interface.
|
pankso@5
|
4 #
|
pankso@5
|
5
|
pascal@810
|
6 . /usr/lib/slitaz/httphelper.sh
|
pascal@810
|
7
|
pankso@5
|
8 [ -f "/etc/slitaz/cook.conf" ] && . /etc/slitaz/cook.conf
|
pankso@5
|
9 [ -f "cook.conf" ] && . ./cook.conf
|
pankso@5
|
10
|
pankso@5
|
11 # The same wok as cook.
|
pankso@5
|
12 wok="$WOK"
|
pankso@5
|
13
|
pankso@5
|
14 # Cooker DB files.
|
pankso@5
|
15 activity="$CACHE/activity"
|
pankso@5
|
16 commits="$CACHE/commits"
|
pankso@5
|
17 cooklist="$CACHE/cooklist"
|
pankso@5
|
18 cookorder="$CACHE/cookorder"
|
al@865
|
19 command="$CACHE/command"; touch $command
|
pankso@5
|
20 blocked="$CACHE/blocked"
|
pankso@5
|
21 broken="$CACHE/broken"
|
pankso@22
|
22 cooknotes="$CACHE/cooknotes"
|
pascal@753
|
23 cooktime="$CACHE/cooktime"
|
pankso@164
|
24 wokrev="$CACHE/wokrev"
|
pankso@5
|
25
|
al@893
|
26 # Path to markdown to html convertor
|
al@893
|
27 if [ -n "$(which cmark 2>/dev/null)" ]; then
|
al@894
|
28 md2html="$(which cmark) --smart -e table -e strikethrough -e autolink -e tagfilter"
|
al@893
|
29 elif [ -x "./cmark" ]; then
|
al@894
|
30 md2html="./cmark --smart -e table -e strikethrough -e autolink -e tagfilter"
|
al@893
|
31 elif [ -n "$(which sundown 2>/dev/null)" ]; then
|
al@893
|
32 md2html=$(which sundown)
|
al@891
|
33 elif [ -x "./sundown" ]; then
|
al@893
|
34 md2html="./sundown"
|
al@891
|
35 fi
|
al@891
|
36
|
paul@256
|
37 # We're not logged and want time zone to display correct server date.
|
pankso@249
|
38 export TZ=$(cat /etc/TZ)
|
pankso@249
|
39
|
al@893
|
40
|
al@893
|
41 # HTML page header. Pages can be customized with a separated header.html file
|
al@893
|
42
|
al@893
|
43 page_header() {
|
al@893
|
44 echo -e 'Content-Type: text/html; charset=UTF-8\n'
|
al@893
|
45 if [ -f "header.html" ]; then
|
al@893
|
46 cat header.html
|
al@893
|
47 else
|
al@893
|
48 cat <<EOT
|
al@893
|
49 <!DOCTYPE html>
|
al@893
|
50 <html lang="en">
|
al@893
|
51 <head>
|
al@893
|
52 <meta charset="UTF-8">
|
al@893
|
53 <meta name="viewport" content="width=device-width, initial-scale=1.0">
|
al@893
|
54 <title>SliTaz Cooker</title>
|
al@893
|
55 <link rel="shortcut icon" href="favicon.ico">
|
al@893
|
56 <link rel="stylesheet" href="style.css">
|
al@893
|
57 <script src="prism.js"></script>
|
al@893
|
58 <link rel="stylesheet" href="prism.css">
|
al@893
|
59 <link rel="alternate" type="application/rss+xml" title="Cooker Feed" href="?rss">
|
al@893
|
60 <meta name="robots" content="nofollow">
|
al@893
|
61 </head>
|
al@893
|
62 <body>
|
al@893
|
63
|
al@893
|
64 <div id="header">
|
al@893
|
65 <div id="logo"></div>
|
al@893
|
66 <h1><a href="cooker.cgi">SliTaz Cooker</a></h1>
|
al@893
|
67 </div>
|
al@893
|
68 EOT
|
al@893
|
69 fi
|
al@893
|
70 }
|
al@893
|
71
|
al@893
|
72
|
al@893
|
73 # HTML page footer. Pages can be customized with a separated footer.html file
|
al@893
|
74
|
al@893
|
75 page_footer() {
|
al@893
|
76 if [ -f "footer.html" ]; then
|
al@893
|
77 cat footer.html
|
al@893
|
78 else
|
al@893
|
79 cat <<EOT
|
al@893
|
80 </div>
|
al@893
|
81
|
al@893
|
82 <div id="footer">
|
al@893
|
83 <a href="http://www.slitaz.org/">SliTaz Website</a>
|
al@893
|
84 <a href="cooker.cgi">Cooker</a>
|
al@893
|
85 <a href="doc/cookutils/cookutils.html">Documentation</a>
|
al@893
|
86 </div>
|
al@893
|
87
|
al@893
|
88 </body>
|
al@893
|
89 </html>
|
al@893
|
90 EOT
|
al@893
|
91 fi
|
al@893
|
92 }
|
al@893
|
93
|
al@893
|
94
|
al@893
|
95 not_found() {
|
al@893
|
96 local file="${1#$PKGS/}"; file="${file#$LOGS/}"; file="${file#$WOK/}"
|
al@893
|
97 echo "HTTP/1.1 404 Not Found"
|
al@893
|
98 page_header
|
al@893
|
99 echo "<div id='content'><h2>Not Found</h2>"
|
al@893
|
100 case $2 in
|
al@893
|
101 pkg)
|
al@893
|
102 echo "<p>The requested package <b>$(basename "$(dirname "$file")")</b> was not found on this server.</p>" ;;
|
al@893
|
103 *)
|
al@893
|
104 echo "<p>The requested file <b>$file</b> was not found on this server.</p>" ;;
|
al@893
|
105 esac
|
al@893
|
106 page_footer
|
al@893
|
107 }
|
al@893
|
108
|
al@893
|
109
|
al@893
|
110 manage_modified() {
|
al@893
|
111 local file="$1" option="$2" nul day mon year time hh mm ss date_s
|
al@893
|
112 if [ ! -f "$file" ]; then
|
al@893
|
113 if [ "$option" == 'silently-absent' ]; then
|
al@893
|
114 echo "HTTP/1.1 404 Not Found"
|
al@893
|
115 return
|
al@893
|
116 else
|
al@893
|
117 not_found "$file" "$2"
|
al@893
|
118 exit
|
al@893
|
119 fi
|
al@893
|
120 fi
|
al@893
|
121 [ "$option" == 'no-last-modified' ] && return
|
al@893
|
122 if [ -n "$HTTP_IF_MODIFIED_SINCE" ]; then
|
al@893
|
123 echo "$HTTP_IF_MODIFIED_SINCE" | \
|
al@893
|
124 while read nul day mon year time nul; do
|
al@893
|
125 case $mon in
|
al@893
|
126 Jan) mon='01';; Feb) mon='02';; Mar) mon='03';; Apr) mon='04';;
|
al@893
|
127 May) mon='05';; Jun) mon='06';; Jul) mon='07';; Aug) mon='08';;
|
al@893
|
128 Sep) mon='09';; Oct) mon='10';; Nov) mon='11';; Dec) mon='12';;
|
al@893
|
129 esac
|
al@893
|
130 hh=$(echo $time | cut -d: -f1)
|
al@893
|
131 mm=$(echo $time | cut -d: -f2)
|
al@893
|
132 ss=$(echo $time | cut -d: -f3)
|
al@893
|
133 date_s=$(date -ud "$year$mon$day$hh$mm.$ss" +%s)
|
al@894
|
134 # if [ "$date_s" -ge "$(date -ur "$file" +%s)" ]; then
|
al@894
|
135 # echo -e 'HTTP/1.1 304 Not Modified\n'
|
al@894
|
136 # exit
|
al@894
|
137 # fi
|
al@894
|
138 # TODO: improve caching control
|
al@893
|
139 done
|
al@893
|
140 fi
|
al@893
|
141 echo "Last-Modified: $(date -Rur "$file" | sed 's|UTC|GMT|')"
|
al@894
|
142 echo "Cache-Control: public, max-age=3600"
|
al@893
|
143 }
|
al@893
|
144
|
al@893
|
145
|
pascal@778
|
146 case "$QUERY_STRING" in
|
al@891
|
147 recook=*)
|
al@891
|
148 case "$HTTP_USER_AGENT" in
|
al@891
|
149 *SliTaz*)
|
al@894
|
150 grep -qs "^$(GET recook)$" $CACHE/recook-packages ||
|
al@894
|
151 echo "$(GET recook)" >> $CACHE/recook-packages
|
al@891
|
152 esac
|
al@893
|
153 echo -e "Location: ${HTTP_REFERER:-${REQUEST_URI%\?*}}\n"
|
al@891
|
154 exit
|
al@891
|
155 ;;
|
al@891
|
156
|
al@891
|
157 poke)
|
al@891
|
158 touch $CACHE/cooker-request
|
al@893
|
159 echo -e "Location: ${HTTP_REFERER:-${REQUEST_URI%\?*}}\n"
|
al@891
|
160 exit
|
al@891
|
161 ;;
|
al@891
|
162
|
al@891
|
163 src*)
|
al@894
|
164 file=$(busybox httpd -d "$SRC/$(GET src)")
|
al@893
|
165 manage_modified "$file"
|
al@893
|
166 content_type='application/octet-stream'
|
al@893
|
167 case $file in
|
al@893
|
168 *.tar.gz) content_type='application/x-compressed-tar' ;;
|
al@893
|
169 *.tar.bz2) content_type='application/x-bzip-compressed-tar' ;;
|
al@893
|
170 *.tar.xz) content_type='application/x-xz-compressed-tar' ;;
|
al@893
|
171 *.tar.lzma) content_type='application/x-lzma-compressed-tar' ;;
|
al@893
|
172 *.zip) content_type='application/zip' ;;
|
al@893
|
173 esac
|
al@893
|
174 echo "Content-Type: $content_type"
|
al@893
|
175 echo "Content-Length: $(stat -c %s "$file")"
|
al@894
|
176 filename=$(basename "$file")
|
al@894
|
177 echo "Content-Disposition: attachment; filename=\"$filename\"" # Note, no conversion '+' -> '%2B' here
|
al@893
|
178 echo
|
pascal@822
|
179
|
al@891
|
180 cat "$file"
|
al@891
|
181 exit
|
al@891
|
182 ;;
|
pascal@354
|
183
|
al@891
|
184 download*)
|
al@894
|
185 file="$PKGS/$(GET download)"
|
al@893
|
186 manage_modified "$file"
|
al@891
|
187 content_type='application/octet-stream'
|
al@891
|
188 case $file in
|
al@891
|
189 *.txt|*.conf|*/README|*/receipt)
|
al@891
|
190 content_type='text/plain; charset=UTF-8' ;;
|
al@891
|
191 *.css) content_type='text/css; charset=UTF-8' ;;
|
al@891
|
192 *.htm|*.html) content_type='text/html; charset=UTF-8' ;;
|
al@891
|
193 *.js) content_type='application/javascript; charset=UTF-8' ;;
|
al@891
|
194 *.desktop) content_type='application/x-desktop; charset=UTF-8' ;;
|
al@891
|
195 *.png) content_type='image/png' ;;
|
al@893
|
196 *.gif) content_type='image/gif' ;;
|
al@891
|
197 *.svg) content_type='image/svg+xml' ;;
|
al@891
|
198 *.jpg|*.jpeg) content_type='image/jpeg' ;;
|
al@891
|
199 *.sh|*.cgi) content_type='application/x-shellscript' ;;
|
al@891
|
200 *.gz) content_type='application/gzip' ;;
|
al@891
|
201 *.ico) content_type='image/vnd.microsoft.icon' ;;
|
al@893
|
202 *.tazpkg) content_type='application/x-tazpkg' ;;
|
al@891
|
203 esac
|
al@893
|
204
|
al@891
|
205 echo "Content-Type: $content_type"
|
al@891
|
206 echo "Content-Length: $(stat -c %s "$file")"
|
al@894
|
207 filename=$(basename "$file")
|
al@894
|
208 echo "Content-Disposition: inline; filename=\"$filename\"" # Note, no conversion '+' -> '%2B' here
|
al@891
|
209 echo
|
pascal@778
|
210
|
al@891
|
211 cat "$file"
|
al@891
|
212 exit
|
al@891
|
213 ;;
|
al@891
|
214
|
al@891
|
215 rss)
|
al@891
|
216 echo -e 'Content-Type: application/rss+xml\n'
|
al@891
|
217 ;;
|
al@891
|
218
|
al@893
|
219 stuff*)
|
al@894
|
220 file="$wok/$(GET stuff)"
|
al@893
|
221 manage_modified "$file"
|
al@893
|
222 ;;
|
al@893
|
223
|
al@893
|
224 pkg=*|receipt=*|description=*|files=*|log=*|man=*|doc=*|info=*)
|
al@893
|
225 type=${QUERY_STRING%%=*}
|
al@893
|
226 pkg=$(GET $type)
|
al@893
|
227 case "$type" in
|
al@893
|
228 description)
|
al@893
|
229 manage_modified "$wok/$pkg/receipt" 'no-last-modified'
|
al@893
|
230 manage_modified "$wok/$pkg/description.txt" 'silently-absent'
|
al@893
|
231 ;;
|
al@893
|
232 log)
|
al@893
|
233 manage_modified "$wok/${pkg%%.log*}/receipt" 'no-last-modified'
|
al@893
|
234 manage_modified "$LOGS/$pkg"
|
al@893
|
235 ;;
|
al@893
|
236 *)
|
al@893
|
237 manage_modified "$wok/$pkg/receipt" pkg
|
al@893
|
238 ;;
|
al@893
|
239 esac
|
al@891
|
240 ;;
|
al@891
|
241
|
pascal@778
|
242 esac
|
pascal@778
|
243
|
pankso@5
|
244
|
pankso@310
|
245 # RSS feed generator
|
al@728
|
246 if [ "$QUERY_STRING" == 'rss' ]; then
|
al@695
|
247 pubdate=$(date -R)
|
al@728
|
248 cat <<EOT
|
pankso@310
|
249 <?xml version="1.0" encoding="utf-8" ?>
|
al@695
|
250 <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
pankso@310
|
251 <channel>
|
pankso@310
|
252 <title>SliTaz Cooker</title>
|
pankso@310
|
253 <description>The SliTaz packages cooker feed</description>
|
pankso@310
|
254 <link>$COOKER_URL</link>
|
pascal@618
|
255 <lastBuildDate>$pubdate</lastBuildDate>
|
pascal@618
|
256 <pubDate>$pubdate</pubDate>
|
pascal@810
|
257 <atom:link href="http://cook.slitaz.org/?rss" rel="self" type="application/rss+xml" />
|
pankso@310
|
258 EOT
|
al@728
|
259 for rss in $(ls -lt $FEEDS/*.xml | head -n 12); do
|
al@695
|
260 cat $rss | sed 's|<guid|& isPermaLink="false"|g;s|</pubDate| GMT&|g'
|
pankso@310
|
261 done
|
al@728
|
262 cat <<EOT
|
pankso@310
|
263 </channel>
|
pankso@310
|
264 </rss>
|
pankso@310
|
265 EOT
|
pankso@310
|
266 exit 0
|
pankso@310
|
267 fi
|
pankso@310
|
268
|
al@728
|
269
|
pascal@354
|
270 #
|
pascal@354
|
271 # Functions
|
pascal@354
|
272 #
|
pascal@354
|
273
|
al@728
|
274
|
al@848
|
275 # Unpack to stdout
|
pascal@810
|
276
|
pascal@810
|
277 docat() {
|
pascal@810
|
278 case "$1" in
|
al@848
|
279 *gz) zcat ;;
|
al@848
|
280 *bz2) bzcat ;;
|
al@848
|
281 *xz) xzcat ;;
|
al@848
|
282 *) cat
|
pascal@810
|
283 esac < $1
|
pascal@810
|
284 }
|
pascal@810
|
285
|
pascal@810
|
286
|
pascal@815
|
287 # Tiny texinfo browser
|
pascal@815
|
288
|
pascal@815
|
289 info2html() {
|
pascal@816
|
290 sed \
|
al@894
|
291 -e 's|&|\&|g; s|<|\<|g; s|>|\>|g' \
|
pascal@816
|
292 -e 's|^\* \(.*\)::|* <a href="#\1">\1</a> |' \
|
pascal@816
|
293 -e 's|\*note \(.*\)::|<a href="#\1">\1</a>|' \
|
al@894
|
294 -e '/^File: / s|(dir)|Top|g' \
|
al@894
|
295 -e '/^File: / s|Next: \([^,]*\)|<a class="button" href="#\1">Next: \1</a>|' \
|
al@894
|
296 -e '/^File: / s|Prev: \([^,]*\)|<a class="button" href="#\1">Prev: \1</a>|' \
|
al@894
|
297 -e '/^File: / s|Up: \([^,]*\)|<a class="button" href="#\1">Up: \1</a>|' \
|
al@894
|
298 -e '/^File: / s|^.* Node: \([^,]*\), *\(.*\)$|<pre id="\1">\2|' \
|
al@894
|
299 -e '/^<pre id=/ s|^\([^>]*>\)\(<a[^>]*>Next: [^,]*\), *\(<a[^>]*>Prev: [^,]*\), *\(<a[^>]*>Up: .*\)|\1 \3 \4 \2|' \
|
pascal@816
|
300 -e '/^Tag Table:$/,/^End Tag Table$/d' \
|
pascal@816
|
301 -e '/INFO-DIR/,/^END-INFO-DIR/d' \
|
al@894
|
302 -e "s|https*://[^>),'\"\`’ ]*|<a href=\"&\">&</a>|g" \
|
al@867
|
303 -e "s|ftp://[^>),\"\` ]*|<a href=\"&\">&</a>|g" \
|
al@894
|
304 -e 's|^\* Menu:|<b>Menu:</b>|' \
|
al@894
|
305 -e "s|^|</pre>|"
|
pascal@815
|
306 }
|
pascal@815
|
307
|
pascal@815
|
308
|
pankso@5
|
309 # Put some colors in log and DB files.
|
al@728
|
310
|
pankso@5
|
311 syntax_highlighter() {
|
pankso@17
|
312 case $1 in
|
pankso@17
|
313 log)
|
al@804
|
314 # If variables not defined - define them with some rare values
|
al@804
|
315 : ${_src=#_#_#}
|
al@804
|
316 : ${_install=#_#_#}
|
al@804
|
317 : ${_fs=#_#_#}
|
al@804
|
318 : ${_stuff=#_#_#}
|
al@848
|
319 sed -e 's/&/\&/g; s/</\</g; s/>/\>/g' \
|
pascal@601
|
320 -e 's#OK$#<span class="span-ok">OK</span>#g' \
|
pascal@535
|
321 -e 's#Done$#<span class="span-ok">Done</span>#g' \
|
al@858
|
322 -e 's#done$#<span class="span-ok">done</span>#g' \
|
al@858
|
323 -e 's#\([^a-z]\)ok$#\1<span class="span-ok">ok</span>#g' \
|
al@858
|
324 -e 's#\([^a-z]\)yes$#\1<span class="span-ok">yes</span>#g' \
|
al@858
|
325 -e 's#\([^a-z]\)no$#\1<span class="span-no">no</span>#g' \
|
al@858
|
326 \
|
al@858
|
327 -e 's#\( \[Y[nm/]\?\] n\)$# <span class="span-no">\1</span>#g' \
|
al@858
|
328 -e 's#\( \[N[ym/]\?\] y\)$# <span class="span-ok">\1</span>#g' \
|
al@858
|
329 -e 's#(NEW) $#<span class="span-red">(NEW) </span>#g' \
|
al@858
|
330 \
|
al@867
|
331 -e 's#.*(pkg/local).*#<span class="span-ok">\0</span>#g' \
|
al@867
|
332 -e 's#.*(web/cache).*#<span class="span-no">\0</span>#g' \
|
al@867
|
333 \
|
pankso@129
|
334 -e 's#error$#<span class="span-red">error</span>#g' \
|
pankso@129
|
335 -e 's#ERROR:#<span class="span-red">ERROR:</span>#g' \
|
al@858
|
336 -e 's#Error#<span class="span-red">Error</span>#g' \
|
al@858
|
337 \
|
al@858
|
338 -e 's#^.*[Ff]ailed.*#<span class="span-red">\0</span>#g' \
|
al@858
|
339 -e 's#^.*[Ff]atal.*#<span class="span-red">\0</span>#g' \
|
al@858
|
340 -e 's#^.*[Nn]ot found.*#<span class="span-red">\0</span>#g' \
|
al@858
|
341 -e 's#^.*[Nn]o such file.*#<span class="span-red">\0</span>#g' \
|
al@858
|
342 \
|
pankso@129
|
343 -e 's#WARNING:#<span class="span-red">WARNING:</span>#g' \
|
al@858
|
344 -e 's#warning:#<span class="span-no">warning:</span>#g' \
|
al@858
|
345 -e 's#error:#<span class="span-no">error:</span>#g' \
|
al@858
|
346 -e 's#missing#<span class="span-no">missing</span>#g' \
|
al@858
|
347 \
|
al@858
|
348 -e 's#^.* will not .*#<span class="span-no">\0</span>#' \
|
al@858
|
349 -e 's!^Hunk .* succeeded at .*!<span class="span-no">\0</span>!' \
|
al@858
|
350 -e 's#^.* Warning: .*#<span class="span-no">\0</span>#' \
|
al@858
|
351 \
|
al@858
|
352 -e "s#^Executing:\([^']*\).#<span class='sh-val'>\0</span>#" \
|
al@858
|
353 -e "s#^Making.*#<span class='sh-val'>\0</span>#" \
|
al@848
|
354 -e "s#^====\([^']*\).#<span class='span-line'>\0</span>#g" \
|
al@848
|
355 -e "s#^[a-zA-Z0-9]\([^']*\) :: #<span class='span-sky'>\0</span>#g" \
|
al@848
|
356 -e "s#ftp://[^ '\"]*#<a href='\0'>\0</a>#g" \
|
al@848
|
357 -e "s#http://[^ '\"]*#<a href='\0'>\0</a>#g" \
|
al@848
|
358 -e "s|$_src|<span class='var'>\${src}</span>|g;
|
al@848
|
359 s|$_install|<span class='var'>\${install}</span>|g;
|
al@848
|
360 s|$_fs|<span class='var'>\${fs}</span>|g;
|
al@848
|
361 s|$_stuff|<span class='var'>\${stuff}</span>|g" \
|
al@848
|
362 -e "s|\[91m|<span style='color: #F00'>|;
|
al@848
|
363 s|\[92m|<span style='color: #080'>|;
|
al@848
|
364 s|\[93m|<span style='color: #FF0'>|;
|
al@848
|
365 s|\[94m|<span style='color: #00F'>|;
|
al@848
|
366 s|\[95m|<span style='color: #808'>|;
|
al@891
|
367 s|\[96m|<span style='color: #088'>|;
|
al@848
|
368 s|\[39m|</span>|;"
|
al@891
|
369 ;;
|
al@891
|
370
|
al@891
|
371 files)
|
al@891
|
372 sed \
|
al@891
|
373 -e "s|\[[01];31m|<span style='color: #F00'>|g;
|
al@891
|
374 s|\[[01];32m|<span style='color: #080'>|g;
|
al@891
|
375 s|\[[01];33m|<span style='color: #FF0'>|g;
|
al@891
|
376 s|\[[01];34m|<span style='color: #00F'>|g;
|
al@891
|
377 s|\[[01];35m|<span style='color: #808'>|g;
|
al@891
|
378 s|\[[01];36m|<span style='color: #088'>|g;
|
al@891
|
379 s|\[[01];0m|<span style='color: #333'>|g;
|
al@891
|
380 s|\[0m|</span>|g;"
|
al@891
|
381 ;;
|
al@728
|
382
|
pankso@129
|
383 activity)
|
al@891
|
384 sed s"#^\([^']* : \)#<span class='log-date'>\0</span>#"g
|
al@891
|
385 ;;
|
pankso@17
|
386 esac
|
pankso@5
|
387 }
|
pankso@5
|
388
|
al@728
|
389
|
al@893
|
390 show_code() {
|
al@893
|
391 echo "<pre><code class=\"language-$1\">"
|
al@893
|
392 sed 's|&|\&|g; s|<|\<|g; s|>|\>|g'
|
al@893
|
393 echo '</code></pre>'
|
al@893
|
394 }
|
al@893
|
395
|
al@893
|
396
|
pankso@5
|
397 # Latest build pkgs.
|
al@728
|
398
|
pankso@5
|
399 list_packages() {
|
pankso@5
|
400 cd $PKGS
|
al@862
|
401 ls -1t *.tazpkg | head -n 20 | \
|
al@728
|
402 while read file; do
|
al@891
|
403 echo -n $(TZ=UTC stat -c '%y' $PKGS/$file | cut -d. -f1 | sed s/:[0-9]*$//)
|
pankso@5
|
404 echo " : $file"
|
pankso@5
|
405 done
|
pankso@5
|
406 }
|
pankso@5
|
407
|
al@728
|
408
|
pascal@605
|
409 # Optional full list button
|
al@728
|
410
|
pascal@605
|
411 more_button() {
|
al@891
|
412 [ $(wc -l < ${3:-$CACHE/$1}) -gt ${4:-12} ] &&
|
al@891
|
413 echo "<a class='button r' href='?file=$1'>$2</a>"
|
pascal@605
|
414 }
|
pascal@605
|
415
|
al@728
|
416
|
pascal@751
|
417 # Show the running command and its progression
|
pascal@751
|
418
|
al@891
|
419 running_command() {
|
pascal@751
|
420 local state="Not running"
|
pascal@751
|
421 if [ -s "$command" ]; then
|
pascal@751
|
422 state="$(cat $command)"
|
pascal@824
|
423 set -- $(grep "^$state" $cooktime)
|
al@891
|
424 if [ -n "$1" ]; then
|
pascal@751
|
425 state="$state $((($(date +%s)-$3)*100/$2))%"
|
pascal@787
|
426 [ $2 -gt 300 ] && state="$state (should end $(date -u -d @$(($2+$3))))"
|
pascal@751
|
427 fi
|
pascal@751
|
428 fi
|
pascal@751
|
429 echo $state
|
pascal@751
|
430 }
|
pascal@751
|
431
|
pascal@751
|
432
|
al@891
|
433 datalist() {
|
al@891
|
434 (
|
al@891
|
435 cd $wok
|
al@891
|
436
|
al@891
|
437 ls | awk '
|
al@891
|
438 BEGIN{printf("<datalist id=\"packages\">")}
|
al@891
|
439 {printf("<option>%s</option>",$1)}
|
al@891
|
440 END {printf("</datalist>")}
|
al@891
|
441 '
|
al@891
|
442 )
|
al@891
|
443 }
|
al@891
|
444
|
al@891
|
445
|
al@891
|
446 summary() {
|
al@891
|
447 log="$1"
|
al@891
|
448 pkg="$(basename ${log%%.log*})"
|
al@891
|
449 if [ -f "$log" ]; then
|
al@891
|
450 if grep -q "cook:$pkg$" $command; then
|
al@891
|
451 echo "<pre>The Cooker is currently building: $pkg</pre>"
|
al@891
|
452 fi
|
al@891
|
453 if fgrep -q "Summary for:" $log; then
|
al@891
|
454 echo "<pre>"
|
al@891
|
455 sed '/^Summary for:/,$!d' $log | sed /^$/d | syntax_highlighter log
|
al@891
|
456 echo "</pre>"
|
al@891
|
457 fi
|
al@891
|
458
|
al@891
|
459 if fgrep -q "Debug information" $log; then
|
al@891
|
460 echo '<pre>'
|
al@891
|
461 sed '/^Debug information/,$!d' $log | sed /^$/d | \
|
al@891
|
462 if [ -n "$2" ]; then
|
al@891
|
463 syntax_highlighter log | \
|
al@892
|
464 sed 's|\([0-9][0-9]*\):|<a href="#l\1">\1</a>:|'
|
al@891
|
465 else
|
al@891
|
466 sed 's|^[0-9][0-9]*:||' | syntax_highlighter log
|
al@891
|
467 fi
|
al@891
|
468 echo '</pre>'
|
al@891
|
469 fi
|
al@891
|
470 else
|
al@891
|
471 [ -n "$pkg" -a -d "$wok/$pkg" ] && echo "<pre>No log for $pkg</pre>"
|
al@891
|
472 fi
|
al@891
|
473 }
|
al@891
|
474
|
al@891
|
475
|
al@891
|
476 pkg_info() {
|
al@891
|
477 local log cmd active bpkg
|
al@891
|
478 log=$LOGS/$pkg.log
|
al@891
|
479 cmd=${QUERY_STRING%%=*}
|
al@891
|
480 echo '<div id="info">'
|
al@891
|
481 active=''; [ "$cmd" == 'receipt' -o "$cmd" == 'stuff' ] && active=' active'
|
al@894
|
482 echo "<a class='button green$active' href='?receipt=${pkg//+/%2B}'>receipt & stuff</a>"
|
al@891
|
483
|
al@891
|
484 unset WEB_SITE WANTED
|
al@891
|
485 bpkg=$pkg
|
al@891
|
486 . $wok/$pkg/receipt
|
al@891
|
487
|
al@891
|
488 [ -n "$WANTED" ] && bpkg="${WANTED%% *}" # see locale-* with multiple WANTED
|
al@891
|
489
|
al@891
|
490 [ -n "$WEB_SITE" ] &&
|
al@891
|
491 echo "<a class='button sky' href='$WEB_SITE'>web site</a>"
|
al@891
|
492
|
al@891
|
493 if [ -f "$wok/$pkg/taz/$PACKAGE-$VERSION/receipt" ]; then
|
al@891
|
494 active=''; [ "$cmd" == 'files' ] && active=' active'
|
al@894
|
495 echo "<a class='button khaki$active' href='?files=${pkg//+/%2B}'>files</a>"
|
al@891
|
496
|
al@891
|
497 unset EXTRAVERSION
|
al@891
|
498 . $wok/$pkg/taz/$PACKAGE-$VERSION/receipt
|
al@891
|
499
|
al@891
|
500 if [ -f $wok/$pkg/taz/$PACKAGE-$VERSION/description.txt ]; then
|
al@891
|
501 active=''; [ "$cmd" == 'description' ] && active=' active'
|
al@894
|
502 echo "<a class='button brown$active' href='?description=${pkg//+/%2B}'>description</a>"
|
al@891
|
503 fi
|
al@891
|
504
|
al@891
|
505 if [ -f $PKGS/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg ]; then
|
al@894
|
506 echo "<a class='button gold' href='?download=${PACKAGE//+/%2B}-${VERSION//+/%2B}${EXTRAVERSION//+/%2B}.tazpkg'>download</a>"
|
al@891
|
507 fi
|
al@891
|
508
|
al@891
|
509 if [ -f $PKGS/$PACKAGE-$VERSION$EXTRAVERSION-$ARCH.tazpkg ]; then
|
al@894
|
510 echo "<a class='button gold' href='?download=${PACKAGE//+/%2B}-${VERSION//+/%2B}${EXTRAVERSION//+/%2B}-${ARCH//+/%2B}.tazpkg'>download</a>"
|
al@891
|
511 fi
|
al@891
|
512 fi
|
al@891
|
513
|
al@891
|
514 [ -n "$TARBALL" ] && [ -s "$SRC/$TARBALL" ] &&
|
al@894
|
515 echo "<a class='button yellow' href='?src=${TARBALL//+/%2B}'>source</a>"
|
al@891
|
516
|
al@891
|
517 [ -x ./man2html ] &&
|
al@891
|
518 if [ -d $wok/$bpkg/install/usr/man ] ||
|
al@891
|
519 [ -d $wok/$bpkg/install/usr/share/man ] ||
|
al@891
|
520 [ -d $wok/$bpkg/taz/*/fs/usr/man ] ||
|
al@891
|
521 [ -d $wok/$bpkg/taz/*/fs/usr/share/man ]; then
|
al@891
|
522 active=''; [ "$cmd" == 'man' ] && active=' active'
|
al@894
|
523 echo "<a class='button plum$active' href='?man=${bpkg//+/%2B}'>man</a>"
|
al@891
|
524 fi
|
al@891
|
525
|
al@891
|
526 if [ -d $wok/$bpkg/install/usr/doc ] ||
|
al@891
|
527 [ -d $wok/$bpkg/install/usr/share/doc ] ||
|
al@891
|
528 [ -d $wok/$bpkg/taz/*/fs/usr/doc ] ||
|
al@891
|
529 [ -d $wok/$bpkg/taz/*/fs/usr/share/doc ]; then
|
al@891
|
530 active=''; [ "$cmd" == 'doc' ] && active=' active'
|
al@894
|
531 echo "<a class='button plum$active' href='?doc=${bpkg//+/%2B}'>doc</a>"
|
al@891
|
532 fi
|
al@891
|
533
|
al@891
|
534 if [ -d $wok/$bpkg/install/usr/info ] ||
|
al@891
|
535 [ -d $wok/$bpkg/install/usr/share/info ] ||
|
al@891
|
536 [ -d $wok/$bpkg/taz/*/fs/usr/info ] ||
|
al@891
|
537 [ -d $wok/$bpkg/taz/*/fs/usr/share/info ]; then
|
al@891
|
538 active=''; [ "$cmd" == 'info' ] && active=' active'
|
al@894
|
539 echo "<a class='button plum$active' href='?info=${bpkg//+/%2B}#Top'>info</a>"
|
al@891
|
540 fi
|
al@891
|
541
|
al@891
|
542 [ -n "$(echo $REQUEST_URI | sed 's|/[^/]*?pkg.*||')" ] ||
|
al@894
|
543 echo "<a class='button' href='ftp://${HTTP_HOST%:*}/${pkg//+/%2B}/'>browse</a>"
|
al@891
|
544
|
al@891
|
545 if [ -s "$log" ]; then
|
al@891
|
546 active=''; [ "$cmd" == 'log' ] && active=' active'
|
al@894
|
547 echo "<a class='button gray$active' href='?log=${pkg//+/%2B}.log'>logs</a>"
|
al@891
|
548 fi
|
al@891
|
549
|
al@891
|
550 echo '</div>'
|
al@891
|
551 }
|
al@891
|
552
|
al@891
|
553
|
al@891
|
554
|
al@728
|
555
|
pankso@5
|
556 #
|
pankso@5
|
557 # Load requested page
|
pankso@5
|
558 #
|
pankso@5
|
559
|
al@893
|
560 page_header
|
al@893
|
561
|
pankso@5
|
562 case "${QUERY_STRING}" in
|
pankso@16
|
563 pkg=*)
|
al@894
|
564 pkg=$(GET pkg)
|
pankso@16
|
565 log=$LOGS/$pkg.log
|
pankso@16
|
566
|
al@803
|
567 # Define cook variables for syntax highlighter
|
pascal@806
|
568 if [ -s "$WOK/$pkg/receipt" ]; then
|
pascal@806
|
569 . "$WOK/$pkg/receipt"
|
pascal@806
|
570 _wok='/home/slitaz/wok'
|
pascal@806
|
571 _src="$_wok/$pkg/source/$PACKAGE-$VERSION"
|
pascal@806
|
572 _install="$_wok/$pkg/install"
|
pascal@806
|
573 _fs="$_wok/$pkg/taz/$PACKAGE-$VERSION/fs"
|
pascal@806
|
574 _stuff="$_wok/$pkg/stuff"
|
pascal@806
|
575 fi
|
al@803
|
576
|
pankso@18
|
577 # Package info.
|
pankso@16
|
578 if [ -f "$wok/$pkg/receipt" ]; then
|
al@893
|
579 echo "<div id='content'>"
|
al@893
|
580 echo "<h2>Package: $pkg</h2>"
|
al@891
|
581 pkg_info
|
pankso@16
|
582 else
|
al@862
|
583 if [ $(ls $wok/*$pkg*/receipt 2>/dev/null | wc -l) -eq 0 ]; then
|
al@893
|
584 echo "<div id='content'><h2>Not Found</h2>"
|
al@893
|
585 echo "<p>The requested package <b>$pkg</b> was not found on this server.</p>"
|
pascal@703
|
586 else
|
al@893
|
587 echo "<div id='content'>"
|
pascal@703
|
588 ls $wok/$pkg/receipt >/dev/null 2>&1 || pkg="*$pkg*"
|
al@891
|
589 echo '<table class="zebra" style="width:100%">'
|
pascal@703
|
590 for i in $(cd $wok ; ls $pkg/receipt); do
|
pascal@703
|
591 pkg=$(dirname $i)
|
pascal@703
|
592 unset SHORT_DESC CATEGORY
|
pascal@703
|
593 . $wok/$pkg/receipt
|
pascal@703
|
594 cat <<EOT
|
pascal@703
|
595 <tr>
|
pascal@810
|
596 <td><a href="?pkg=$pkg">$pkg</a></td>
|
pascal@703
|
597 <td>$SHORT_DESC</td>
|
pascal@703
|
598 <td>$CATEGORY</td>
|
pascal@703
|
599 </tr>
|
pascal@704
|
600 EOT
|
pascal@703
|
601 done
|
pascal@703
|
602 echo '</table>'
|
pascal@703
|
603 unset pkg
|
pascal@703
|
604 fi
|
pankso@16
|
605 fi
|
pankso@16
|
606
|
paul@62
|
607 # Check for a log file and display summary if it exists.
|
al@891
|
608 summary "$log"
|
al@893
|
609
|
al@893
|
610 # Display <Recook> button only for SliTaz web browser
|
pankso@16
|
611 if [ -f "$log" ]; then
|
pascal@796
|
612 case "$HTTP_USER_AGENT" in
|
al@891
|
613 *SliTaz*)
|
al@891
|
614 [ -f $CACHE/cooker-request ] && [ -n "$HTTP_REFERER" ] &&
|
al@891
|
615 echo "<a class=\"button\" href=\"?recook=$pkg\">Recook $pkg</a>"
|
al@891
|
616 ;;
|
pascal@796
|
617 esac
|
al@891
|
618 fi
|
al@891
|
619 ;;
|
al@728
|
620
|
pascal@819
|
621 log=*)
|
al@894
|
622 log=$(GET log)
|
al@891
|
623 logfile=$LOGS/$log
|
al@891
|
624 pkg=${log%.log*}
|
al@891
|
625 if [ -s "$logfile" ]; then
|
al@891
|
626 echo "<div id='content'>"
|
al@891
|
627
|
al@891
|
628 echo "<h2>Cook log $(stat -c %y $logfile | sed 's/:..\..*//')</h2>"
|
al@891
|
629 pkg_info
|
al@891
|
630
|
al@891
|
631 case $log in
|
al@891
|
632 *.log) baselog=$logfile ;;
|
al@891
|
633 *) baselog=${logfile%.*} ;;
|
al@891
|
634 esac
|
al@891
|
635 for i in $(ls -t $baselog $baselog.* 2>/dev/null); do
|
al@891
|
636 class=''; [ $i == $logfile ] && class=' gray'
|
al@894
|
637 j=$(basename "$i")
|
al@894
|
638 echo -n "<a class='button$class' href=\"?log=${j//+/%2B}\">"
|
al@891
|
639 echo "$(stat -c %y $i | cut -d: -f1,2)</a>"
|
al@891
|
640 done
|
al@891
|
641
|
al@891
|
642 summary "$logfile" links
|
al@891
|
643
|
al@891
|
644 cat $logfile | syntax_highlighter log | awk '
|
al@891
|
645 BEGIN { print "<pre class=\"log\">"; }
|
al@891
|
646 { printf("<a name=\"l%d\" href=\"#l%d\">%5d</a> %s\n", NR, NR, NR, $0); }
|
al@891
|
647 END { print "</pre>"; }
|
al@891
|
648 '
|
pascal@819
|
649 fi
|
pascal@819
|
650 ;;
|
al@891
|
651
|
pankso@65
|
652 file=*)
|
al@891
|
653 echo "<div id='content'>"
|
al@728
|
654 # Don't allow all files on the system for security reasons.
|
al@894
|
655 file=$(GET file)
|
pankso@65
|
656 case "$file" in
|
pankso@90
|
657 activity|cooknotes|cooklist)
|
pankso@91
|
658 [ "$file" == "cooklist" ] && \
|
pankso@93
|
659 nb="- Packages: $(cat $cooklist | wc -l)"
|
al@891
|
660 echo '<div id="content2">'
|
pankso@91
|
661 echo "<h2>DB: $file $nb</h2>"
|
al@891
|
662 echo '<ul class="activity">'
|
al@891
|
663 tac $CACHE/$file | syntax_highlighter activity | \
|
al@891
|
664 sed 's|^|<li>|; s|$|</li>|'
|
al@891
|
665 echo '</ul></div>'
|
al@891
|
666 ;;
|
al@728
|
667
|
pankso@66
|
668 broken)
|
al@891
|
669 nb=$(wc -l < $broken)
|
al@891
|
670 echo '<div id="content2">'
|
pankso@93
|
671 echo "<h2>DB: broken - Packages: $nb</h2>"
|
al@891
|
672 echo '<ul class="activity">'
|
pankso@129
|
673 cat $CACHE/$file | sort | \
|
al@891
|
674 sed "s#^[^']*#<a href='?pkg=\0'>\0</a>#g" | \
|
al@891
|
675 sed 's|^|<li>|; s|$|</li>|'
|
al@891
|
676 echo '</ul></div>'
|
al@891
|
677 ;;
|
al@728
|
678
|
pankso@65
|
679 *.log)
|
pankso@71
|
680 log=$LOGS/$file
|
pankso@71
|
681 name=$(basename $log)
|
pankso@65
|
682 echo "<h2>Log for: ${name%.log}</h2>"
|
pankso@71
|
683 if [ -f "$log" ]; then
|
pankso@71
|
684 if fgrep -q "Summary" $log; then
|
pankso@65
|
685 echo '<pre>'
|
pankso@73
|
686 grep -A 20 "^Summary" $log | sed /^$/d | \
|
pankso@65
|
687 syntax_highlighter log
|
pankso@65
|
688 echo '</pre>'
|
pankso@65
|
689 fi
|
pankso@65
|
690 echo '<pre>'
|
pankso@71
|
691 cat $log | syntax_highlighter log
|
pankso@65
|
692 echo '</pre>'
|
pankso@65
|
693 else
|
pankso@71
|
694 echo "<pre>No log file: $log</pre>"
|
al@891
|
695 fi
|
al@891
|
696 ;;
|
al@891
|
697 esac
|
al@891
|
698 ;;
|
al@728
|
699
|
pascal@509
|
700 stuff=*)
|
al@891
|
701 echo "<div id='content'>"
|
al@894
|
702 file=$(GET stuff)
|
al@891
|
703 pkg=${file%%/*}
|
al@891
|
704 if [ -f "$wok/$file" ]; then
|
al@891
|
705 echo "<h2>$file</h2>"
|
al@891
|
706 pkg_info
|
al@894
|
707 echo "<a class='button' href='?receipt=${pkg//+/%2B}'>receipt</a>"
|
al@891
|
708
|
al@891
|
709 ( cd $wok/$pkg ; find stuff -type f 2> /dev/null ) | sort | \
|
al@891
|
710 while read i ; do
|
al@891
|
711 class=''; [ "$pkg/$i" == "$file" ] && class=" green"
|
al@894
|
712 echo "<a class='button$class' href='?stuff=${pkg//+/%2B}/${i//+/%2B}'>$i</a>"
|
al@891
|
713 done
|
al@891
|
714
|
al@891
|
715 case $file in
|
al@893
|
716 *.desktop|*.theme) class="ini" ;;
|
al@891
|
717 *.patch|*.diff|*.u) class="diff" ;;
|
al@893
|
718 *.sh) class="bash" ;;
|
al@891
|
719 *.conf*)
|
al@891
|
720 class="bash"
|
al@891
|
721 [ -n "$(cut -c1 < $wok/$file | fgrep '[')" ] && class="ini"
|
al@891
|
722 ;;
|
al@891
|
723 *.pl) class="perl" ;;
|
al@891
|
724 *.c|*.h|*.awk) class="clike" ;;
|
al@891
|
725 *.svg) class="svg" ;;
|
al@891
|
726 *Makefile*) class="makefile" ;;
|
al@891
|
727 *.po|*.pot) class="bash" ;;
|
al@891
|
728 *.css) class="css" ;;
|
al@891
|
729 *.htm|*.html) class="html" ;;
|
al@891
|
730 *.js) class="js" ;;
|
al@891
|
731 *.txt) class="asciidoc" ;;
|
al@891
|
732 *)
|
al@891
|
733 case $(head -n1 $wok/$file) in
|
al@891
|
734 *!/bin/sh*|*!/bin/bash*) class="bash" ;;
|
al@891
|
735 esac
|
al@891
|
736 if [ -z "$class" -a "$(head -n1 $wok/$file | cut -b1)" == '#' ]; then
|
al@891
|
737 class="bash"
|
al@891
|
738 fi
|
al@891
|
739 if [ -z "$class" ]; then
|
al@891
|
740 # Follow Busybox restrictions. Search for non-printable chars
|
al@891
|
741 if [ $(tr -d '[:alnum:][:punct:][:blank:][:cntrl:]' < "$wok/$file" | wc -c) -gt 0 ]; then
|
al@891
|
742 raw="true"
|
al@891
|
743 fi
|
al@891
|
744 fi
|
al@891
|
745 ;;
|
al@891
|
746 esac
|
al@891
|
747
|
al@891
|
748 # Display image
|
al@891
|
749 case $file in
|
al@891
|
750 *.png|*.svg|*.jpg|*.jpeg|*.ico)
|
al@894
|
751 echo "<img src='?download=../wok/${file//+/%2B}' style='display: block; max-width: 100%; margin: auto'/>"
|
al@891
|
752 ;;
|
al@891
|
753 esac
|
al@891
|
754
|
al@893
|
755 # Display colored listing for all text-based documents (also for *.svg)
|
al@891
|
756 case $file in
|
al@891
|
757 *.png|*.jpg|*.jpeg|*.ico) ;;
|
al@891
|
758 *)
|
al@891
|
759 if [ -z "$raw" ]; then
|
al@893
|
760 cat $wok/$file | show_code $class
|
al@891
|
761 fi
|
al@891
|
762 ;;
|
al@891
|
763 esac
|
al@891
|
764
|
al@891
|
765 # Display hex dump for binary files
|
al@891
|
766 if [ -n "$raw" ]; then
|
al@893
|
767 hexdump -C $wok/$file | show_code $class
|
al@891
|
768 fi
|
al@891
|
769 else
|
al@891
|
770 echo "<pre>File '$file' absent!</pre>"
|
al@891
|
771 fi
|
al@891
|
772 ;;
|
al@728
|
773
|
pankso@16
|
774 receipt=*)
|
al@891
|
775 echo "<div id='content'>"
|
al@894
|
776 pkg=$(GET receipt)
|
al@893
|
777 echo "<h2>Receipt for: $pkg</h2>"
|
al@893
|
778 pkg_info
|
al@894
|
779 echo "<a class='button green' href='?receipt=${pkg//+/%2B}'>receipt</a>"
|
al@893
|
780 . $wok/$pkg/receipt
|
pascal@822
|
781
|
al@893
|
782 ( cd $wok/$pkg; find stuff -type f 2> /dev/null ) | sort | \
|
al@893
|
783 while read file; do
|
al@894
|
784 echo "<a class='button' href='?stuff=${pkg//+/%2B}/${file//+/%2B}'>$file</a>"
|
al@893
|
785 done | sort
|
al@893
|
786 cat $wok/$pkg/receipt | show_code bash
|
al@891
|
787 ;;
|
al@891
|
788
|
al@891
|
789 files=*)
|
al@891
|
790 echo "<div id='content'>"
|
al@894
|
791 pkg=$(GET files)
|
al@891
|
792 dir=$(ls -d $WOK/$pkg/taz/$pkg-* 2>/dev/null)
|
al@893
|
793 size=$(du -hs $dir/fs | awk '{ print $1 }')
|
al@893
|
794 echo "<h2>Files installed by the package \"$pkg\" ($size)</h2>"
|
al@893
|
795 pkg_info
|
al@891
|
796
|
al@893
|
797 echo '<pre class="files">'
|
al@891
|
798
|
al@893
|
799 find $dir/fs -not -type d -print0 | sort -z | \
|
al@893
|
800 xargs -0 ls -ld --color=always | \
|
al@893
|
801 syntax_highlighter files | \
|
al@894
|
802 sed "s|\([^/]*\)/.*\(${dir#*wok}/fs\)\([^<]*\)\(<.*\)$|\1<a href=\"?download=../wok\2\3\">\3</a>\4|" |\
|
al@894
|
803 awk '
|
al@894
|
804 BEGIN { FS="\""; }
|
al@894
|
805 { gsub("+", "%2B", $2); print; }
|
al@894
|
806 '
|
al@891
|
807
|
al@893
|
808 echo '</pre>'
|
al@891
|
809 ;;
|
al@728
|
810
|
pascal@490
|
811 description=*)
|
al@891
|
812 echo "<div id='content'>"
|
al@894
|
813 pkg=$(GET description)
|
al@891
|
814 dir=$(ls -d $WOK/$pkg/taz/$pkg-* 2>/dev/null)
|
al@893
|
815 echo "<h2>Description of $pkg</h2>"
|
al@893
|
816 pkg_info
|
pascal@493
|
817 if [ -s "$dir/description.txt" ]; then
|
al@893
|
818 if [ -n "$md2html" ]; then
|
al@891
|
819 echo '<div id="content2">'
|
al@893
|
820 $md2html $dir/description.txt
|
al@891
|
821 echo '</div>'
|
al@891
|
822 else
|
al@893
|
823 cat $dir/description.txt | show_code markdown
|
al@891
|
824 fi
|
pascal@490
|
825 else
|
al@893
|
826 echo "<pre>No description of $pkg</pre>"
|
al@891
|
827 fi
|
al@891
|
828 ;;
|
al@728
|
829
|
pascal@815
|
830 man=*|doc=*|info=*)
|
al@891
|
831 echo '<div id="content">'
|
pascal@810
|
832 type=${QUERY_STRING%%=*}
|
pascal@810
|
833 pkg=$(GET $type)
|
al@893
|
834 dir=$WOK/$pkg/install/usr/share/$type
|
al@893
|
835 [ -d $dir ] || dir=$WOK/$pkg/install/usr/$type
|
al@893
|
836 [ -d $dir ] || dir=$(echo $WOK/$pkg/taz/*/fs/usr/share/$type)
|
al@893
|
837 [ -d $dir ] || dir=$(echo $WOK/$pkg/taz/*/fs/usr/$type)
|
al@893
|
838 page=$(GET file)
|
al@893
|
839 if [ -z "$page" ]; then
|
al@893
|
840 page=$(find $dir -type f | sed q)
|
al@893
|
841 page=${page#$dir/}
|
al@893
|
842 fi
|
al@891
|
843
|
al@893
|
844 echo "<h2>$(basename $page)</h2>"
|
al@891
|
845
|
al@893
|
846 pkg_info
|
al@893
|
847 echo '<div style="max-height: 5em; overflow: auto">'
|
al@893
|
848 find $dir -type f | sort | while read i ; do
|
al@893
|
849 [ -s $i ] || continue
|
al@893
|
850 case "$i" in
|
al@893
|
851 *.jp*g|*.png|*.gif|*.svg|*.css) continue
|
al@893
|
852 esac
|
al@893
|
853 i=${i#$dir/}
|
al@893
|
854 class=''; [ "$page" == "$i" ] && class=" plum"
|
al@893
|
855 case "$type" in
|
al@893
|
856 man)
|
al@893
|
857 man=$(basename $i .gz)
|
al@893
|
858 echo "<a class='button$class' href='?$type=$pkg&file=$i'>${man%.*} (${man##*.})</a>"
|
al@893
|
859 ;;
|
al@893
|
860 info)
|
al@893
|
861 info=$(basename $i)
|
al@894
|
862 echo "<a class='button$class' href='?$type=$pkg&file=$i#Top'>${info/.info/}</a>"
|
al@893
|
863 ;;
|
al@893
|
864 *)
|
al@893
|
865 echo "<a class='button$class' href='?$type=$pkg&file=$i'>$(basename $i .gz)</a>"
|
al@893
|
866 ;;
|
al@893
|
867 esac
|
al@893
|
868 done
|
al@893
|
869 echo '</div>'
|
al@891
|
870
|
al@893
|
871 if [ -f "$dir/$page" ]; then
|
al@893
|
872 tmp="$(mktemp)"
|
al@893
|
873 docat "$dir/$page" > $tmp
|
al@893
|
874 [ -s "$tmp" ] &&
|
al@893
|
875 case "$type" in
|
al@893
|
876 info)
|
al@894
|
877 echo '<div id="content2" class="texinfo"><pre class="first">'
|
al@893
|
878 info2html < "$tmp"
|
al@893
|
879 echo '</pre></div>'
|
al@893
|
880 ;;
|
al@893
|
881 doc)
|
al@893
|
882 case "$page" in
|
al@893
|
883 *.sgml) class='xml';;
|
al@894
|
884 *.py) class='python';; # pycurl package
|
al@893
|
885 *) class='asciidoc';;
|
al@893
|
886 esac
|
al@893
|
887 case "$page" in
|
al@893
|
888 *.htm*)
|
al@893
|
889 echo '<div id="content2">'
|
al@893
|
890 cat
|
al@893
|
891 echo '</div>'
|
al@893
|
892 ;;
|
al@893
|
893 *)
|
al@893
|
894 show_code $class
|
al@893
|
895 ;;
|
al@893
|
896 esac < "$tmp"
|
al@893
|
897 ;;
|
al@893
|
898 man)
|
al@893
|
899 export TEXTDOMAIN='man2html'
|
al@893
|
900 echo "<div id='content2'>"
|
al@891
|
901
|
al@893
|
902 html=$(./man2html "$tmp" | sed -e '1,/<header>/d' \
|
al@893
|
903 -e 's|<a href="file:///[^>]*>\([^<]*\)</a>|\1|g' \
|
al@893
|
904 -e 's|<a href="?[1-9]\+[^>]*>\([^<]*\)</a>|\1|g')
|
al@891
|
905
|
al@893
|
906 if [ -n "$(echo "$html" | fgrep 'The requested file /tmp/tmp.')" ]; then
|
al@893
|
907 # Process the pre-formatted man-cat page
|
al@893
|
908 echo '<pre>'
|
al@893
|
909 sed '
|
al@893
|
910 s|M-bM-^@M-^S|—|g;
|
al@893
|
911 s|M-bM-^@M-^\\|<b>|g;
|
al@893
|
912 s|M-bM-^@M-^]|</b>|g
|
al@893
|
913 s|M-bM-^@M-^X|<u>|g;
|
al@893
|
914 s|M-bM-^@M-^Y|</u>|g;
|
al@893
|
915 s|M-BM-||g;
|
al@893
|
916 ' "$tmp"
|
al@893
|
917 echo '</pre>'
|
al@893
|
918 else
|
al@893
|
919 echo "$html"
|
al@893
|
920 fi
|
al@893
|
921 echo "</div>"
|
al@893
|
922 ;;
|
al@893
|
923 esac
|
al@893
|
924 rm -f $tmp
|
al@891
|
925 else
|
al@893
|
926 echo "<pre>File '$page' not exists!</pre>"
|
pascal@810
|
927 fi
|
pascal@810
|
928 ;;
|
al@891
|
929
|
pankso@5
|
930 *)
|
pankso@383
|
931 # We may have a toolchain.cgi script for cross cooker's
|
pankso@383
|
932 if [ -f "toolchain.cgi" ]; then
|
pankso@383
|
933 toolchain='toolchain.cgi'
|
pankso@383
|
934 else
|
pascal@810
|
935 toolchain='?pkg=slitaz-toolchain'
|
pankso@383
|
936 fi
|
pankso@383
|
937 # Main page with summary. Count only package include in ARCH,
|
pankso@679
|
938 # use 'cooker arch-db' to manually create arch.$ARCH files.
|
pankso@679
|
939 inwok=$(ls $WOK/*/arch.$ARCH | wc -l)
|
pankso@75
|
940 cooked=$(ls $PKGS/*.tazpkg | wc -l)
|
pankso@106
|
941 unbuilt=$(($inwok - $cooked))
|
pankso@245
|
942 pct=0
|
pankso@245
|
943 [ $inwok -gt 0 ] && pct=$(( ($cooked * 100) / $inwok ))
|
al@728
|
944 cat <<EOT
|
al@891
|
945 <div id="content2">
|
al@891
|
946
|
al@891
|
947 <form method="get" action="" class="r">
|
al@891
|
948 <input type="search" name="pkg" placeholder="Package" list="packages" autocorrect="off" autocapitalize="off"/>
|
al@891
|
949 </form>
|
pankso@5
|
950
|
pankso@5
|
951 <h2>Summary</h2>
|
pankso@75
|
952
|
al@891
|
953 <table>
|
al@891
|
954 <tr><td>Running command</td><td>: $(running_command)</td></tr>
|
al@891
|
955 <tr><td>Wok revision</td><td>: <a href="$WOK_URL">$(cat $wokrev)</a></td></tr>
|
al@891
|
956 <tr><td>Commits to cook</td><td>: $(wc -l < $commits)</td></tr>
|
al@891
|
957 <tr><td>Current cooklist</td><td>: $(wc -l < $cooklist)</td></tr>
|
al@891
|
958 <tr><td>Broken packages</td><td>: $(wc -l < $broken)</td></tr>
|
al@891
|
959 <tr><td>Blocked packages</td><td>: $(wc -l < $blocked)</td></tr>
|
al@891
|
960 <tr><td>Architecture</td><td>: $ARCH, <a href="$toolchain">toolchain</a></td></tr>
|
al@891
|
961 <tr><td>Server date</td><td>: $(date -u '+%F %R %Z')</td></tr>
|
al@891
|
962
|
al@891
|
963 </table>
|
pascal@805
|
964 EOT
|
al@891
|
965
|
pascal@805
|
966 [ -e $CACHE/cooker-request ] &&
|
al@891
|
967 [ $CACHE/activity -nt $CACHE/cooker-request ] &&
|
al@891
|
968 echo '<a class="button r" href="?poke">Poke cooker</a>'
|
al@891
|
969
|
pascal@805
|
970 cat <<EOT
|
al@891
|
971 <p class="info">Packages: $inwok in the wok · $cooked cooked · $unbuilt unbuilt</p>
|
al@891
|
972
|
pankso@75
|
973 <div class="pctbar">
|
pankso@75
|
974 <div class="pct" style="width: ${pct}%;">${pct}%</div>
|
pankso@14
|
975 </div>
|
pankso@14
|
976
|
pankso@75
|
977 <p>
|
al@891
|
978 Service logs:
|
al@891
|
979 <a href="?file=cookorder.log">cookorder</a> ·
|
al@891
|
980 <a href="?file=commits.log">commits</a> ·
|
al@891
|
981 <a href="?file=pkgdb.log">pkgdb</a><!-- ·
|
al@891
|
982 <a href="?file=installed.diff">installed.diff</a> -->
|
pankso@75
|
983 </p>
|
al@803
|
984
|
pascal@805
|
985 $(more_button activity "More activity" $CACHE/activity 12)
|
al@728
|
986 <h2 id="activity">Activity</h2>
|
al@891
|
987
|
al@891
|
988 <ul class="activity">
|
al@803
|
989 EOT
|
pankso@5
|
990
|
al@891
|
991 tac $CACHE/activity | head -n 12 | syntax_highlighter activity | \
|
al@894
|
992 sed 's|cooker.cgi||; s|^|<li>|; s|$|</li>|;'
|
al@891
|
993
|
al@891
|
994 echo '</ul>'
|
al@891
|
995
|
al@803
|
996 [ -s $cooknotes ] && cat <<EOT
|
pascal@805
|
997 $(more_button cooknotes "More notes" $cooknotes 12)
|
al@728
|
998 <h2 id="cooknotes">Cooknotes</h2>
|
pankso@23
|
999 <pre>
|
pankso@129
|
1000 $(tac $cooknotes | head -n 12 | syntax_highlighter activity)
|
pankso@23
|
1001 </pre>
|
al@803
|
1002 EOT
|
pankso@23
|
1003
|
al@803
|
1004 [ -s $commits ] && cat <<EOT
|
al@728
|
1005 <h2 id="commits">Commits</h2>
|
al@891
|
1006 <ul class="activity">
|
al@891
|
1007 $(sed 's|^|<li>|; s|$|</li>|' $commits)
|
al@891
|
1008 </ul>
|
al@803
|
1009 EOT
|
pankso@5
|
1010
|
al@803
|
1011 [ -s $cooklist ] && cat <<EOT
|
pascal@805
|
1012 $(more_button cooklist "Full cooklist" $cooklist 20)
|
al@728
|
1013 <h2 id="cooklist">Cooklist</h2>
|
al@891
|
1014 <ul class="activity">
|
al@891
|
1015 $(head -n 20 $cooklist | sed 's|^|<li>|; s|$|</li>|')
|
al@891
|
1016 </ul>
|
al@803
|
1017 EOT
|
pankso@18
|
1018
|
al@803
|
1019 [ -s $broken ] && cat <<EOT
|
pascal@805
|
1020 $(more_button broken "All broken packages" $broken 20)
|
al@728
|
1021 <h2 id="broken">Broken</h2>
|
al@891
|
1022 <ul class="activity">
|
al@891
|
1023 $(head -n 20 $broken | sed "s#^[^']*#<a href='?pkg=\0'>\0</a>#g" | sed 's|^|<li>|; s|$|</li>|')
|
al@891
|
1024 </ul>
|
al@803
|
1025 EOT
|
pankso@5
|
1026
|
al@803
|
1027 [ -s $blocked ] && cat <<EOT
|
al@728
|
1028 <h2 id="blocked">Blocked</h2>
|
al@891
|
1029 <ul class="activity">
|
al@891
|
1030 $(sed "s#^[^']*#<a href='?pkg=\0'>\0</a>#g" $blocked | sed 's|^|<li>|; s|$|</li>|')
|
al@891
|
1031 </ul>
|
al@803
|
1032 EOT
|
pankso@14
|
1033
|
al@803
|
1034 cat <<EOT
|
al@728
|
1035 <h2 id="lastcook">Latest cook</h2>
|
al@891
|
1036 <ul class="activity">
|
al@894
|
1037 $(list_packages | sed 's|.tazpkg$||' | \
|
al@894
|
1038 sed "s|^.* :|<span class='log-date'>\0</span> <span style='white-space:nowrap'>|g; s|^|<li>|; s|$|</span></li>|")
|
al@891
|
1039 </ul>
|
al@891
|
1040
|
pankso@5
|
1041 EOT
|
al@891
|
1042 datalist
|
pankso@5
|
1043 ;;
|
pankso@5
|
1044 esac
|
pankso@5
|
1045
|
al@728
|
1046
|
al@893
|
1047 page_footer
|
pankso@5
|
1048 exit 0
|