wok view mirror-tools/stuff/var/www/pkgs/search.cgi @ rev 3242

mirror-tools: add search.cgi from pkgs.slitaz.org
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat May 30 11:53:39 2009 +0200 (2009-05-30)
parents
children 66d6688657fe
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 for i in $(echo $REQUEST_URI | sed 's/[?&]/ /g'); do
19 SLITAZ_VERSION=cooking
20 case "$i" in
21 lang=*)
22 LANG=${i#*=};;
23 file=*)
24 SEARCH=${i#*=}
25 OBJECT=File;;
26 desc=*)
27 SEARCH=${i#*=}
28 OBJECT=Desc;;
29 tags=*)
30 SEARCH=${i#*=}
31 OBJECT=Tags;;
32 filelist=*)
33 SEARCH=${i#*=}
34 OBJECT=File_list;;
35 package=*)
36 SEARCH=${i#*=}
37 OBJECT=Package;;
38 depends=*)
39 SEARCH=${i#*=}
40 OBJECT=Depends;;
41 version=s*|version=2*)
42 SLITAZ_VERSION=stable;;
43 version=1*)
44 SLITAZ_VERSION=1.0;;
45 esac
46 done
47 [ -n "$SEARCH" ] && REQUEST_METHOD="POST"
48 fi
50 case "$OBJECT" in
51 File) selected_file="selected";;
52 Desc) selected_desc="selected";;
53 Tags) selected_tags="selected";;
54 File_list) selected_file_list="selected";;
55 Depends) selected_depends="selected";;
56 esac
58 case "$SLITAZ_VERSION" in
59 1.0) selected_1="selected";;
60 stable) selected_stable="selected";;
61 esac
63 # unescape query
64 SEARCH="$(echo $SEARCH | sed 's/%2B/+/g' | sed 's/%3A/:/g' | sed 's|%2F|/|g')"
66 package="Package"
67 file="File"
68 desc="Description"
69 tags="Tags"
70 file_list="File list"
71 depends="Depends"
72 search="Search"
73 cooking="cooking"
74 stable="stable"
75 result="Result for : $SEARCH"
76 noresult="No package $SEARCH"
77 deptree="Dependency tree for : $SEARCH"
78 rdeptree="Reverse dependency tree for : $SEARCH"
79 charset="ISO-8859-1"
80 case "$LANG" in
81 fr) package="Paquet"
82 depends="Dépendances"
83 search="Recherche"
84 result="Recherche de : $SEARCH"
85 noresult="Paquet $SEARCH introuvable"
86 deptree="Arbre des dépendances de $SEARCH"
87 rdeptree="Arbre inversé des dépendances de $SEARCH"
88 file_list="Liste des fichiers"
89 file="Fichier";;
90 de) package="Paket"
91 depends="Abhängigkeiten"
92 search="Suche"
93 cooking="Cooking"
94 stable="Stable"
95 result="Resultate für : $SEARCH"
96 noresult="Kein Paket für $SEARCH"
97 deptree="Abhängigkeiten von: $SEARCH"
98 rdeptree="Abhängigkeit für: $SEARCH"
99 file_list="Datei liste"
100 file="Datei";;
101 pt) package="Pacote"
102 search="Buscar"
103 cooking="cooking"
104 stable="stable"
105 result="Resultado para : $SEARCH"
106 noresult="Sem resultado: $SEARCH"
107 deptree="Árvore de dependências para: $SEARCH"
108 rdeptree="Árvore de dependências reversa para: $SEARCH"
109 depends="Dependências"
110 file_list="Arquivo lista"
111 file="Arquivo";;
112 cn) package="软件包:"
113 cooking="å¼€å‘版"
114 stable="稳定版"
115 charset="UTF-8";;
116 *) LANG="en";;
117 esac
118 WOK=/home/slitaz/$SLITAZ_VERSION/wok
121 echo Content-type: text/html
122 echo
124 # Search form
125 search_form()
126 {
127 cat << _EOT_
129 <div style="text-align: center; padding: 20px;">
130 <form method="POST" action="search.cgi">
131 <input type="hidden" name="lang" value="$LANG">
132 <select name="object">
133 <option value="Package">$package</option>
134 <option $selected_desc value="Desc">$desc</option>
135 <option $selected_tags value="Tags">$tags</option>
136 <option $selected_depends value="Depends">$depends</option>
137 <option $selected_file value="File">$file</option>
138 <option $selected_file_list value="File_list">$file_list</option>
139 </select>
140 <strong>:</strong>
141 <input type="text" name="query" size="32" value="$SEARCH">
142 <select name="version">
143 <option value="cooking">$cooking</option>
144 <option $selected_stable value="stable">$stable</option>
145 <option $selected_1 value="1.0">1.0</option>
146 </select>
147 <input type="submit" name="search" value="$search">
148 </form>
149 </div>
150 _EOT_
151 }
153 # xHTML Header.
154 xhtml_header()
155 {
156 cat << _EOF_
157 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
158 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
159 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="$LANG" lang="$LANG">
160 <head>
161 <title>SliTaz Packages - Search $SEARCH</title>
162 <meta http-equiv="content-type" content="text/html; charset=$charset" />
163 <meta name="description" content="Au sujet de SliTaz GNU/Linux mini système d'exploitation" />
164 <meta name="keywords" lang="fr" content="Système, libre, gnu, linux, opensource, livecd" />
165 <meta name="robots" content="index, follow, all" />
166 <meta name="revisit-after" content="7 days" />
167 <meta name="expires" content="never" />
168 <meta name="modified" content="$DATE" />
169 <meta name="author" content="ash, grep, sed and cat"/>
170 <meta name="publisher" content="www.slitaz.org" />
171 <link rel="shortcut icon" href="http://pkgs.slitaz.org/favicon.ico" />
172 <link rel="stylesheet" type="text/css" href="http://pkgs.slitaz.org/slitaz.css" />
173 </head>
174 <body bgcolor="#ffffff">
176 <!-- Header -->
177 <div id="header">
178 <a name="top"></a>
179 <!-- Access -->
180 <div id="access">
181 <a href="http://www.slitaz.org/" title="SliTaz Web site">Website</a> |
182 <a href="http://wiki.slitaz.org/" title="SliTaz Community Wiki">Wiki</a> |
183 <a href="http://labs.slitaz.org/" title="SliTaz laboratories">Labs</a>
184 </div>
185 <a href="http://pkgs.slitaz.org/"><img id="logo"
186 src="http://pkgs.slitaz.org/pics/website/logo.png" title="pkgs.slitaz.org" alt="pkgs.slitaz.org"
187 style="border: 0px solid ; width: 200px; height: 74px;" /></a>
188 <p id="titre">#!/tazpkg/packages</p>
189 </div>
190 _EOF_
191 }
193 # xHTML Footer.
194 xhtml_footer()
195 {
196 cat << _EOT_
197 <center>
198 <i>$(ls /home/slitaz/$SLITAZ_VERSION/wok | wc -l) packages and $(unlzma -c /home/slitaz/$SLITAZ_VERSION/packages/files.list.lzma | wc -l) files in $SLITAZ_VERSION database</i>
199 </center>
201 <!-- End of content with round corner -->
202 </div>
203 <div id="content_bottom">
204 <div class="bottom_left"></div>
205 <div class="bottom_right"></div>
206 </div>
208 <!-- Start of footer and copy notice -->
209 <div id="copy">
210 <p>
211 Dernière modification : $DATE -
212 <a href="#top">Top of the page</a>
213 </p>
214 <p>
215 Copyright &copy; 2009 <a href="http://www.slitaz.org/">SliTaz</a> -
216 <a href="http://www.gnu.org/licenses/gpl.html">GNU General Public License</a>
217 </p>
218 <!-- End of copy -->
219 </div>
221 <!-- Bottom and logo's -->
222 <div id="bottom">
223 <p>
224 <a href="http://validator.w3.org/check?uri=referer"><img
225 src="http://pkgs.slitaz.org/pics/website/xhtml10.png" alt="Valid XHTML 1.0"
226 title="Code validé XHTML 1.0"
227 style="width: 80px; height: 15px;" /></a>
228 </p>
229 </div>
231 </body>
232 </html>
233 _EOT_
234 }
236 # recursive dependencies scan
237 dep_scan()
238 {
239 for i in $1; do
240 case " $ALL_DEPS " in
241 *\ $i\ *) continue;;
242 esac
243 ALL_DEPS="$ALL_DEPS $i"
244 if [ -n "$2" ]; then
245 echo -n "$2"
246 (
247 . $WOK/$i/receipt
248 cat << _EOT_
249 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> : $SHORT_DESC
250 _EOT_
251 )
252 fi
253 [ -f $WOK/$i/receipt ] || continue
254 DEPENDS=""
255 . $WOK/$i/receipt
256 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
257 done
258 }
260 # recursive reverse dependencies scan
261 rdep_scan()
262 {
263 SEARCH=$1
264 case "$SEARCH" in
265 glibc-base|gcc-lib-base) cat <<EOT
266 glibc-base and gcc-lib-base are implicit dependencies
267 <b>every</b> packages are supposed to depend on them.
268 EOT
269 return;;
270 esac
271 for i in $WOK/* ; do
272 DEPENDS=""
273 . $i/receipt
274 echo "$(basename $i) $(echo $DEPENDS)"
275 done | awk -v search=$SEARCH '
276 function show_deps(deps, all_deps, pkg, space)
277 {
278 if (all_deps[pkg] == 1) return
279 all_deps[pkg] = 1
280 if (space != "") printf "%s%s\n",space,pkg
281 for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
282 show_deps(deps, all_deps, mydeps[i],"////" space)
283 }
284 }
286 {
287 all_deps[$1] = 0
288 for (i = 2; i <= NF; i++)
289 deps[$i] = deps[$i] " " $1
290 }
292 END {
293 show_deps(deps, all_deps, search, "")
294 }
295 ' | while read pkg; do
296 . $WOK/${pkg##*/}/receipt
297 cat << _EOT_
298 $(echo ${pkg%/*} | sed 's|/| |g') <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> : $SHORT_DESC
299 _EOT_
300 done
301 }
303 # Display search form and result if requested.
304 if [ "$REQUEST_METHOD" != "POST" ]; then
305 xhtml_header
306 cat << _EOT_
308 <!-- Content top. -->
309 <div id="content_top">
310 <div class="top_left"></div>
311 <div class="top_right"></div>
312 </div>
314 <!-- Content -->
315 <div id="content">
316 <a name="content"></a>
318 <h1><font color="#3E1220">$package</font></h1>
319 <h2><font color="#DF8F06">$search</font></h2>
320 _EOT_
321 search_form
322 xhtml_footer
323 else
324 xhtml_header
325 cat << _EOT_
327 <!-- Content top. -->
328 <div id="content_top">
329 <div class="top_left"></div>
330 <div class="top_right"></div>
331 </div>
333 <!-- Content -->
334 <div id="content">
335 <a name="content"></a>
337 <h1><font color="#3E1220">$package</font></h1>
338 <h2><font color="#DF8F06">$search</font></h2>
339 _EOT_
340 search_form
341 if [ "$OBJECT" = "Depends" ]; then
342 if [ -f $WOK/$SEARCH/receipt ]; then
343 cat << _EOT_
345 <h3>$deptree</h3>
346 <pre class="package">
347 _EOT_
348 ALL_DEPS=""
349 dep_scan $SEARCH ""
350 SUGGESTED=""
351 . $WOK/$SEARCH/receipt
352 if [ -n "$SUGGESTED" ]; then
353 cat << _EOT_
354 </pre>
356 <h3>$deptree (SUGGESTED)</h3>
357 <pre class="package">
358 _EOT_
359 ALL_DEPS=""
360 dep_scan "$SUGGESTED" " "
361 fi
362 cat << _EOT_
363 </pre>
365 <h3>$rdeptree</h3>
366 <pre class="package">
367 _EOT_
368 ALL_DEPS=""
369 rdep_scan $SEARCH
370 else
371 cat << _EOT_
373 <h3>$noresult</h3>
374 <pre class="package">
375 _EOT_
376 fi
377 elif [ "$OBJECT" = "File" ]; then
378 cat << _EOT_
380 <h3>$result</h3>
381 <pre class="package">
382 _EOT_
383 last=""
384 unlzma -c /home/slitaz/$SLITAZ_VERSION/packages/files.list.lzma \
385 | grep $SEARCH | while read pkg file; do
386 echo "$file" | grep -q $SEARCH || continue
387 if [ "$last" != "${pkg%:}" ]; then
388 last=${pkg%:}
389 (
390 . $WOK/$last/receipt
391 cat << _EOT_
393 <i><b><a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a></b> $SHORT_DESC</i>
394 _EOT_
395 )
396 fi
397 echo " $file"
398 done
399 elif [ "$OBJECT" = "File_list" ]; then
400 cat << _EOT_
402 <h3>$result</h3>
403 <pre class="package">
404 _EOT_
405 last=""
406 unlzma -c /home/slitaz/$SLITAZ_VERSION/packages/files.list.lzma \
407 | grep ^$SEARCH: | sed 's/.*: / /' | sort
408 elif [ "$OBJECT" = "Desc" ]; then
409 cat << _EOT_
411 <h3>$result</h3>
412 <pre class="package">
413 _EOT_
414 last=""
415 grep -i $SEARCH /home/slitaz/$SLITAZ_VERSION/packages/packages.desc | \
416 sort | while read pkg extras ; do
417 . $WOK/$pkg/receipt
418 cat << _EOT_
419 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> : $SHORT_DESC
420 _EOT_
421 done
422 elif [ "$OBJECT" = "Tags" ]; then
423 cat << _EOT_
425 <h3>$result</h3>
426 <pre class="package">
427 _EOT_
428 last=""
429 grep ^TAGS= $WOK/*/receipt | grep -i $SEARCH | \
430 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
431 . $WOK/$pkg/receipt
432 cat << _EOT_
433 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> : $SHORT_DESC
434 _EOT_
435 done
436 else
437 cat << _EOT_
439 <h3>$result</h3>
440 <pre class="package">
441 _EOT_
442 for pkg in `ls $WOK | grep $SEARCH`
443 do
444 . $WOK/$pkg/receipt
445 cat << _EOT_
446 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> : $SHORT_DESC
447 _EOT_
448 done
449 equiv=/home/slitaz/$SLITAZ_VERSION/packages/packages.equiv
450 vpkgs="$(cat $equiv | cut -d= -f1 | grep $SEARCH)"
451 for vpkg in $vpkgs ; do
452 cat << _EOT_
453 </pre>
455 <h3>$result (package providing $vpkg)</h3>
456 <pre class="package">
457 _EOT_
458 for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do
459 . $WOK/${pkg#*:}/receipt
460 cat << _EOT_
461 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> : $SHORT_DESC
462 _EOT_
463 done
464 done
465 fi
466 cat << _EOT_
467 </pre>
468 _EOT_
469 xhtml_footer
470 fi
472 exit 0