slitaz-dev-tools view tazpkg-web/search.cgi @ rev 135

Build Bot is http://cook.slitaz.org/ now
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Oct 08 22:31:16 2011 +0200 (2011-10-08)
parents f2ddc8b983cd
children aeaf89486c18
line source
1 #!/bin/sh
2 # Tiny CGI search engine for SliTaz packages on http://pkgs.slitaz.org/
3 # Christophe Lincoln <pankso@slitaz.org>
4 #
6 [ -f "/etc/slitaz/tazpkg-web.conf" ] && . /etc/slitaz/tazpkg-web.conf
7 [ -f "tazpkg-web.conf" ] && . ./tazpkg-web.conf
9 read QUERY_STRING
10 for i in $(echo $QUERY_STRING | sed 's/&/ /g'); do
11 eval $i
12 done
13 LANG=$lang
14 SEARCH=$query
15 SLITAZ_VERSION=$version
16 OBJECT=$object
17 DATE=`date +%Y-%m-%d\ \%H:%M:%S`
18 VERSION=cooking
19 if [ "$REQUEST_METHOD" = "GET" ]; then
20 SEARCH=""
21 VERBOSE=0
22 for i in $(echo $REQUEST_URI | sed 's/[?&]/ /g'); do
23 SLITAZ_VERSION=cooking
24 case "$(echo $i | tr [A-Z] [a-z])" in
25 search=*)
26 SEARCH=${i#*=};;
27 object=*)
28 OBJECT=${i#*=};;
29 verbose=*)
30 VERBOSE=${i#*=};;
31 lang=*)
32 LANG=${i#*=};;
33 file=*)
34 SEARCH=${i#*=}
35 OBJECT=File;;
36 desc=*)
37 SEARCH=${i#*=}
38 OBJECT=Desc;;
39 tags=*)
40 SEARCH=${i#*=}
41 OBJECT=Tags;;
42 receipt=*)
43 SEARCH=${i#*=}
44 OBJECT=Receipt;;
45 filelist=*)
46 SEARCH=${i#*=}
47 OBJECT=File_list;;
48 package=*)
49 SEARCH=${i#*=}
50 OBJECT=Package;;
51 depends=*)
52 SEARCH=${i#*=}
53 OBJECT=Depends;;
54 builddepends=*)
55 SEARCH=${i#*=}
56 OBJECT=BuildDepends;;
57 fileoverlap=*)
58 SEARCH=${i#*=}
59 OBJECT=FileOverlap;;
60 version=s*|version=3*)
61 SLITAZ_VERSION=stable;;
62 version=[1-9]*)
63 i=${version%%.*}
64 SLITAZ_VERSION=${i#*=}.0;;
65 esac
66 done
67 [ -n "$SEARCH" ] && REQUEST_METHOD="POST"
68 fi
70 case "$OBJECT" in
71 File) selected_file="selected";;
72 Desc) selected_desc="selected";;
73 Tags) selected_tags="selected";;
74 Receipt) selected_receipt="selected";;
75 File_list) selected_file_list="selected";;
76 Depends) selected_depends="selected";;
77 BuildDepends) selected_build_depends="selected";;
78 FileOverlap) selected_overlap="selected";;
79 esac
81 case "$SLITAZ_VERSION" in
82 1.0) selected_1="selected";;
83 2.0) selected_2="selected";;
84 stable) selected_stable="selected";;
85 esac
87 # unescape query
88 SEARCH="$(echo $SEARCH | sed 's/%2B/+/g' | sed 's/%3A/:/g' | sed 's|%2F|/|g')"
90 if [ -z "$LANG" ]; then
91 for i in $(echo $HTTP_ACCEPT_LANGUAGE | sed 's/[,;]/ /g'); do
92 case "$i" in
93 fr|de|pt|cn)
94 LANG=$i
95 break;;
96 esac
97 done
98 fi
100 package="Package"
101 file="File"
102 desc="Description"
103 tags="Tags"
104 receipt="Receipt"
105 file_list="File list"
106 depends="Depends"
107 bdepends="Build depends"
108 search="Search"
109 cooking="cooking"
110 stable="stable"
111 result="Result for : $SEARCH"
112 noresult="No package $SEARCH"
113 deptree="Dependency tree for : $SEARCH"
114 rdeptree="Reverse dependency tree for : $SEARCH"
115 bdeplist="$SEARCH needs these packages to be built"
116 rbdeplist="Packages who need $SEARCH to be built"
117 overloading="Theses packages may overload files of "
118 overlap="common files"
119 charset="ISO-8859-1"
121 case "$LANG" in
123 fr) package="Paquet"
124 receipt="Recette"
125 depends="Dépendances"
126 bdepends="Fabrication"
127 search="Recherche"
128 result="Recherche de : $SEARCH"
129 noresult="Paquet $SEARCH introuvable"
130 deptree="Arbre des dépendances de $SEARCH"
131 rdeptree="Arbre inversé des dépendances de $SEARCH"
132 bdeplist="$SEARCH a besion de ces paquets pour être fabriqué"
133 rbdeplist="Paquets ayant besion de $SEARCH pour être fabriqués"
134 overloading="Paquets pouvant écraser des fichiers de "
135 overlap="Fichiers communs"
136 file_list="Liste des fichiers"
137 file="Fichier";;
139 de) package="Paket"
140 depends="Abhängigkeiten"
141 desc="Beschreibung"
142 search="Suche"
143 cooking="Cooking"
144 stable="Stable"
145 result="Resultate für : $SEARCH"
146 noresult="Kein Paket für $SEARCH"
147 deptree="Abhängigkeiten von: $SEARCH"
148 rdeptree="Abhängigkeit für: $SEARCH"
149 file_list="Datei liste"
150 file="Datei";;
152 pt) package="Pacote"
153 search="Buscar"
154 cooking="cooking"
155 stable="stable"
156 result="Resultado para : $SEARCH"
157 noresult="Sem resultado: $SEARCH"
158 deptree="Árvore de dependências para: $SEARCH"
159 rdeptree="Árvore de dependências reversa para: $SEARCH"
160 depends="Dependências"
161 desc="Descrição"
162 file_list="Arquivo lista"
163 file="Arquivo";;
165 cn) package="软件包:"
166 cooking="å¼€å‘版"
167 stable="稳定版"
168 desc="æè¿°"
169 tags="标签"
170 depends="ä¾èµ–"
171 file="文件"
172 file_list="文件列表"
173 search="Search"
174 result="Result for : $SEARCH"
175 noresult="No package $SEARCH"
176 deptree="Dependency tree for : $SEARCH"
177 rdeptree="Reverse dependency tree for : $SEARCH"
178 charset="UTF-8";;
180 *) LANG="en";;
182 esac
184 WOK=$SLITAZ/$SLITAZ_VERSION/wok-hg
185 PACKAGES_REPOSITORY=$SLITAZ/$SLITAZ_VERSION/packages
187 echo Content-type: text/html
188 echo
190 # Search form
191 search_form()
192 {
193 cat << _EOT_
195 <div style="text-align: center; margin-bottom: 30px;">
196 <form method="post" action="search.cgi">
197 <div class="searchbox">
198 <p>
199 <input type="hidden" name="lang" value="$LANG" />
200 <input type="text" name="query"
201 size="20" value="$SEARCH" style="width: 80%;" />
202 <input type="submit" name="search" value="$search" />
203 </p>
204 </div>
205 Search for:
206 <select name="object">
207 <option value="Package">$package</option>
208 <option $selected_desc value="Desc">$desc</option>
209 <option $selected_tags value="Tags">$tags</option>
210 <option $selected_receipt value="Receipt">$receipt</option>
211 <option $selected_depends value="Depends">$depends</option>
212 <option $selected_build_depends value="BuildDepends">$bdepends</option>
213 <option $selected_file value="File">$file</option>
214 <option $selected_file_list value="File_list">$file_list</option>
215 <option $selected_overlap value="FileOverlap">$overlap</option>
216 </select>
217 in
218 <select name="version">
219 <option value="cooking">$cooking</option>
220 <option $selected_stable value="stable">$stable</option>
221 <option $selected_1 value="1.0">1.0</option>
222 <option $selected_2 value="2.0">2.0</option>
223 </select>
224 </form>
225 </div>
226 _EOT_
227 }
229 # xHTML Header.
230 xhtml_header()
231 {
232 cat << _EOF_
233 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
234 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
235 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="$LANG" lang="$LANG">
236 <head>
237 <title>SliTaz Packages - Search $SEARCH</title>
238 <meta http-equiv="content-type" content="text/html; charset=$charset" />
239 <meta name="description" content="SliTaz packages" />
240 <meta name="keywords" lang="en" content="tazpkg" />
241 <meta name="robots" content="index, follow, all" />
242 <meta name="modified" content="$DATE" />
243 <link rel="shortcut icon" href="favicon.ico" />
244 <link rel="stylesheet" type="text/css" href="slitaz.css" />
245 </head>
246 <body>
248 <!-- Header -->
249 <div id="header">
250 <div id="logo"></div>
251 <div id="network">
252 <a href="http://www.slitaz.org/">
253 <img src="images/network.png" alt="network.png" /></a>
254 <a href="http://scn.slitaz.org/">Community</a>
255 <a href="http://doc.slitaz.org/">Doc</a>
256 <a href="http://forum.slitaz.org/">Forum</a>
257 <a href="http://bugs.slitaz.org/">Bugs</a>
258 <a href="http://hg.slitaz.org/">Hg</a>
259 </div>
260 <h1><a href="http://pkgs.slitaz.org/">SliTaz Packages</a></h1>
261 </div>
263 <!-- Block -->
264 <div id="block">
265 <!-- Navigation -->
266 <div id="block_nav" style="padding: 10px;">
267 <h4><img src="images/tazpkg.png" alt="tazpkg.png" />Tools &amp; Doc</h4>
268 <div class="right_box">
269 <ul>
270 <li><a href="http://doc.slitaz.org/en:cookbook:wok">Wok &amp; Tools</a></li>
271 <li><a href="http://doc.slitaz.org/en:cookbook:receipt">Receipts</a></li>
272 </ul>
273 </div>
274 <ul>
275 <li><a href="http://hg.slitaz.org/wok">Hg Repos</a></li>
276 <li><a href="http://cook.slitaz.org/">Build Bot</a></li>
277 <li><a href="http://bugs.slitaz.org/">Bug Tracker</a></li>
278 <li><a href="http://forum.slitaz.org/">Get Support</a></li>
279 </ul>
280 </div>
281 <!-- Information/image -->
282 <div id="block_info">
283 <h4>$package</h4>
284 <p>
285 Search for SliTaz packages!
286 </p>
287 <p>
288 Any results ? Make a package request on the official
289 <a href="http://forum.slitaz.org/">forum</a>
290 </p>
291 </div>
292 </div>
294 _EOF_
295 }
297 # xHTML Footer.
298 xhtml_footer()
299 {
300 cat << _EOT_
301 <center>
302 <i>$(ls $WOK/ | wc -l) packages and $(unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | wc -l) files in $SLITAZ_VERSION database</i>
303 </center>
305 <!-- End of content -->
306 </div>
308 <!-- Footer -->
309 <div id="footer">
310 Copyright &copy; <span class="year"></span>
311 <a href="http://www.slitaz.org/">SliTaz</a> - Network:
312 <a href="http://scn.slitaz.org/">Community</a>
313 <a href="http://doc.slitaz.org/">Doc</a>
314 <a href="http://forum.slitaz.org/">Forum</a>
315 <a href="http://pkgs.slitaz.org/">Packages</a>
316 <a href="http://bugs.slitaz.org/">Bugs</a>
317 <a href="http://hg.slitaz.org/">Hg</a>
318 <p>
319 SliTaz @
320 <a href="http://twitter.com/slitaz">Twitter</a>
321 <a href="http://www.facebook.com/slitaz">Facebook</a>
322 <a href="http://distrowatch.com/slitaz">Distrowatch</a>
323 <a href="http://en.wikipedia.org/wiki/SliTaz">Wikipedia</a>
324 <a href="http://flattr.com/profile/slitaz">Flattr</a>
325 </p>
326 </div>
328 </body>
329 </html>
330 _EOT_
331 }
333 installed_size()
334 {
335 [ $VERBOSE -gt 0 ] &&
336 grep -A 3 "^$1\$" $SLITAZ/$SLITAZ_VERSION/packages/packages.txt | \
337 grep installed | sed 's/.*(\(.*\) installed.*/(\1) /'
338 }
340 package_entry()
341 {
342 if [ -s "$(dirname $0)/$SLITAZ_VERSION/$CATEGORY.html" ]; then
343 cat << _EOT_
344 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
345 _EOT_
346 else
347 cat << _EOT_
348 <a href="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
349 _EOT_
350 fi
351 }
353 # recursive dependencies scan
354 dep_scan()
355 {
356 for i in $1; do
357 case " $ALL_DEPS " in
358 *\ $i\ *) continue;;
359 esac
360 ALL_DEPS="$ALL_DEPS $i"
361 if [ -n "$2" ]; then
362 echo -n "$2"
363 (
364 . $WOK/$i/receipt
365 package_entry
366 )
367 fi
368 [ -f $WOK/$i/receipt ] || continue
369 DEPENDS=""
370 . $WOK/$i/receipt
371 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
372 done
373 }
375 # recursive reverse dependencies scan
376 rdep_scan()
377 {
378 SEARCH=$1
379 case "$SEARCH" in
380 glibc-base|gcc-lib-base) cat <<EOT
381 glibc-base and gcc-lib-base are implicit dependencies,
382 <b>every</b> package is supposed to depend on them.
383 EOT
384 return;;
385 esac
386 for i in $WOK/* ; do
387 DEPENDS=""
388 . $i/receipt
389 echo "$(basename $i) $(echo $DEPENDS)"
390 done | awk -v search=$SEARCH '
391 function show_deps(deps, all_deps, pkg, space)
392 {
393 if (all_deps[pkg] == 1) return
394 all_deps[pkg] = 1
395 if (space != "") printf "%s%s\n",space,pkg
396 for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
397 show_deps(deps, all_deps, mydeps[i],"////" space)
398 }
399 }
401 {
402 all_deps[$1] = 0
403 for (i = 2; i <= NF; i++)
404 deps[$i] = deps[$i] " " $1
405 }
407 END {
408 show_deps(deps, all_deps, search, "")
409 }
410 ' | while read pkg; do
411 . $WOK/${pkg##*/}/receipt
412 cat << _EOT_
413 $(echo ${pkg%/*} | sed 's|/| |g') $(package_entry)
414 _EOT_
415 done
416 }
418 # Check package exists
419 package_exist()
420 {
421 [ -f $WOK/$1/receipt ] && return 0
422 cat << _EOT_
424 <h3>$noresult</h3>
425 <pre>
426 _EOT_
427 return 1
428 }
430 # Display < > &
431 htmlize()
432 {
433 sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g'
434 }
436 display_packages_and_files()
437 {
438 last=""
439 while read pkg file; do
440 pkg=${pkg%:}
441 if [ "$pkg" != "$last" ]; then
442 . $WOK/$pkg/receipt
444 package_entry
445 last=$pkg
446 fi
447 echo " $file"
448 done
449 }
451 # Display search form and result if requested.
452 if [ "$REQUEST_METHOD" != "POST" ]; then
453 xhtml_header
454 cat << _EOT_
456 <!-- Content -->
457 <div id="content">
459 _EOT_
460 search_form
461 xhtml_footer
462 else
463 xhtml_header
464 cat << _EOT_
466 <!-- Content -->
467 <div id="content">
469 _EOT_
470 search_form
471 if [ "$OBJECT" = "Depends" ]; then
472 if package_exist $SEARCH ; then
473 cat << _EOT_
475 <h3>$deptree</h3>
476 <pre>
477 _EOT_
478 ALL_DEPS=""
479 dep_scan $SEARCH ""
480 SUGGESTED=""
481 . $WOK/$SEARCH/receipt
482 if [ -n "$SUGGESTED" ]; then
483 cat << _EOT_
484 </pre>
486 <h3>$deptree (SUGGESTED)</h3>
487 <pre>
488 _EOT_
489 ALL_DEPS=""
490 dep_scan "$SUGGESTED" " "
491 fi
492 cat << _EOT_
493 </pre>
495 <h3>$rdeptree</h3>
496 <pre>
497 _EOT_
498 ALL_DEPS=""
499 rdep_scan $SEARCH
500 cat << _EOT_
501 </pre>
502 _EOT_
503 fi
504 elif [ "$OBJECT" = "BuildDepends" ]; then
505 if package_exist $SEARCH ; then
506 cat << _EOT_
508 <h3>$bdeplist</h3>
509 <pre>
510 _EOT_
511 BUILD_DEPENDS=""
512 . $WOK/$SEARCH/receipt
513 [ -n "$BUILD_DEPENDS" ] && for dep in $BUILD_DEPENDS ; do
514 if [ ! -s $WOK/$dep/receipt ]; then
515 cat << _EOT_
516 $dep: not found !
517 _EOT_
518 continue
519 fi
520 . $WOK/$dep/receipt
521 package_entry
522 done
523 cat << _EOT_
524 </pre>
526 <h3>$rbdeplist</h3>
527 <pre>
528 _EOT_
529 for dep in $(grep -l $SEARCH $WOK/*/receipt); do
530 BUILD_DEPENDS=""
531 . $dep
532 echo " $BUILD_DEPENDS " | grep -q " $SEARCH " &&
533 package_entry
534 done
535 cat << _EOT_
536 </pre>
537 _EOT_
538 fi
539 elif [ "$OBJECT" = "FileOverlap" ]; then
540 if package_exist $SEARCH ; then
541 cat << _EOT_
543 <h3>$overloading $SEARCH</h3>
544 <pre>
545 _EOT_
546 ( unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep ^$SEARCH: ;
547 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep -v ^$SEARCH: ) | awk '
548 BEGIN { pkg=""; last="x" }
549 {
550 if ($2 == "") next
551 if (index($2,last) == 1 && substr($2,1+length(last),1) == "/")
552 delete file[last]
553 last=$2
554 if (pkg == "") pkg=$1
555 if ($1 == pkg) file[$2]=$1
556 else if (file[$2] == pkg) print
557 }
558 ' | display_packages_and_files
559 cat << _EOT_
560 </pre>
561 _EOT_
562 fi
563 elif [ "$OBJECT" = "File" ]; then
564 cat << _EOT_
566 <h3>$result</h3>
567 <pre>
568 _EOT_
569 last=""
570 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \
571 | grep $SEARCH | while read pkg file; do
572 echo "$file" | grep -q $SEARCH || continue
573 if [ "$last" != "${pkg%:}" ]; then
574 last=${pkg%:}
575 (
576 . $WOK/$last/receipt
577 cat << _EOT_
579 <i>$(package_entry)</i>
580 _EOT_
581 )
582 fi
583 echo " $file"
584 done
585 elif [ "$OBJECT" = "File_list" ]; then
586 package_exist $SEARCH && cat << _EOT_
588 <h3>$result</h3>
589 <pre>
590 _EOT_
591 last=""
592 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \
593 | grep ^$SEARCH: | sed 's/.*: / /' | sort
594 elif [ "$OBJECT" = "Desc" ]; then
595 if [ -f $WOK/$SEARCH/description.txt ]; then
596 cat << _EOT_
598 <h3>$result</h3>
599 <pre>
600 <pre>
601 $(htmlize < $WOK/$SEARCH/description.txt)
602 </pre>
603 _EOT_
604 else
605 cat << _EOT_
607 <h3>$result</h3>
608 <pre>
609 _EOT_
610 last=""
611 grep -i $SEARCH $PACKAGES_REPOSITORY/packages.desc | \
612 sort | while read pkg extras ; do
613 . $WOK/$pkg/receipt
614 package_entry
615 done
616 fi
617 elif [ "$OBJECT" = "Tags" ]; then
618 cat << _EOT_
620 <h3>$result</h3>
621 <pre>
622 _EOT_
623 last=""
624 grep ^TAGS= $WOK/*/receipt | grep -i $SEARCH | \
625 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
626 . $WOK/$pkg/receipt
627 package_entry
628 done
629 elif [ "$OBJECT" = "Receipt" ]; then
630 package_exist $SEARCH && cat << _EOT_
632 <h3>$result</h3>
633 <pre>
634 <pre>
635 $(if [ -f $WOK/$SEARCH/taz/*/receipt ]; then
636 cat $WOK/$SEARCH/taz/*/receipt
637 else
638 cat $WOK/$SEARCH/receipt
639 fi | htmlize)
640 </pre>
641 _EOT_
642 else
643 cat << _EOT_
645 <h3>$result</h3>
646 <pre>
647 _EOT_
648 for pkg in `ls $WOK/ | grep $SEARCH`
649 do
650 . $WOK/$pkg/receipt
651 DESC=" <a href=\"?desc=$pkg\">description</a>"
652 [ -f $WOK/$pkg/description.txt ] || DESC=""
653 cat << _EOT_
654 $(package_entry)$DESC
655 _EOT_
656 done
657 equiv=$PACKAGES_REPOSITORY/packages.equiv
658 vpkgs="$(cat $equiv | cut -d= -f1 | grep $SEARCH)"
659 for vpkg in $vpkgs ; do
660 cat << _EOT_
661 </pre>
663 <h3>$result (package providing $vpkg)</h3>
664 <pre>
665 _EOT_
666 for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do
667 . $WOK/${pkg#*:}/receipt
668 package_entry
669 done
670 done
671 fi
672 cat << _EOT_
673 </pre>
674 _EOT_
675 xhtml_footer
676 fi
678 exit 0