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

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