tazpkg diff pkgs.cgi @ rev 627

Add tazpanel files
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Jun 29 20:18:19 2013 +0200 (2013-06-29)
parents
children 3a1edf27791c
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/pkgs.cgi	Sat Jun 29 20:18:19 2013 +0200
     1.3 @@ -0,0 +1,996 @@
     1.4 +#!/bin/sh
     1.5 +#
     1.6 +# TazPKG CGI interface - Manage packages via a browser
     1.7 +#
     1.8 +# This CGI interface extensively uses tazpkg to manage packages and have
     1.9 +# its own code for some tasks. Please KISS, it is important and keep speed
    1.10 +# in mind. Thanks, Pankso.
    1.11 +#
    1.12 +# (C) 2011 SliTaz GNU/Linux - BSD License
    1.13 +#
    1.14 +
    1.15 +. lib/libtazpanel
    1.16 +get_config
    1.17 +header
    1.18 +
    1.19 +# xHTML 5 header with special side bar for categories.
    1.20 +TITLE=$(gettext 'TazPanel - Packages')
    1.21 +xhtml_header | sed 's/id="content"/id="content-sidebar"/'
    1.22 +
    1.23 +pkg_info_link()
    1.24 +{
    1.25 +	echo "$SCRIPT_NAME?info=$1" | sed 's/+/%2B/g'
    1.26 +}
    1.27 +
    1.28 +i18n_desc() {
    1.29 +	# Display localized short description
    1.30 +	if [ -e "$LOCALSTATE/packages-desc.$LANG" ]; then
    1.31 +		LOCDESC=$(grep -e "^$pkg	" $LOCALSTATE/packages-desc.$LANG | cut -d'	' -f2)
    1.32 +	[ "x$LOCDESC" != "x" ] && SHORT_DESC="$LOCDESC"
    1.33 +	fi
    1.34 +}
    1.35 +
    1.36 +# We need packages information for list and search
    1.37 +parse_packages_desc() {
    1.38 +	IFS="|"
    1.39 +	cut -f 1,2,3,5 -d "|" | while read PACKAGE VERSION SHORT_DESC WEB_SITE
    1.40 +	do
    1.41 +		image=tazpkg-installed.png
    1.42 +		[ -d $INSTALLED/${PACKAGE% } ] || image=tazpkg.png
    1.43 +		i18n_desc
    1.44 +		cat << EOT
    1.45 +<tr>
    1.46 +<td><input type="checkbox" name="pkg" value="$PACKAGE">
    1.47 +	<a href="$(pkg_info_link $PACKAGE)"><img
    1.48 +		src="$IMAGES/$image"/>$PACKAGE</a></td>
    1.49 +<td>$VERSION</td>
    1.50 +<td class="desc">$SHORT_DESC</td>
    1.51 +<td><a href="$WEB_SITE"><img src="$IMAGES/browser.png"/></a></td>
    1.52 +</tr>
    1.53 +EOT
    1.54 +	done
    1.55 +	unset IFS
    1.56 +}
    1.57 +
    1.58 +# Display a full summary of packages stats
    1.59 +packages_summary() {
    1.60 +	cat << EOT
    1.61 +<table class="zebra outbox">
    1.62 +<tbody>
    1.63 +<tr><td>$(gettext 'Last recharge:')</td>
    1.64 +EOT
    1.65 +	stat=$(stat -c %y $LOCALSTATE/packages.list | \
    1.66 +		sed 's/\(:..\):.*/\1/' | awk '{print $1}')
    1.67 +	mtime=$(find $LOCALSTATE/packages.list -mtime +10)
    1.68 +	echo -n "<td>$stat "
    1.69 +	if [ "$mtime" ]; then
    1.70 +		gettext '(Older than 10 days)'; echo
    1.71 +	else
    1.72 +		gettext '(Not older than 10 days)'; echo
    1.73 +	fi
    1.74 +	cat << EOT
    1.75 +</td></tr>
    1.76 +<tr><td>$(gettext 'Installed packages:')</td>
    1.77 +	<td>$(ls $INSTALLED | wc -l)</td></tr>
    1.78 +<tr><td>$(gettext 'Mirrored packages:')</td>
    1.79 +	<td>$(cat $LOCALSTATE/packages.list | wc -l)</td></tr>
    1.80 +<tr><td>$(gettext 'Upgradeable packages:')</td>
    1.81 +	<td>$(cat $LOCALSTATE/packages.up | wc -l)</td></tr>
    1.82 +<tr><td>$(gettext 'Installed files:')</td>
    1.83 +	<td>$(cat $INSTALLED/*/files.list | wc -l)</td></tr>
    1.84 +<tr><td>$(gettext 'Blocked packages:')</td>
    1.85 +	<td>$(cat $LOCALSTATE/blocked-packages.list | wc -l)</td></tr>
    1.86 +</tbody>
    1.87 +</table>
    1.88 +EOT
    1.89 +}
    1.90 +
    1.91 +# Parse mirrors list to be able to have an icon and remove link
    1.92 +list_mirrors() {
    1.93 +	while read line
    1.94 +	do
    1.95 +		cat << EOT
    1.96 +<li>
    1.97 +	<a href="$SCRIPT_NAME?admin=rm-mirror=$line&amp;file=$(httpd -e $1)">
    1.98 +		<img src="$IMAGES/clear.png" title="$(gettext 'Delete')" />
    1.99 +	</a>
   1.100 +	<a href="$SCRIPT_NAME?admin=select-mirror&amp;mirror=$line">
   1.101 +		<img src="$IMAGES/start.png" title="$(gettext 'Use as default')" />
   1.102 +	</a>
   1.103 +	<a href="$line">$line</a>
   1.104 +</li>
   1.105 +EOT
   1.106 +	done < $1
   1.107 +}
   1.108 +
   1.109 +# Parse repositories list to be able to have an icon and remove link
   1.110 +list_repos() {
   1.111 +	ls $LOCALSTATE/undigest 2> /dev/null | while read repo ; do
   1.112 +		cat <<EOT
   1.113 +	<li><a href="$SCRIPT_NAME?admin=rm-repo=$repo">
   1.114 +	    <img src="$IMAGES/clear.png">$repo</a></li>
   1.115 +EOT
   1.116 +	done
   1.117 +}
   1.118 +
   1.119 +#
   1.120 +# xHTML functions
   1.121 +#
   1.122 +
   1.123 +# ENTER will search but user may search for a button, so put one.
   1.124 +search_form() {
   1.125 +	[ -n "$repo" ] || repo="$(GET repo)"
   1.126 +	[ -n "$repo" ] || repo=Any
   1.127 +	cat << EOT
   1.128 +<div class="search">
   1.129 +	<form method="get" action="$SCRIPT_NAME">
   1.130 +		<p>
   1.131 +			<input type="text" name="search" size="20">
   1.132 +			<input type="submit" value="$(gettext 'Search')">
   1.133 +			<input class="radius" type="submit" name="files"
   1.134 +				value="$(gettext 'Files')">
   1.135 +			<input type="hidden" name="repo" value="$repo" />
   1.136 +		</p>
   1.137 +	</form>
   1.138 +</div>
   1.139 +EOT
   1.140 +}
   1.141 +
   1.142 +table_head() {
   1.143 +	cat << EOT
   1.144 +		<thead>
   1.145 +		<tr>
   1.146 +			<td>$(gettext 'Name')</td>
   1.147 +			<td>$(gettext 'Version')</td>
   1.148 +			<td>$(gettext 'Description')</td>
   1.149 +			<td>$(gettext 'Web')</td>
   1.150 +		</tr>
   1.151 +		</thead>
   1.152 +EOT
   1.153 +}
   1.154 +
   1.155 +sidebar() {
   1.156 +	[ -n "$repo" ] || repo=Public
   1.157 +	cat << EOT
   1.158 +<div id="sidebar">
   1.159 +	<h4>$(gettext 'Categories')</h4>
   1.160 +	<a class="active_base-system" href="$SCRIPT_NAME?cat=base-system&repo=$repo">$(gettext 'Base-system')</a>
   1.161 +	<a class="active_x-window" href="$SCRIPT_NAME?cat=x-window&repo=$repo">$(gettext 'X window')</a>
   1.162 +	<a class="active_utilities" href="$SCRIPT_NAME?cat=utilities&repo=$repo">$(gettext 'Utilities')</a>
   1.163 +	<a class="active_network" href="$SCRIPT_NAME?cat=network&repo=$repo">$(gettext 'Network')</a>
   1.164 +	<a class="active_games" href="$SCRIPT_NAME?cat=games&repo=$repo">$(gettext 'Games')</a>
   1.165 +	<a class="active_graphics" href="$SCRIPT_NAME?cat=graphics&repo=$repo">$(gettext 'Graphics')</a>
   1.166 +	<a class="active_office" href="$SCRIPT_NAME?cat=office&repo=$repo">$(gettext 'Office')</a>
   1.167 +	<a class="active_multimedia" href="$SCRIPT_NAME?cat=multimedia&repo=$repo">$(gettext 'Multimedia')</a>
   1.168 +	<a class="active_development" href="$SCRIPT_NAME?cat=development&repo=$repo">$(gettext 'Development')</a>
   1.169 +	<a class="active_system-tools" href="$SCRIPT_NAME?cat=system-tools&repo=$repo">$(gettext 'System tools')</a>
   1.170 +	<a class="active_security" href="$SCRIPT_NAME?cat=security&repo=$repo">$(gettext 'Security')</a>
   1.171 +	<a class="active_misc" href="$SCRIPT_NAME?cat=misc&repo=$repo">$(gettext 'Misc')</a>
   1.172 +	<a class="active_meta" href="$SCRIPT_NAME?cat=meta&repo=$repo">$(gettext 'Meta')</a>
   1.173 +	<a class="active_non-free" href="$SCRIPT_NAME?cat=non-free&repo=$repo">$(gettext 'Non free')</a>
   1.174 +	<a class="active_all" href="$SCRIPT_NAME?cat=all&repo=$repo">$(gettext 'All')</a>
   1.175 +EOT
   1.176 +
   1.177 +	if [ -d $LOCALSTATE/undigest ]; then
   1.178 +		[ -n "$category" ] || category="base-system"
   1.179 +		cat << EOT
   1.180 +	<h4>$(gettext 'Repositories')</h4>
   1.181 +	<a class="repo_Public" href="$SCRIPT_NAME?repo=Public&cat=$category">$(gettext 'Public')</a>
   1.182 +EOT
   1.183 +		for i in $(ls $LOCALSTATE/undigest); do
   1.184 +			cat << EOT
   1.185 +	<a class="repo_$i" href="$SCRIPT_NAME?repo=$i&cat=$category">$i</a>
   1.186 +EOT
   1.187 +		done
   1.188 +		cat << EOT
   1.189 +	<a class="repo_Any" href="$SCRIPT_NAME?repo=Any&cat=$category">$(gettext 'Any')</a>
   1.190 +EOT
   1.191 +	fi
   1.192 +	echo "</div>"
   1.193 +}
   1.194 +
   1.195 +repo_list() {
   1.196 +	if [ -n "$(ls $LOCALSTATE/undigest/ 2> /dev/null)" ]; then
   1.197 +		case "$repo" in
   1.198 +		Public)	;;
   1.199 +		""|Any) for i in $LOCALSTATE/undigest/* ; do
   1.200 +				[ -d "$i" ] && echo "$i$1"
   1.201 +			done ;;
   1.202 +		*)	echo "$LOCALSTATE/undigest/$repo$1"
   1.203 +			return ;;
   1.204 +		esac
   1.205 +	fi
   1.206 +	echo "$LOCALSTATE$1"
   1.207 +}
   1.208 +
   1.209 +repo_name() {
   1.210 +	case "$1" in
   1.211 +	$LOCALSTATE)		echo "Public" ;;
   1.212 +	$LOCALSTATE/undigest/*)	echo ${1#$LOCALSTATE/undigest/} ;;
   1.213 +	esac
   1.214 +}
   1.215 +
   1.216 +#
   1.217 +# Commands
   1.218 +#
   1.219 +
   1.220 +case " $(GET) " in
   1.221 +	*\ list\ *)
   1.222 +		#
   1.223 +		# List installed packages. This is the default because parsing
   1.224 +		# the full packages.desc can be long and take up some resources
   1.225 +		#
   1.226 +		cd $INSTALLED
   1.227 +		search_form
   1.228 +		sidebar
   1.229 +		LOADING_MSG="$(gettext 'Listing packages...')"
   1.230 +		loading_msg
   1.231 +		cat << EOT
   1.232 +<h2>$(gettext 'My packages')</h2>
   1.233 +<form method='get' action='$SCRIPT_NAME'>
   1.234 +	<input type="hidden" name="do" value="Remove" />
   1.235 +<div id="actions">
   1.236 +	<div class="float-left">
   1.237 +		$(gettext 'Selection:')
   1.238 +		<input type="submit" value="$(gettext 'Remove')" />
   1.239 +	</div>
   1.240 +	<div class="float-right">
   1.241 +		<a class="button" href="$SCRIPT_NAME?recharge">
   1.242 +			<img src="$IMAGES/recharge.png" />$(gettext 'Recharge list')</a>
   1.243 +		<a class="button" href='$SCRIPT_NAME?up'>
   1.244 +			<img src="$IMAGES/update.png" />$(gettext 'Check upgrades')</a>
   1.245 +	</div>
   1.246 +</div>
   1.247 +EOT
   1.248 +		cat << EOT
   1.249 +<table class="zebra outbox">
   1.250 +$(table_head)
   1.251 +<tbody>
   1.252 +EOT
   1.253 +		for pkg in *
   1.254 +		do
   1.255 +			. $pkg/receipt
   1.256 +			echo '<tr>'
   1.257 +			# Use default tazpkg icon since all packages displayed are
   1.258 +			# installed
   1.259 +			colorpkg=$pkg
   1.260 +			grep -qs "^$pkg$" $LOCALSTATE/blocked-packages.list &&
   1.261 +				colorpkg="<span style='color: red;'>$pkg</span>"
   1.262 +			i18n_desc
   1.263 +			cat << EOT
   1.264 +<td class="pkg">
   1.265 +	<input type="checkbox" name="pkg" value="$pkg" />
   1.266 +		<a href="$(pkg_info_link $pkg)"><img
   1.267 +			src="$IMAGES/tazpkg-installed.png"/>$colorpkg</a></td>
   1.268 +<td>$VERSION</td>
   1.269 +<td class="desc">$SHORT_DESC</td>
   1.270 +<td><a href="$WEB_SITE"><img src="$IMAGES/browser.png"/></a></td>
   1.271 +</tr>
   1.272 +EOT
   1.273 +		done
   1.274 +		cat << EOT
   1.275 +</tbody>
   1.276 +</table>
   1.277 +</form>
   1.278 +EOT
   1.279 +		;;
   1.280 +
   1.281 +	*\ linkable\ *)
   1.282 +		#
   1.283 +		# List linkable packages.
   1.284 +		#
   1.285 +		cd $INSTALLED
   1.286 +		search_form
   1.287 +		sidebar
   1.288 +		LOADING_MSG=$(gettext 'Listing linkable packages...')
   1.289 +		loading_msg
   1.290 +		cat << EOT
   1.291 +<h2>$(gettext 'Linkable packages')</h2>
   1.292 +
   1.293 +<form method='get' action='$SCRIPT_NAME'>
   1.294 +	<input type="hidden" name="do" value="Link" />
   1.295 +<div id="actions">
   1.296 +	<div class="float-left">
   1.297 +		$(gettext 'Selection:')
   1.298 +		<input type="submit" value="$(gettext 'Link')" />
   1.299 +	</div>
   1.300 +	<div class="float-right">
   1.301 +		<a class="button" href="$SCRIPT_NAME?recharge">
   1.302 +			<img src="$IMAGES/recharge.png" />$(gettext 'Recharge list')</a>
   1.303 +		<a class="button" href="$SCRIPT_NAME?up">
   1.304 +			<img src="$IMAGES/update.png" />$(gettext 'Check upgrades')</a>
   1.305 +	</div>
   1.306 +</div>
   1.307 +EOT
   1.308 +		cat << EOT
   1.309 +<table class="zebra outbox">
   1.310 +$(table_head)
   1.311 +<tbody>
   1.312 +EOT
   1.313 +		target=$(readlink $LOCALSTATE/fslink)
   1.314 +		for pkg in $(ls $target/$INSTALLED)
   1.315 +		do
   1.316 +			[ -s $pkg/receipt ] && continue
   1.317 +			. $target/$INSTALLED/$pkg/receipt
   1.318 +			i18n_desc
   1.319 +			cat << EOT
   1.320 +<tr>
   1.321 +	<td class="pkg">
   1.322 +		<input type="checkbox" name="pkg" value="$pkg" />
   1.323 +			<a href="$(pkg_info_link $pkg)"><img
   1.324 +				src="$IMAGES/tazpkg.png"/>$pkg</a>
   1.325 +	</td>
   1.326 +	<td>$VERSION</td>
   1.327 +	<td class="desc">$SHORT_DESC</td>
   1.328 +	<td><a href="$WEB_SITE"><img src="$IMAGES/browser.png"/></a></td>
   1.329 +</tr>
   1.330 +EOT
   1.331 +		done
   1.332 +		cat << EOT
   1.333 +</tbody>
   1.334 +</table>
   1.335 +</form>
   1.336 +EOT
   1.337 +		;;
   1.338 +
   1.339 +
   1.340 +	*\ cat\ *)
   1.341 +		#
   1.342 +		# List all available packages by category on mirror. Listing all
   1.343 +		# packages is too resource intensive and not useful.
   1.344 +		#
   1.345 +		cd  $LOCALSTATE
   1.346 +		repo=$(GET repo)
   1.347 +		category=$(GET cat)
   1.348 +		[ "$category" == "cat" ] && category="base-system"
   1.349 +		grep_category=$category
   1.350 +		[ "$grep_category" == "all" ] && grep_category=".*"
   1.351 +		search_form
   1.352 +		sidebar | sed "s/active_$category/active/;s/repo_$repo/active/"
   1.353 +		LOADING_MSG="$(gettext 'Listing packages...')"
   1.354 +		loading_msg
   1.355 +		cat << EOT
   1.356 +<h2>$(eval_gettext 'Category: $category')</h2>
   1.357 +
   1.358 +<form method='get' action='$SCRIPT_NAME'>
   1.359 +<div id="actions">
   1.360 +<div class="float-left">
   1.361 +	$(gettext 'Selection:')
   1.362 +	<input type="submit" name="do" value="Install" />
   1.363 +	<input type="submit" name="do" value="Remove" />
   1.364 +	<input type="hidden" name="repo" value="$repo" />
   1.365 +</div>
   1.366 +<div class="float-right">
   1.367 +	<a class="button" href="$SCRIPT_NAME?recharge">
   1.368 +		<img src="$IMAGES/recharge.png" />$(gettext 'Recharge list')</a>
   1.369 +	<a class="button" href="$SCRIPT_NAME?up">
   1.370 +		<img src="$IMAGES/update.png" />$(gettext 'Check upgrades')</a>
   1.371 +	<a class="button" href='$SCRIPT_NAME?list'>
   1.372 +		<img src="$IMAGES/tazpkg.png" />$(gettext 'My packages')</a>
   1.373 +</div>
   1.374 +</div>
   1.375 +EOT
   1.376 +		for i in $(repo_list ""); do
   1.377 +			if [ "$repo" != "Public" ]; then
   1.378 +				Repo_Name="$(repo_name $i)"
   1.379 +				cat << EOT
   1.380 +<h3>$(eval_gettext "Repository: \$Repo_Name")</h3>
   1.381 +EOT
   1.382 +			fi
   1.383 +			cat << EOT
   1.384 +<table class="zebra outbox">
   1.385 +$(table_head)
   1.386 +<tbody>
   1.387 +EOT
   1.388 +			grep "| $grep_category |" $i/packages.desc | \
   1.389 +				parse_packages_desc
   1.390 +			cat << EOT
   1.391 +</tbody>
   1.392 +</table>
   1.393 +EOT
   1.394 +		done
   1.395 +		echo '</form>' ;;
   1.396 +
   1.397 +
   1.398 +	*\ search\ *)
   1.399 +		#
   1.400 +		# Search for packages. Here default is to search in packages.desc
   1.401 +		# and so get result including packages names and descriptions
   1.402 +		#
   1.403 +		pkg=$(GET search)
   1.404 +		repo=$(GET repo)
   1.405 +		cd  $LOCALSTATE
   1.406 +		search_form
   1.407 +		sidebar | sed "s/repo_$repo/active/"
   1.408 +		LOADING_MSG="$(gettext 'Searching packages...')"
   1.409 +		loading_msg
   1.410 +		cat << EOT
   1.411 +<h2>$(gettext 'Search packages')</h2>
   1.412 +<form method="get" action="$SCRIPT_NAME">
   1.413 +<div id="actions">
   1.414 +<div class="float-left">
   1.415 +	$(gettext 'Selection:')
   1.416 +	<input type="submit" name="do" value="Install" />
   1.417 +	<input type="submit" name="do" value="Remove" />
   1.418 +	<a href="`cat $PANEL/lib/checkbox.js`">$(gettext 'Toogle all')</a>
   1.419 +</div>
   1.420 +<div class="float-right">
   1.421 +	<a class="button" href="$SCRIPT_NAME?recharge">
   1.422 +		<img src="$IMAGES/recharge.png" />$(gettext 'Recharge list')</a>
   1.423 +	<a class="button" href="$SCRIPT_NAME?up">
   1.424 +		<img src="$IMAGES/update.png" />$(gettext 'Check upgrades')</a>
   1.425 +	<a class="button" href='$SCRIPT_NAME?list'>
   1.426 +		<img src="$IMAGES/tazpkg.png" />$(gettext 'My packages')</a>
   1.427 +</div>
   1.428 +</div>
   1.429 +	<input type="hidden" name="repo" value="$repo" />
   1.430 +
   1.431 +	<table class="zebra outbox">
   1.432 +EOT
   1.433 +		if [ "$(GET files)" ]; then
   1.434 +			cat <<EOT
   1.435 +	<thead>
   1.436 +		<tr>
   1.437 +			<td>$(gettext 'Package')</td>
   1.438 +			<td>$(gettext 'File')</td>
   1.439 +		</tr>
   1.440 +	<thead>
   1.441 +	<tbody>
   1.442 +EOT
   1.443 +			unlzma -c $(repo_list /files.list.lzma) \
   1.444 +				| grep -Ei ": .*$(GET search)" | \
   1.445 +				while read PACKAGE FILE; do
   1.446 +					PACKAGE=${PACKAGE%:}
   1.447 +					image=tazpkg-installed.png
   1.448 +					[ -d $INSTALLED/$PACKAGE ] || image=tazpkg.png
   1.449 +					cat << EOT
   1.450 +<tr>
   1.451 +	<td><input type="checkbox" name="pkg" value="$PACKAGE">
   1.452 +		<a href="$(pkg_info_link $PACKAGE)"><img src="$IMAGES/$image" />$PACKAGE</a></td>
   1.453 +	<td>$FILE</td>
   1.454 +</tr>
   1.455 +EOT
   1.456 +				done
   1.457 +		else
   1.458 +			cat << EOT
   1.459 +$(table_head)
   1.460 +	<tbody>
   1.461 +EOT
   1.462 +			grep -ih $pkg $(repo_list /packages.desc) | \
   1.463 +				parse_packages_desc
   1.464 +		fi
   1.465 +		cat << EOT
   1.466 +	</tbody>
   1.467 +	</table>
   1.468 +</form>
   1.469 +EOT
   1.470 +		;;
   1.471 +
   1.472 +
   1.473 +	*\ recharge\ *)
   1.474 +		#
   1.475 +		# Lets recharge the packages list
   1.476 +		#
   1.477 +		search_form
   1.478 +		sidebar
   1.479 +		LOADING_MSG="$(gettext 'Recharging lists...')"
   1.480 +		loading_msg
   1.481 +		cat << EOT
   1.482 +<h2>$(gettext 'Recharge')</h2>
   1.483 +
   1.484 +<form method='get' action='$SCRIPT_NAME'>
   1.485 +<div id="actions">
   1.486 +	<div class="float-left">
   1.487 +		<p>$(gettext 'Recharge checks for new or updated packages')</p>
   1.488 +	</div>
   1.489 +	<div class="float-right">
   1.490 +		<a class="button" href='$SCRIPT_NAME?up'>
   1.491 +			<img src="$IMAGES/update.png" />$(gettext 'Check upgrades')</a>
   1.492 +		<a class="button" href='$SCRIPT_NAME?list'>
   1.493 +			<img src="$IMAGES/tazpkg.png" />$(gettext 'My packages')</a>
   1.494 +	</div>
   1.495 +</div>
   1.496 +<div class="wrapper">
   1.497 +<pre>
   1.498 +EOT
   1.499 +		echo $(gettext 'Recharging packages list') | log
   1.500 +		tazpkg recharge | filter_taztools_msgs
   1.501 +		cat << EOT
   1.502 +</pre>
   1.503 +</div>
   1.504 +<p>$(gettext "Packages lists are up-to-date. You should check for upgrades \
   1.505 +now.")</p>
   1.506 +EOT
   1.507 +		;;
   1.508 +
   1.509 +
   1.510 +	*\ up\ *)
   1.511 +		#
   1.512 +		# Upgrade packages
   1.513 +		#
   1.514 +		cd $LOCALSTATE
   1.515 +		search_form
   1.516 +		sidebar
   1.517 +		LOADING_MSG="$(gettext 'Checking for upgrades...')"
   1.518 +		loading_msg
   1.519 +		cat << EOT
   1.520 +<h2>$(gettext 'Up packages')</h2>
   1.521 +
   1.522 +<form method="get" action="$SCRIPT_NAME">
   1.523 +<div id="actions">
   1.524 +	<div class="float-left">
   1.525 +		$(gettext 'Selection:')
   1.526 +		<input type="submit" name="do" value="Install" />
   1.527 +		<input type="submit" name="do" value="Remove" />
   1.528 +		<a href="$(cat $PANEL/lib/checkbox.js)">$(gettext 'Toogle all')</a>
   1.529 +	</div>
   1.530 +	<div class="float-right">
   1.531 +		<a class="button" href="$SCRIPT_NAME?recharge">
   1.532 +			<img src="$IMAGES/recharge.png" />$(gettext 'Recharge list')</a>
   1.533 +		<a class="button" href="$SCRIPT_NAME?list">
   1.534 +			<img src="$IMAGES/tazpkg.png" />$(gettext 'My packages')</a>
   1.535 +	</div>
   1.536 +</div>
   1.537 +EOT
   1.538 +		tazpkg up --check >/dev/null
   1.539 +		cat << EOT
   1.540 +<table class="zebra outbox">
   1.541 +$(table_head)
   1.542 +<tbody>
   1.543 +EOT
   1.544 +		for pkg in `cat packages.up`
   1.545 +		do
   1.546 +			grep -hs "^$pkg |" $LOCALSTATE/packages.desc \
   1.547 +				$LOCALSTATE/undigest/*/packages.desc | \
   1.548 +				parse_packages_desc
   1.549 +		done
   1.550 +		cat << EOT
   1.551 +</tbody>
   1.552 +</table>
   1.553 +</form>
   1.554 +EOT
   1.555 +		;;
   1.556 +
   1.557 +
   1.558 +	*\ do\ *)
   1.559 +		#
   1.560 +		# Do an action on one or some packages
   1.561 +		#
   1.562 +		opt=""
   1.563 +		pkgs=""
   1.564 +		cmdline=$(echo ${QUERY_STRING#do=} | sed s'/&/ /g')
   1.565 +		cmd=$(echo ${cmdline} | awk '{print $1}')
   1.566 +		cmdline=${cmdline#*repo=* }
   1.567 +		pkgs=$(echo $cmdline | sed -e s'/+/ /g' -e s'/pkg=//g' -e s/$cmd//)
   1.568 +		pkgs="$(httpd -d "$pkgs")"
   1.569 +		cmd=$(echo $cmd | tr [:upper:] [:lower:])
   1.570 +		case $cmd in
   1.571 +			install)
   1.572 +				cmd=get-install opt=--forced
   1.573 +				LOADING_MSG="get-installing packages..."
   1.574 +				;;
   1.575 +			link)
   1.576 +				opt=$(readlink $LOCALSTATE/fslink)
   1.577 +				LOADING_MSG="linking packages..."
   1.578 +				;;
   1.579 +		esac
   1.580 +		search_form
   1.581 +		sidebar
   1.582 +		loading_msg
   1.583 +		cat << EOT
   1.584 +<h2>Tazpkg: $cmd</h2>
   1.585 +
   1.586 +<form method="get" action="$SCRIPT_NAME">
   1.587 +<div id="actions">
   1.588 +	<div class="float-left">
   1.589 +		<p>$(gettext 'Performing tasks on packages')</p>
   1.590 +	</div>
   1.591 +	<div class="float-right">
   1.592 +		<p>
   1.593 +			<a class="button" href="$SCRIPT_NAME?list">
   1.594 +				<img src="$IMAGES/tazpkg.png" />$(gettext 'My packages')</a>
   1.595 +		</p>
   1.596 +	</div>
   1.597 +</div>
   1.598 +<div class="box">
   1.599 +$(eval_gettext 'Executing $cmd for: $pkgs')
   1.600 +</div>
   1.601 +EOT
   1.602 +		for pkg in $pkgs
   1.603 +		do
   1.604 +			echo '<pre>'
   1.605 +			    echo $(gettext 'y') | tazpkg $cmd $pkg $opt 2>/dev/null | filter_taztools_msgs
   1.606 +			echo '</pre>'
   1.607 +		done ;;
   1.608 +
   1.609 +
   1.610 +	*\ info\ *)
   1.611 +		#
   1.612 +		# Packages info
   1.613 +		#
   1.614 +		pkg=$(GET info)
   1.615 +		search_form
   1.616 +		sidebar
   1.617 +		if [ -d $INSTALLED/$pkg ]; then
   1.618 +			. $INSTALLED/$pkg/receipt
   1.619 +			files=`cat $INSTALLED/$pkg/files.list | wc -l`
   1.620 +			action="Remove"
   1.621 +			action_i18n=$(gettext 'Remove')
   1.622 +		else
   1.623 +			cd  $LOCALSTATE
   1.624 +			LOADING_MSG=$(gettext 'Getting package info...')
   1.625 +			loading_msg
   1.626 +			IFS='|'
   1.627 +			set -- $(grep -hs "^$pkg |" packages.desc \
   1.628 +				 undigest/*/packages.desc)
   1.629 +			unset IFS
   1.630 +			PACKAGE=$1
   1.631 +			VERSION="$(echo $2)"
   1.632 +			SHORT_DESC="$(echo $3)"
   1.633 +			CATEGORY="$(echo $4)"
   1.634 +			WEB_SITE="$(echo $5)"
   1.635 +			action="Install"
   1.636 +			action_i18n=$(gettext 'Install')
   1.637 +			temp="$(echo $pkg | sed 's/get-//g')"
   1.638 +		fi
   1.639 +		cat << EOT
   1.640 +<h2>$(eval_gettext 'Package $PACKAGE')</h2>
   1.641 +
   1.642 +<div id="actions">
   1.643 +	<div class="float-left">
   1.644 +		<p>
   1.645 +EOT
   1.646 +		if [ "$temp" != "$pkg" -a "$action" == "Install" ]; then
   1.647 +			temp="$(echo $pkg | sed 's/get-//g')"
   1.648 +			echo "<a class='button' href='$SCRIPT_NAME?do=Install&$temp'>$(gettext 'Install (Non Free)')</a>"
   1.649 +		else
   1.650 +			echo "<a class='button' href='$SCRIPT_NAME?do=$action&$pkg'>$action_i18n</a>"
   1.651 +		fi
   1.652 +
   1.653 +		if [ -d $INSTALLED/$pkg ]; then
   1.654 +			if grep -qs "^$pkg$" $LOCALSTATE/blocked-packages.list; then
   1.655 +				cat << EOT
   1.656 +			<a class="button" href="$SCRIPT_NAME?do=Unblock&$pkg">$(gettext 'Unblock')</a>
   1.657 +EOT
   1.658 +			else
   1.659 +				cat << EOT
   1.660 +			<a class="button" href='$SCRIPT_NAME?do=Block&$pkg'>$(gettext 'Block')</a>
   1.661 +EOT
   1.662 +			fi
   1.663 +			cat << EOT
   1.664 +			<a class="button" href='$SCRIPT_NAME?do=Repack&$pkg'>$(gettext 'Repack')</a>
   1.665 +EOT
   1.666 +		fi
   1.667 +		i18n_desc
   1.668 +		cat << EOT
   1.669 +		</p>
   1.670 +	</div>
   1.671 +	<div class="float-right">
   1.672 +		<p>
   1.673 +			<a class="button" href='$SCRIPT_NAME?list'>
   1.674 +				<img src="$IMAGES/tazpkg.png" />$(gettext 'My packages')</a>
   1.675 +		</p>
   1.676 +	</div>
   1.677 +</div>
   1.678 +<table class="zebra outbox">
   1.679 +<tbody>
   1.680 +	<tr><td>$(gettext 'Name:')</td><td>$PACKAGE</td></tr>
   1.681 +	<tr><td>$(gettext 'Version:')</td><td>$VERSION</td></tr>
   1.682 +	<tr><td>$(gettext 'Description:')</td><td>$SHORT_DESC</td></tr>
   1.683 +	<tr><td>$(gettext 'Category:')</td><td>$CATEGORY</td></tr>
   1.684 +EOT
   1.685 +		if [ -d $INSTALLED/$pkg ]; then
   1.686 +			cat << EOT
   1.687 +	<tr><td>$(gettext 'Maintainer:')</td><td>$MAINTAINER</td></tr>
   1.688 +	<tr><td>$(gettext 'Website:')</td><td><a href="$WEB_SITE">$WEB_SITE</a></td></tr>
   1.689 +	<tr><td>$(gettext 'Sizes:')</td><td>$PACKED_SIZE/$UNPACKED_SIZE</td></tr>
   1.690 +EOT
   1.691 +			if [ -n "$DEPENDS" ]; then
   1.692 +				echo "<tr><td>$(gettext 'Depends:')</td><td>"
   1.693 +				for i in $DEPENDS; do
   1.694 +					echo -n "<a href="$(pkg_info_link $i)">$i</a> "
   1.695 +				done
   1.696 +				echo "</td></tr>"
   1.697 +			fi
   1.698 +			if [ -n "$SUGGESTED" ]; then
   1.699 +				echo "<tr><td>$(gettext 'Suggested:')</td><td>"
   1.700 +				for i in $SUGGESTED; do
   1.701 +					echo -n "<a href="$(pkg_info_link $i)">$i</a> "
   1.702 +				done
   1.703 +				echo "</td></tr>"
   1.704 +			fi
   1.705 +			[ -n "$TAGS" ] && echo "<tr><td>$(gettext 'Tags:')</td><td>$TAGS</td></tr>"
   1.706 +			I_FILES=$(cat $INSTALLED/$pkg/files.list | wc -l)
   1.707 +			cat << EOT
   1.708 +</tbody>
   1.709 +</table>
   1.710 +
   1.711 +<p>$(eval_gettext 'Installed files: $I_FILES')</p>
   1.712 +
   1.713 +<pre>$(cat $INSTALLED/$pkg/files.list)</pre>
   1.714 +EOT
   1.715 +		else
   1.716 +			cat << EOT
   1.717 +<tr><td>$(gettext 'Website:')</td><td><a href="$WEB_SITE">$WEB_SITE</a></td></tr>
   1.718 +<tr><td>$(gettext 'Sizes:')</td><td>$(grep -hsA 3 ^$pkg$ packages.txt undigest/*/packages.txt | \
   1.719 +		tail -n 1 | sed 's/ *//')</td></tr>
   1.720 +</table>
   1.721 +
   1.722 +<p>$(gettext 'Installed files:')</p>
   1.723 +
   1.724 +<pre>
   1.725 +`unlzma -c files.list.lzma undigest/*/files.list.lzma 2> /dev/null | \
   1.726 + sed "/^$pkg: /!d;s/^$pkg: //"`
   1.727 +</pre>
   1.728 +EOT
   1.729 +		fi
   1.730 +		;;
   1.731 +
   1.732 +
   1.733 +	*\ admin\ * )
   1.734 +		#
   1.735 +		# Tazpkg configuration page
   1.736 +		#
   1.737 +		cmd=$(GET admin)
   1.738 +		case "$cmd" in
   1.739 +			clean)
   1.740 +				rm -rf /var/cache/tazpkg/* ;;
   1.741 +			add-mirror)
   1.742 +				# Decode url
   1.743 +				mirror=$(GET mirror)
   1.744 +				case "$mirror" in
   1.745 +				http://*|ftp://*)
   1.746 +					echo "$mirror" >> $(GET file) ;;
   1.747 +				esac ;;
   1.748 +			rm-mirror=http://*|rm-mirror=ftp://*)
   1.749 +				mirror=${cmd#rm-mirror=}
   1.750 +				sed -i -e "s@$mirror@@" -e '/^$/d' $(GET file) ;;
   1.751 +			select-mirror*)
   1.752 +				release=`cat /etc/slitaz-release`
   1.753 +				mirror="$(GET mirror)packages/$release/"
   1.754 +				tazpkg setup-mirror $mirror | log
   1.755 +				;;
   1.756 +			add-repo)
   1.757 +				# Decode url
   1.758 +				mirror=$(GET mirror)
   1.759 +				repository=$LOCALSTATE/undigest/$(GET repository)
   1.760 +				case "$mirror" in
   1.761 +				http://*|ftp://*)
   1.762 +					mkdir -p $repository
   1.763 +					echo "$mirror" > $repository/mirror
   1.764 +					echo "$mirror" > $repository/mirrors ;;
   1.765 +				esac ;;
   1.766 +			rm-repo=*)
   1.767 +				repository=${cmd#rm-repo=}
   1.768 +				rm -rf $LOCALSTATE/undigest/$repository ;;
   1.769 +		esac
   1.770 +		[ "$cmd" == "$(gettext 'Set link')" ] &&
   1.771 +			[ -d "$(GET link)/$INSTALLED" ] &&
   1.772 +			ln -fs $(GET link) $LOCALSTATE/fslink
   1.773 +		[ "$cmd" == "$(gettext 'Remove link')" ] &&
   1.774 +			rm -f $LOCALSTATE/fslink
   1.775 +		cache_files=`find /var/cache/tazpkg -name *.tazpkg | wc -l`
   1.776 +		cache_size=`du -sh /var/cache/tazpkg`
   1.777 +		sidebar
   1.778 +		cat << EOT
   1.779 +<h2>$(gettext 'Administration')</h2>
   1.780 +<div>
   1.781 +	<p>$(gettext 'Tazpkg administration and settings')</p>
   1.782 +</div>
   1.783 +<div id="actions">
   1.784 +	<a class="button" href='$SCRIPT_NAME?admin=&action=saveconf'>
   1.785 +		<img src="$IMAGES/tazpkg.png" />$(gettext 'Save configuration')</a>
   1.786 +	<a class="button" href='$SCRIPT_NAME?admin=&action=listconf'>
   1.787 +		<img src="$IMAGES/edit.png" />$(gettext 'List configuration files')</a>
   1.788 +	<a class="button" href='$SCRIPT_NAME?admin=&action=quickcheck'>
   1.789 +		<img src="$IMAGES/recharge.png" />$(gettext 'Quick check')</a>
   1.790 +	<a class="button" href='$SCRIPT_NAME?admin=&action=fullcheck'>
   1.791 +		<img src="$IMAGES/recharge.png" />$(gettext 'Full check')</a>
   1.792 +</div>
   1.793 +EOT
   1.794 +		case "$(GET action)" in
   1.795 +				saveconf)
   1.796 +					LOADING_MSG=$(gettext 'Creating the package...')
   1.797 +					loading_msg
   1.798 +					echo "<pre>"
   1.799 +					cd $HOME
   1.800 +					tazpkg repack-config | filter_taztools_msgs
   1.801 +					echo -n "$(gettext 'Path:') " && ls $HOME/config-*.tazpkg
   1.802 +					echo "</pre>" ;;
   1.803 +				listconf)
   1.804 +					echo "<h4>$(gettext 'Configuration files')</h4>"
   1.805 +					echo "<ul>"
   1.806 +					tazpkg list-config | while read file; do
   1.807 +						[ "${file:0:1}" == "/" ] || continue
   1.808 +						if [ -e $file ]; then
   1.809 +							echo "<li><a href=\"index.cgi?file=$file\">$file</a></li>"
   1.810 +						else
   1.811 +							echo "<li>$file</li>"
   1.812 +						fi
   1.813 +					done
   1.814 +					echo "</ul>"
   1.815 +					echo "</pre>" ;;
   1.816 +				quickcheck)
   1.817 +					LOADING_MSG=$(gettext 'Checking packages consistency...')
   1.818 +					loading_msg
   1.819 +					echo "<pre>"
   1.820 +					tazpkg check
   1.821 +					echo "</pre>" ;;
   1.822 +				fullcheck)
   1.823 +					LOADING_MSG=$(gettext 'Full packages check...')
   1.824 +					loading_msg
   1.825 +					echo "<pre>"
   1.826 +					tazpkg check --full
   1.827 +					echo "</pre>" ;;
   1.828 +				esac
   1.829 +		cat << EOT
   1.830 +<h3>$(gettext 'Packages cache')</h3>
   1.831 +
   1.832 +<div>
   1.833 +	<form method="get" action="$SCRIPT_NAME">
   1.834 +		<p>
   1.835 +			$(eval_gettext 'Packages in the cache: $cache_files ($cache_size)')
   1.836 +			<input type="hidden" name="admin" value="clean" />
   1.837 +			<input type="submit" value="Clean" />
   1.838 +		</p>
   1.839 +	</form>
   1.840 +</div>
   1.841 +
   1.842 +<h3>$(gettext 'Default mirror')</h3>
   1.843 +
   1.844 +<pre>$(cat /var/lib/tazpkg/mirror)</pre>
   1.845 +
   1.846 +<h3>$(gettext 'Current mirror list')</h3>
   1.847 +EOT
   1.848 +		for i in $LOCALSTATE/mirrors $LOCALSTATE/undigest/*/mirrors; do
   1.849 +			[ -s $i ] || continue
   1.850 +			echo '<div class="box">'
   1.851 +			if [ $i != $LOCALSTATE/mirrors ]; then
   1.852 +				Repo_Name="$(repo_name $(dirname $i))"
   1.853 +				echo "<h4>$(eval_gettext 'Repository: $Repo_Name')</h4>"
   1.854 +			fi
   1.855 +			echo "<ul>"
   1.856 +			list_mirrors $i
   1.857 +			echo "</ul>"
   1.858 +			cat << EOT
   1.859 +</div>
   1.860 +<form method="get" action="$SCRIPT_NAME">
   1.861 +	<p>
   1.862 +		<input type="hidden" name="admin" value="add-mirror" />
   1.863 +		<input type="hidden" name="file" value="$i" />
   1.864 +		<input type="text" name="mirror" size="60">
   1.865 +		<input type="submit" value="Add mirror" />
   1.866 +	</p>
   1.867 +</form>
   1.868 +EOT
   1.869 +		done
   1.870 +		echo "<h3>$(gettext 'Private repositories')</h3>"
   1.871 +		[ -n "$(ls $LOCALSTATE/undigest 2> /dev/null)" ] && cat << EOT
   1.872 +<div class="box">
   1.873 +	<ul>
   1.874 +		$(list_repos)
   1.875 +	</ul>
   1.876 +</div>
   1.877 +EOT
   1.878 +		cat << EOT
   1.879 +<form method="get" action="$SCRIPT_NAME">
   1.880 +	<p>
   1.881 +		<input type="hidden" name="admin" value="add-repo" />
   1.882 +		$(gettext 'Name') <input type="text" name="repository" size="10">
   1.883 +		$(gettext 'mirror')
   1.884 +		<input type="text" name="mirror" value="http://" size="50">
   1.885 +		<input type="submit" value="Add repository" />
   1.886 +	</p>
   1.887 +</form>
   1.888 +
   1.889 +<h3>$(gettext 'Link to another SliTaz installation')</h3>
   1.890 +
   1.891 +<p>$(gettext "This link points to the root of another SliTaz installation. \
   1.892 +You will be able to install packages using soft links to it.")</p>
   1.893 +
   1.894 +<form method="get" action="$SCRIPT_NAME">
   1.895 +<p>
   1.896 +	<input type="hidden" name="admin" value="add-link" />
   1.897 +	<input type="text" name="link"
   1.898 +	 value="$(readlink $LOCALSTATE/fslink 2> /dev/null)" size="50">
   1.899 +	<input type="submit" name="admin" value="$(gettext 'Set link')" />
   1.900 +	<input type="submit" name="admin" value="$(gettext 'Remove link')" />
   1.901 +</p>
   1.902 +</form>
   1.903 +EOT
   1.904 +		version=$(cat /etc/slitaz-release)
   1.905 +		cat << EOT
   1.906 +
   1.907 +<h3 id="dvd">$(gettext 'SliTaz packages DVD')</h3>
   1.908 +
   1.909 +<p>$(eval_gettext "A bootable DVD image of all available packages for the \
   1.910 +\$version version is generated every day. It also contains a copy of the \
   1.911 +website and can be used without an internet connection. This image can be \
   1.912 +installed on a DVD or an USB key.")</p>
   1.913 +
   1.914 +<div>
   1.915 +	<form method="post" action='$SCRIPT_NAME?admin&action=dvdimage#dvd'>
   1.916 +	<p>
   1.917 +		<a class="button"
   1.918 +			href='http://mirror.slitaz.org/iso/$version/packages-$version.iso'>
   1.919 +			<img src="$IMAGES/tazpkg.png" />$(gettext 'Download DVD image')</a>
   1.920 +		<a class="button" href='$SCRIPT_NAME?admin&action=dvdusbkey#dvd'>
   1.921 +			<img src="$IMAGES/tazpkg.png" />$(gettext 'Install from DVD/USB key')</a>
   1.922 +	</p>
   1.923 +	<div class="box">
   1.924 +		$(gettext 'Install from ISO image:')
   1.925 +		<input type="text" name="dvdimage" size="40" value="/root/packages-$version.iso">
   1.926 +	</div>
   1.927 +	</form>
   1.928 +</div>
   1.929 +EOT
   1.930 +		if [ "$(GET action)" == "dvdimage" ]; then
   1.931 +			dev=$(POST dvdimage)
   1.932 +			mkdir -p /mnt/packages 2> /dev/null
   1.933 +			echo "<pre>"
   1.934 +			mount -t iso9660 -o loop,ro $dev /mnt/packages &&
   1.935 +			/mnt/packages/install.sh &&
   1.936 +			echo "$dev is installed on /mnt/packages"
   1.937 +			echo "</pre>"
   1.938 +		fi
   1.939 +		if [ "$(GET action)" == "dvdusbkey" ]; then
   1.940 +			mkdir -p /mnt/packages 2> /dev/null
   1.941 +			for tag in "LABEL=\"packages-$version\" TYPE=\"iso9660\"" \
   1.942 +				"LABEL=\"sources-$version\" TYPE=\"iso9660\"" ; do
   1.943 +				dev=$(blkid | grep "$tag" | cut -d: -f1)
   1.944 +				[ -n "$dev" ] || continue
   1.945 +				echo "<pre>"
   1.946 +				mount -t iso9660 -o ro $dev /mnt/packages &&
   1.947 +				/mnt/packages/install.sh &&
   1.948 +				echo "$dev is installed on /mnt/packages"
   1.949 +				echo "</pre>"
   1.950 +				break
   1.951 +			done
   1.952 +		fi
   1.953 +		 ;;
   1.954 +	*)
   1.955 +		#
   1.956 +		# Default to summary
   1.957 +		#
   1.958 +		search_form
   1.959 +		sidebar
   1.960 +		[ -n "$(GET block)" ] && tazpkg block $(GET block)
   1.961 +		[ -n "$(GET unblock)" ] && tazpkg unblock $(GET unblock)
   1.962 +		cat << EOT
   1.963 +<h2>$(gettext 'Summary')</h2>
   1.964 +
   1.965 +<div id="actions">
   1.966 +	<a class="button" href="$SCRIPT_NAME?list">
   1.967 +		<img src="$IMAGES/tazpkg.png" />$(gettext 'My packages')</a>
   1.968 +EOT
   1.969 +		fslink=$(readlink $LOCALSTATE/fslink)
   1.970 +		[ -n "$fslink" -a -d "$fslink/$INSTALLED" ] &&
   1.971 +			cat << EOT
   1.972 +	<a class="button" href="$SCRIPT_NAME?linkable">
   1.973 +		<img src="$IMAGES/tazpkg.png" />$(gettext 'Linkable packages')</a>
   1.974 +EOT
   1.975 +		cat << EOT
   1.976 +	<a class="button" href="$SCRIPT_NAME?recharge">
   1.977 +		<img src="$IMAGES/recharge.png" />$(gettext 'Recharge list')</a>
   1.978 +	<a class="button" href="$SCRIPT_NAME?up">
   1.979 +		<img src="$IMAGES/update.png" />$(gettext 'Check upgrades')</a>
   1.980 +	<a class="button" href="$SCRIPT_NAME?admin">
   1.981 +		<img src="$IMAGES/edit.png" />$(gettext 'Administration')</a>
   1.982 +</div>
   1.983 +
   1.984 +$(packages_summary)
   1.985 +
   1.986 +
   1.987 +<h3>$(gettext 'Latest log entries')</h3>
   1.988 +
   1.989 +<pre>
   1.990 +`tail -n 5 /var/log/tazpkg.log | fgrep "-" | \
   1.991 +	awk '{print $1, $2, $3, $4, $5, $6, $7}'`
   1.992 +</pre>
   1.993 +EOT
   1.994 +		;;
   1.995 +esac
   1.996 +
   1.997 +# xHTML 5 footer
   1.998 +xhtml_footer
   1.999 +exit 0