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