# HG changeset patch # User Pascal Bellard # Date 1243677219 -7200 # Node ID 074295c8603ea87dfe93312bcadd8682a3f57ea6 # Parent b0788eda3c6ee708139ed0c2b8574a8317b52ecd mirror-tools: add search.cgi from pkgs.slitaz.org diff -r b0788eda3c6e -r 074295c8603e mirror-tools/stuff/var/www/pkgs/search.cgi --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mirror-tools/stuff/var/www/pkgs/search.cgi Sat May 30 11:53:39 2009 +0200 @@ -0,0 +1,472 @@ +#!/bin/sh +# Tiny CGI search engine for SliTaz packages on http://pkgs.slitaz.org/ +# Christophe Lincoln +# + +read QUERY_STRING +for i in $(echo $QUERY_STRING | sed 's/&/ /g'); do + eval $i +done +LANG=$lang +SEARCH=$query +SLITAZ_VERSION=$version +OBJECT=$object +DATE=`date +%Y-%m-%d\ \%H:%M:%S` +VERSION=cooking +if [ "$REQUEST_METHOD" = "GET" ]; then + SEARCH="" + for i in $(echo $REQUEST_URI | sed 's/[?&]/ /g'); do + SLITAZ_VERSION=cooking + case "$i" in + lang=*) + LANG=${i#*=};; + file=*) + SEARCH=${i#*=} + OBJECT=File;; + desc=*) + SEARCH=${i#*=} + OBJECT=Desc;; + tags=*) + SEARCH=${i#*=} + OBJECT=Tags;; + filelist=*) + SEARCH=${i#*=} + OBJECT=File_list;; + package=*) + SEARCH=${i#*=} + OBJECT=Package;; + depends=*) + SEARCH=${i#*=} + OBJECT=Depends;; + version=s*|version=2*) + SLITAZ_VERSION=stable;; + version=1*) + SLITAZ_VERSION=1.0;; + esac + done + [ -n "$SEARCH" ] && REQUEST_METHOD="POST" +fi + +case "$OBJECT" in +File) selected_file="selected";; +Desc) selected_desc="selected";; +Tags) selected_tags="selected";; +File_list) selected_file_list="selected";; +Depends) selected_depends="selected";; +esac + +case "$SLITAZ_VERSION" in +1.0) selected_1="selected";; +stable) selected_stable="selected";; +esac + +# unescape query +SEARCH="$(echo $SEARCH | sed 's/%2B/+/g' | sed 's/%3A/:/g' | sed 's|%2F|/|g')" + +package="Package" +file="File" +desc="Description" +tags="Tags" +file_list="File list" +depends="Depends" +search="Search" +cooking="cooking" +stable="stable" +result="Result for : $SEARCH" +noresult="No package $SEARCH" +deptree="Dependency tree for : $SEARCH" +rdeptree="Reverse dependency tree for : $SEARCH" +charset="ISO-8859-1" +case "$LANG" in +fr) package="Paquet" + depends="Dépendances" + search="Recherche" + result="Recherche de : $SEARCH" + noresult="Paquet $SEARCH introuvable" + deptree="Arbre des dépendances de $SEARCH" + rdeptree="Arbre inversé des dépendances de $SEARCH" + file_list="Liste des fichiers" + file="Fichier";; +de) package="Paket" + depends="Abhängigkeiten" + search="Suche" + cooking="Cooking" + stable="Stable" + result="Resultate für : $SEARCH" + noresult="Kein Paket für $SEARCH" + deptree="Abhängigkeiten von: $SEARCH" + rdeptree="Abhängigkeit für: $SEARCH" + file_list="Datei liste" + file="Datei";; +pt) package="Pacote" + search="Buscar" + cooking="cooking" + stable="stable" + result="Resultado para : $SEARCH" + noresult="Sem resultado: $SEARCH" + deptree="Árvore de dependências para: $SEARCH" + rdeptree="Árvore de dependências reversa para: $SEARCH" + depends="Dependências" + file_list="Arquivo lista" + file="Arquivo";; +cn) package="软件包:" + cooking="å¼€å‘版" + stable="稳定版" + charset="UTF-8";; +*) LANG="en";; +esac +WOK=/home/slitaz/$SLITAZ_VERSION/wok + + +echo Content-type: text/html +echo + +# Search form +search_form() +{ + cat << _EOT_ + +
+
+ + + : + + + +
+
+_EOT_ +} + +# xHTML Header. +xhtml_header() +{ + cat << _EOF_ + + + + SliTaz Packages - Search $SEARCH + + + + + + + + + + + + + + + + +_EOF_ +} + +# xHTML Footer. +xhtml_footer() +{ + cat << _EOT_ +
+$(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 +
+ + + +
+
+
+
+ + +
+

+Dernière modification : $DATE - +Top of the page +

+

+Copyright © 2009 SliTaz - +GNU General Public License +

+ +
+ + +
+

+Valid XHTML 1.0 +

+
+ + + +_EOT_ +} + +# recursive dependencies scan +dep_scan() +{ +for i in $1; do + case " $ALL_DEPS " in + *\ $i\ *) continue;; + esac + ALL_DEPS="$ALL_DEPS $i" + if [ -n "$2" ]; then + echo -n "$2" + ( + . $WOK/$i/receipt + cat << _EOT_ +$PACKAGE : $SHORT_DESC +_EOT_ + ) + fi + [ -f $WOK/$i/receipt ] || continue + DEPENDS="" + . $WOK/$i/receipt + [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 " +done +} + +# recursive reverse dependencies scan +rdep_scan() +{ +SEARCH=$1 +case "$SEARCH" in +glibc-base|gcc-lib-base) cat <every packages are supposed to depend on them. +EOT + return;; +esac +for i in $WOK/* ; do + DEPENDS="" + . $i/receipt + echo "$(basename $i) $(echo $DEPENDS)" +done | awk -v search=$SEARCH ' +function show_deps(deps, all_deps, pkg, space) +{ + if (all_deps[pkg] == 1) return + all_deps[pkg] = 1 + if (space != "") printf "%s%s\n",space,pkg + for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) { + show_deps(deps, all_deps, mydeps[i],"////" space) + } +} + +{ + all_deps[$1] = 0 + for (i = 2; i <= NF; i++) + deps[$i] = deps[$i] " " $1 +} + +END { + show_deps(deps, all_deps, search, "") +} +' | while read pkg; do + . $WOK/${pkg##*/}/receipt + cat << _EOT_ +$(echo ${pkg%/*} | sed 's|/| |g') $PACKAGE : $SHORT_DESC +_EOT_ +done +} + +# Display search form and result if requested. +if [ "$REQUEST_METHOD" != "POST" ]; then + xhtml_header + cat << _EOT_ + + +
+
+
+
+ + +
+ + +

