wok-next view tazpkg-web/stuff/search.cgi @ rev 5820

tazpkg-web: 2.0 support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Jul 15 13:45:55 2010 +0200 (2010-07-15)
parents 85313fe45f02
children 1003bb898736
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 "$i" in
22 verbose=*)
23 VERBOSE=${i#*=};;
24 lang=*)
25 LANG=${i#*=};;
26 file=*)
27 SEARCH=${i#*=}
28 OBJECT=File;;
29 desc=*)
30 SEARCH=${i#*=}
31 OBJECT=Desc;;
32 tags=*)
33 SEARCH=${i#*=}
34 OBJECT=Tags;;
35 receipt=*)
36 SEARCH=${i#*=}
37 OBJECT=Receipt;;
38 filelist=*)
39 SEARCH=${i#*=}
40 OBJECT=File_list;;
41 package=*)
42 SEARCH=${i#*=}
43 OBJECT=Package;;
44 depends=*)
45 SEARCH=${i#*=}
46 OBJECT=Depends;;
47 BuildDepends=*)
48 SEARCH=${i#*=}
49 OBJECT=BuildDepends;;
50 FileOverlap=*)
51 SEARCH=${i#*=}
52 OBJECT=FileOverlap;;
53 version=s*|version=3*)
54 SLITAZ_VERSION=stable;;
55 version=2*)
56 SLITAZ_VERSION=2.0;;
57 version=1*)
58 SLITAZ_VERSION=1.0;;
59 esac
60 done
61 [ -n "$SEARCH" ] && REQUEST_METHOD="POST"
62 fi
64 case "$OBJECT" in
65 File) selected_file="selected";;
66 Desc) selected_desc="selected";;
67 Tags) selected_tags="selected";;
68 Receipt) selected_receipt="selected";;
69 File_list) selected_file_list="selected";;
70 Depends) selected_depends="selected";;
71 BuildDepends) selected_build_depends="selected";;
72 FileOverlap) selected_overlap="selected";;
73 esac
75 case "$SLITAZ_VERSION" in
76 1.0) selected_1="selected";;
77 2.0) selected_2="selected";;
78 stable) selected_stable="selected";;
79 esac
81 # unescape query
82 SEARCH="$(echo $SEARCH | sed 's/%2B/+/g' | sed 's/%3A/:/g' | sed 's|%2F|/|g')"
84 if [ -z "$LANG" ]; then
85 for i in $(echo $HTTP_ACCEPT_LANGUAGE | sed 's/[,;]/ /g'); do
86 case "$i" in
87 fr|de|pt|cn)
88 LANG=$i
89 break;;
90 esac
91 done
92 fi
94 package="Package"
95 file="File"
96 desc="Description"
97 tags="Tags"
98 receipt="Receipt"
99 file_list="File list"
100 depends="Depends"
101 bdepends="Build depends"
102 search="Search"
103 cooking="cooking"
104 stable="stable"
105 result="Result for : $SEARCH"
106 noresult="No package $SEARCH"
107 deptree="Dependency tree for : $SEARCH"
108 rdeptree="Reverse dependency tree for : $SEARCH"
109 bdeplist="$SEARCH needs these packages to be built"
110 rbdeplist="Packages who need $SEARCH to be built"
111 overloading="Theses packages may overload files of "
112 overlap="common files"
113 charset="ISO-8859-1"
115 case "$LANG" in
117 fr) package="Paquet"
118 receipt="Recette"
119 depends="Dépendances"
120 bdepends="Fabrication"
121 search="Recherche"
122 result="Recherche de : $SEARCH"
123 noresult="Paquet $SEARCH introuvable"
124 deptree="Arbre des dépendances de $SEARCH"
125 rdeptree="Arbre inversé des dépendances de $SEARCH"
126 bdeplist="$SEARCH a besion de ces paquets pour être fabriqué"
127 rbdeplist="Paquets ayant besion de $SEARCH pour être fabriqués"
128 overloading="Paquets pouvant écraser des fichiers de "
129 overlap="Fichiers communs"
130 file_list="Liste des fichiers"
131 file="Fichier";;
133 de) package="Paket"
134 depends="Abhängigkeiten"
135 desc="Beschreibung"
136 search="Suche"
137 cooking="Cooking"
138 stable="Stable"
139 result="Resultate für : $SEARCH"
140 noresult="Kein Paket für $SEARCH"
141 deptree="Abhängigkeiten von: $SEARCH"
142 rdeptree="Abhängigkeit für: $SEARCH"
143 file_list="Datei liste"
144 file="Datei";;
146 pt) package="Pacote"
147 search="Buscar"
148 cooking="cooking"
149 stable="stable"
150 result="Resultado para : $SEARCH"
151 noresult="Sem resultado: $SEARCH"
152 deptree="Árvore de dependências para: $SEARCH"
153 rdeptree="Árvore de dependências reversa para: $SEARCH"
154 depends="Dependências"
155 desc="Descrição"
156 file_list="Arquivo lista"
157 file="Arquivo";;
159 cn) package="软件包:"
160 cooking="å¼€å‘版"
161 stable="稳定版"
162 desc="æè¿°"
163 tags="标签"
164 depends="ä¾èµ–"
165 file="文件"
166 file_list="文件列表"
167 search="Search"
168 result="Result for : $SEARCH"
169 noresult="No package $SEARCH"
170 deptree="Dependency tree for : $SEARCH"
171 rdeptree="Reverse dependency tree for : $SEARCH"
172 charset="UTF-8";;
174 *) LANG="en";;
176 esac
178 WOK=/home/slitaz/$SLITAZ_VERSION/wok
179 PACKAGES_REPOSITORY=/home/slitaz/$SLITAZ_VERSION/packages
181 echo Content-type: text/html
182 echo
184 # Search form
185 search_form()
186 {
187 cat << _EOT_
189 <div style="text-align: center; padding: 20px;">
190 <form method="post" action="search.cgi">
191 <input type="hidden" name="lang" value="$LANG" />
192 <select name="object">
193 <option value="Package">$package</option>
194 <option $selected_desc value="Desc">$desc</option>
195 <option $selected_tags value="Tags">$tags</option>
196 <option $selected_receipt value="Receipt">$receipt</option>
197 <option $selected_depends value="Depends">$depends</option>
198 <option $selected_build_depends value="BuildDepends">$bdepends</option>
199 <option $selected_file value="File">$file</option>
200 <option $selected_file_list value="File_list">$file_list</option>
201 <option $selected_overlap value="FileOverlap">$overlap</option>
202 </select>
203 <strong>:</strong>
204 <input type="text" name="query" size="20" value="$SEARCH" />
205 <select name="version">
206 <option value="cooking">$cooking</option>
207 <option $selected_stable value="stable">$stable</option>
208 <option $selected_1 value="1.0">1.0</option>
209 <option $selected_2 value="2.0">2.0</option>
210 </select>
211 <input type="submit" name="search" value="$search" />
212 </form>
213 </div>
214 _EOT_
215 }
217 # xHTML Header.
218 xhtml_header()
219 {
220 cat << _EOF_
221 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
222 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
223 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="$LANG" lang="$LANG">
224 <head>
225 <title>SliTaz Packages - Search $SEARCH</title>
226 <meta http-equiv="content-type" content="text/html; charset=$charset" />
227 <meta name="description" content="Au sujet de SliTaz GNU/Linux mini système d'exploitation" />
228 <meta name="keywords" lang="fr" content="Système, libre, gnu, linux, opensource, livecd" />
229 <meta name="robots" content="index, follow, all" />
230 <meta name="revisit-after" content="7 days" />
231 <meta name="expires" content="never" />
232 <meta name="modified" content="$DATE" />
233 <meta name="author" content="ash, awk, grep, sed and cat"/>
234 <meta name="publisher" content="www.slitaz.org" />
235 <link rel="shortcut icon" href="http://pkgs.slitaz.org/favicon.ico" />
236 <link rel="stylesheet" type="text/css" href="http://pkgs.slitaz.org/slitaz.css" />
237 </head>
238 <body bgcolor="#ffffff">
240 <!-- Header -->
241 <div id="header">
242 <a name="top"></a>
243 <!-- Access -->
244 <div id="access">
245 <a href="http://www.slitaz.org/" title="SliTaz Web site">Website</a> |
246 <a href="http://wiki.slitaz.org/" title="SliTaz Community Wiki">Wiki</a> |
247 <a href="http://labs.slitaz.org/" title="SliTaz laboratories">Labs</a>
248 </div>
249 <a href="http://pkgs.slitaz.org/"><img id="logo"
250 src="http://pkgs.slitaz.org/pics/website/logo.png" title="pkgs.slitaz.org" alt="pkgs.slitaz.org"
251 style="border: 0px solid ; width: 200px; height: 74px;" /></a>
252 <p id="titre">#!/tazpkg/packages</p>
253 </div>
254 _EOF_
255 }
257 # xHTML Footer.
258 xhtml_footer()
259 {
260 cat << _EOT_
261 <center>
262 <i>$(ls $WOK/ | wc -l) packages and $(unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | wc -l) files in $SLITAZ_VERSION database</i>
263 </center>
265 <!-- End of content with round corner -->
266 </div>
267 <div id="content_bottom">
268 <div class="bottom_left"></div>
269 <div class="bottom_right"></div>
270 </div>
272 <!-- Start of footer and copy notice -->
273 <div id="copy">
274 <p>
275 Dernière modification : $DATE -
276 <a href="#top">Top of the page</a>
277 </p>
278 <p>
279 Copyright &copy; $(date +%Y) <a href="http://www.slitaz.org/">SliTaz</a> -
280 <a href="http://www.gnu.org/licenses/gpl.html">GNU General Public License</a>
281 </p>
282 <!-- End of copy -->
283 </div>
285 <!-- Bottom and logo's -->
286 <div id="bottom">
287 <p>
288 <a href="http://validator.w3.org/check?uri=referer"><img
289 src="http://pkgs.slitaz.org/pics/website/xhtml10.png" alt="Valid XHTML 1.0"
290 title="Code validé XHTML 1.0"
291 style="width: 80px; height: 15px;" /></a>
292 </p>
293 </div>
295 </body>
296 </html>
297 _EOT_
298 }
300 installed_size()
301 {
302 [ $VERBOSE -gt 0 ] &&
303 grep -A 3 "^$1\$" /home/slitaz/$SLITAZ_VERSION/packages/packages.txt | \
304 grep installed | sed 's/.*(\(.*\) installed.*/(\1) /'
305 }
307 # recursive dependencies scan
308 dep_scan()
309 {
310 for i in $1; do
311 case " $ALL_DEPS " in
312 *\ $i\ *) continue;;
313 esac
314 ALL_DEPS="$ALL_DEPS $i"
315 if [ -n "$2" ]; then
316 echo -n "$2"
317 (
318 . $WOK/$i/receipt
319 cat << _EOT_
320 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
321 _EOT_
322 )
323 fi
324 [ -f $WOK/$i/receipt ] || continue
325 DEPENDS=""
326 . $WOK/$i/receipt
327 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
328 done
329 }
331 # recursive reverse dependencies scan
332 rdep_scan()
333 {
334 SEARCH=$1
335 case "$SEARCH" in
336 glibc-base|gcc-lib-base) cat <<EOT
337 glibc-base and gcc-lib-base are implicit dependencies,
338 <b>every</b> package is supposed to depend on them.
339 EOT
340 return;;
341 esac
342 for i in $WOK/* ; do
343 DEPENDS=""
344 . $i/receipt
345 echo "$(basename $i) $(echo $DEPENDS)"
346 done | awk -v search=$SEARCH '
347 function show_deps(deps, all_deps, pkg, space)
348 {
349 if (all_deps[pkg] == 1) return
350 all_deps[pkg] = 1
351 if (space != "") printf "%s%s\n",space,pkg
352 for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
353 show_deps(deps, all_deps, mydeps[i],"////" space)
354 }
355 }
357 {
358 all_deps[$1] = 0
359 for (i = 2; i <= NF; i++)
360 deps[$i] = deps[$i] " " $1
361 }
363 END {
364 show_deps(deps, all_deps, search, "")
365 }
366 ' | while read pkg; do
367 . $WOK/${pkg##*/}/receipt
368 cat << _EOT_
369 $(echo ${pkg%/*} | sed 's|/| |g') <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
370 _EOT_
371 done
372 }
374 # Check package exists
375 package_exist()
376 {
377 [ -f $WOK/$1/receipt ] && return 0
378 cat << _EOT_
380 <h3>$noresult</h3>
381 <pre class="package">
382 _EOT_
383 return 1
384 }
386 # Display < > &
387 htmlize()
388 {
389 sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g'
390 }
392 display_packages_and_files()
393 {
394 last=""
395 while read pkg file; do
396 pkg=${pkg%:}
397 if [ "$pkg" != "$last" ]; then
398 . $WOK/$pkg/receipt
399 cat << _EOT_
401 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
402 _EOT_
403 last=$pkg
404 fi
405 echo " $file"
406 done
407 }
409 # Display search form and result if requested.
410 if [ "$REQUEST_METHOD" != "POST" ]; then
411 xhtml_header
412 cat << _EOT_
414 <!-- Content top. -->
415 <div id="content_top">
416 <div class="top_left"></div>
417 <div class="top_right"></div>
418 </div>
420 <!-- Content -->
421 <div id="content">
422 <a name="content"></a>
424 <h1><font color="#3E1220">$package</font></h1>
425 <h2><font color="#DF8F06">$search</font></h2>
426 _EOT_
427 search_form
428 xhtml_footer
429 else
430 xhtml_header
431 cat << _EOT_
433 <!-- Content top. -->
434 <div id="content_top">
435 <div class="top_left"></div>
436 <div class="top_right"></div>
437 </div>
439 <!-- Content -->
440 <div id="content">
441 <a name="content"></a>
443 <h1><font color="#3E1220">$package</font></h1>
444 <h2><font color="#DF8F06">$search</font></h2>
445 _EOT_
446 search_form
447 if [ "$OBJECT" = "Depends" ]; then
448 if package_exist $SEARCH ; then
449 cat << _EOT_
451 <h3>$deptree</h3>
452 <pre class="package">
453 _EOT_
454 ALL_DEPS=""
455 dep_scan $SEARCH ""
456 SUGGESTED=""
457 . $WOK/$SEARCH/receipt
458 if [ -n "$SUGGESTED" ]; then
459 cat << _EOT_
460 </pre>
462 <h3>$deptree (SUGGESTED)</h3>
463 <pre class="package">
464 _EOT_
465 ALL_DEPS=""
466 dep_scan "$SUGGESTED" " "
467 fi
468 cat << _EOT_
469 </pre>
471 <h3>$rdeptree</h3>
472 <pre class="package">
473 _EOT_
474 ALL_DEPS=""
475 rdep_scan $SEARCH
476 cat << _EOT_
477 </pre>
478 _EOT_
479 fi
480 elif [ "$OBJECT" = "BuildDepends" ]; then
481 if package_exist $SEARCH ; then
482 cat << _EOT_
484 <h3>$bdeplist</h3>
485 <pre class="package">
486 _EOT_
487 BUILD_DEPENDS=""
488 . $WOK/$SEARCH/receipt
489 [ -n "$BUILD_DEPENDS" ] && for dep in $BUILD_DEPENDS ; do
490 if [ ! -s $WOK/$dep/receipt ]; then
491 cat << _EOT_
492 $dep: not found !
493 _EOT_
494 continue
495 fi
496 . $WOK/$dep/receipt
497 cat << _EOT_
498 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
499 _EOT_
500 done
501 cat << _EOT_
502 </pre>
504 <h3>$rbdeplist</h3>
505 <pre class="package">
506 _EOT_
507 for dep in $(grep -l $SEARCH $WOK/*/receipt); do
508 BUILD_DEPENDS=""
509 . $dep
510 echo " $BUILD_DEPENDS " | grep -q " $SEARCH " &&
511 cat << _EOT_
512 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
513 _EOT_
514 done
515 cat << _EOT_
516 </pre>
517 _EOT_
518 fi
519 elif [ "$OBJECT" = "FileOverlap" ]; then
520 if package_exist $SEARCH ; then
521 cat << _EOT_
523 <h3>$overloading $SEARCH</h3>
524 <pre class="package">
525 _EOT_
526 ( unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep ^$SEARCH: ;
527 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep -v ^$SEARCH: ) | awk '
528 BEGIN { pkg="" }
529 {
530 if (pkg == "") pkg=$1
531 if ($1 == pkg) file[$2]=$1
532 else if (file[$2] == pkg) print
533 }
534 ' | display_packages_and_files
535 cat << _EOT_
536 </pre>
537 _EOT_
538 fi
539 elif [ "$OBJECT" = "File" ]; then
540 cat << _EOT_
542 <h3>$result</h3>
543 <pre class="package">
544 _EOT_
545 last=""
546 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \
547 | grep $SEARCH | while read pkg file; do
548 echo "$file" | grep -q $SEARCH || continue
549 if [ "$last" != "${pkg%:}" ]; then
550 last=${pkg%:}
551 (
552 . $WOK/$last/receipt
553 cat << _EOT_
555 <i><b><a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a></b> $SHORT_DESC</i>
556 _EOT_
557 )
558 fi
559 echo " $file"
560 done
561 elif [ "$OBJECT" = "File_list" ]; then
562 package_exist $SEARCH && cat << _EOT_
564 <h3>$result</h3>
565 <pre class="package">
566 _EOT_
567 last=""
568 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \
569 | grep ^$SEARCH: | sed 's/.*: / /' | sort
570 elif [ "$OBJECT" = "Desc" ]; then
571 if [ -f $WOK/$SEARCH/description.txt ]; then
572 cat << _EOT_
574 <h3>$result</h3>
575 <pre class="package">
576 <pre>
577 $(htmlize < $WOK/$SEARCH/description.txt)
578 </pre>
579 _EOT_
580 else
581 cat << _EOT_
583 <h3>$result</h3>
584 <pre class="package">
585 _EOT_
586 last=""
587 grep -i $SEARCH $PACKAGES_REPOSITORY/packages.desc | \
588 sort | while read pkg extras ; do
589 . $WOK/$pkg/receipt
590 cat << _EOT_
591 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
592 _EOT_
593 done
594 fi
595 elif [ "$OBJECT" = "Tags" ]; then
596 cat << _EOT_
598 <h3>$result</h3>
599 <pre class="package">
600 _EOT_
601 last=""
602 grep ^TAGS= $WOK/*/receipt | grep -i $SEARCH | \
603 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
604 . $WOK/$pkg/receipt
605 cat << _EOT_
606 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
607 _EOT_
608 done
609 elif [ "$OBJECT" = "Receipt" ]; then
610 package_exist $SEARCH && cat << _EOT_
612 <h3>$result</h3>
613 <pre class="package">
614 <pre>
615 $(if [ -f $WOK/$SEARCH/taz/*/receipt ]; then
616 cat $WOK/$SEARCH/taz/*/receipt
617 else
618 cat $WOK/$SEARCH/receipt
619 fi | htmlize)
620 </pre>
621 _EOT_
622 else
623 cat << _EOT_
625 <h3>$result</h3>
626 <pre class="package">
627 _EOT_
628 for pkg in `ls $WOK/ | grep $SEARCH`
629 do
630 . $WOK/$pkg/receipt
631 DESC=" <a href=\"?desc=$pkg\">description</a>"
632 [ -f $WOK/$pkg/description.txt ] || DESC=""
633 cat << _EOT_
634 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC$DESC
635 _EOT_
636 done
637 equiv=$PACKAGES_REPOSITORY/packages.equiv
638 vpkgs="$(cat $equiv | cut -d= -f1 | grep $SEARCH)"
639 for vpkg in $vpkgs ; do
640 cat << _EOT_
641 </pre>
643 <h3>$result (package providing $vpkg)</h3>
644 <pre class="package">
645 _EOT_
646 for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do
647 . $WOK/${pkg#*:}/receipt
648 cat << _EOT_
649 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
650 _EOT_
651 done
652 done
653 fi
654 cat << _EOT_
655 </pre>
656 _EOT_
657 xhtml_footer
658 fi
660 exit 0