$package

+

$search

+_EOT_ + search_form + xhtml_footer +else + xhtml_header + cat << _EOT_ + + +
+
+
+
+ + +
+ + +

$package

+

$search

+_EOT_ + search_form + if [ "$OBJECT" = "Depends" ]; then + if [ -f $WOK/$SEARCH/receipt ]; then + cat << _EOT_ + +

$deptree

+
+_EOT_
+			ALL_DEPS=""
+			dep_scan $SEARCH ""
+			SUGGESTED=""
+			. $WOK/$SEARCH/receipt
+			if [ -n "$SUGGESTED" ]; then
+				cat << _EOT_
+
+ +

$deptree (SUGGESTED)

+
+_EOT_
+				ALL_DEPS=""
+				dep_scan "$SUGGESTED" "    "
+			fi
+			cat << _EOT_
+
+ +

$rdeptree

+
+_EOT_
+			ALL_DEPS=""
+			rdep_scan $SEARCH
+		else
+			cat << _EOT_
+
+

$noresult

+
+_EOT_
+		fi
+	elif [ "$OBJECT" = "File" ]; then
+		cat << _EOT_
+
+

$result

+
+_EOT_
+		last=""
+		unlzma -c /home/slitaz/$SLITAZ_VERSION/packages/files.list.lzma \
+		| grep $SEARCH | while read pkg file; do
+			echo "$file" | grep -q $SEARCH || continue
+			if [ "$last" != "${pkg%:}" ]; then
+				last=${pkg%:}
+				(
+				. $WOK/$last/receipt
+				cat << _EOT_
+
+$PACKAGE $SHORT_DESC
+_EOT_
+				)
+			fi
+			echo "    $file"
+		done
+	elif [ "$OBJECT" = "File_list" ]; then
+		cat << _EOT_
+
+

$result

+
+_EOT_
+		last=""
+		unlzma -c /home/slitaz/$SLITAZ_VERSION/packages/files.list.lzma \
+		| grep ^$SEARCH: |  sed 's/.*: /    /' | sort
+	elif [ "$OBJECT" = "Desc" ]; then
+		cat << _EOT_
+
+

$result

+
+_EOT_
+		last=""
+		grep -i $SEARCH /home/slitaz/$SLITAZ_VERSION/packages/packages.desc | \
+		sort | while read pkg extras ; do
+				. $WOK/$pkg/receipt
+				cat << _EOT_
+$PACKAGE : $SHORT_DESC
+_EOT_
+			done
+	elif [ "$OBJECT" = "Tags" ]; then
+		cat << _EOT_
+
+

$result

+
+_EOT_
+		last=""
+		grep ^TAGS= $WOK/*/receipt |  grep -i $SEARCH | \
+		sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
+				. $WOK/$pkg/receipt
+				cat << _EOT_
+$PACKAGE : $SHORT_DESC
+_EOT_
+			done
+	else
+		cat << _EOT_
+
+

$result

+
+_EOT_
+		for pkg in `ls $WOK | grep $SEARCH`
+		do
+			. $WOK/$pkg/receipt
+			cat << _EOT_
+$PACKAGE : $SHORT_DESC
+_EOT_
+		done
+		equiv=/home/slitaz/$SLITAZ_VERSION/packages/packages.equiv
+		vpkgs="$(cat $equiv | cut -d= -f1 | grep $SEARCH)"
+		for vpkg in $vpkgs ; do
+	cat << _EOT_
+
+ +

$result (package providing $vpkg)

+
+_EOT_
+			for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do
+				. $WOK/${pkg#*:}/receipt
+				cat << _EOT_
+$PACKAGE : $SHORT_DESC
+_EOT_
+			done
+		done
+	fi
+	cat << _EOT_
+
+_EOT_ + xhtml_footer +fi + +exit 0