tazpanel view pkgs.cgi @ rev 122

pkgs.cgi: image for WEB_SITE link
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Apr 15 13:01:00 2011 +0200 (2011-04-15)
parents dce3e66c3ba4
children b496f4d00880
line source
1 #!/bin/sh
2 #
3 # TazPKG CGI interface - Manage packages via a browser
4 #
5 # This CGI interface intensively uses tazpkg to manage packages and have
6 # its own code for some tasks. Please KISS, it is important and keep speed
7 # in mind. Thanks, Pankso.
8 #
9 # (C) 2011 SliTaz GNU/Linux - BSD License
10 #
12 . lib/libtazpanel
13 get_config
14 header
16 # xHTML 5 header with special side bar fo categories.
17 TITLE="- Packages"
18 xhtml_header | sed 's/id="content"/id="content-sidebar"/'
21 # We need packages information for list and search
22 parse_packages_desc() {
23 IFS="|"
24 cut -f 1,2,3,5 -d "|" | while read PACKAGE VERSION SHORT_DESC WEB_SITE
25 do
26 echo '<tr>'
27 if [ -d $INSTALLED/${PACKAGE% } ]; then
28 echo -e "<td><input type='checkbox' name='pkg' value='$PACKAGE'>\n
29 <a href='$SCRIPT_NAME?info=$PACKAGE'>
30 <img src='$IMAGES/tazpkg-installed.png'/>$PACKAGE</a></td>"
31 else
32 echo -e "<td><input type='checkbox' name='pkg' value='$PACKAGE'>\n
33 <a href='$SCRIPT_NAME?info=$PACKAGE'>
34 <img src='$IMAGES/tazpkg.png'/>$PACKAGE</a></td>"
35 fi
36 echo "<td>$VERSION</td>"
37 echo "<td class='desc'>$SHORT_DESC</td>"
38 echo "<td><a href='$WEB_SITE'><img src='$IMAGES/browser.png'/></a></td>"
39 echo '</tr>'
40 done
41 unset IFS
42 }
44 # Display a full summary of packages stats
45 packages_summary() {
46 gettext "Last recharge : "
47 stat=`stat -c %y $LOCALSTATE/packages.list | \
48 sed 's/\(:..\):.*/\1/' | awk '{print $1}'`
49 mtime=`find /var/lib/tazpkg/packages.list -mtime +10`
50 echo -n "$stat "
51 if [ "$mtime" ]; then
52 echo "(Older than 10 days)"
53 else
54 echo "(Not older than 10 days)"
55 fi
56 gettext "Installed packages : "
57 ls $INSTALLED | wc -l
58 gettext "Mirrored packages : "
59 cat $LOCALSTATE/packages.list | wc -l
60 gettext "Upgradeable packages : "
61 cat $LOCALSTATE/packages.up | wc -l
62 #gettext "Installed files : "
63 #cat $INSTALLED/*/files.list | wc -l
64 gettext "Blocked packages : "
65 cat $LOCALSTATE/blocked-packages.list | wc -l
66 }
68 # Parse mirrors list to be able to have an icon an remove link
69 list_mirrors() {
70 cat $LOCALSTATE/mirrors | while read line
71 do
72 cat << EOT
73 <li><a href="$SCRIPT_NAME?config=rm-mirror=$line"><img
74 src="$IMAGES/clear.png" /></a><a href="$line">$line</a></li>
75 EOT
76 done
77 }
79 #
80 # xHTML functions
81 #
83 # ENTER will search but user may search for a button, so put one.
84 search_form() {
85 cat << EOT
86 <div class="search">
87 <form method="get" action="$SCRIPT_NAME">
88 <p>
89 <input type="text" name="search" size="20">
90 <input type="submit" value="`gettext "Search"`">
91 <input class="radius" type="submit" name="files"
92 value="`gettext "files"`">
93 </p>
94 </form>
95 </div>
96 EOT
97 }
99 table_head() {
100 cat << EOT
101 <tr id="thead">
102 <td>`gettext "Name"`</td>
103 <td>`gettext "Version"`</td>
104 <td>`gettext "Description"`</td>
105 <td>`gettext "Web"`</td>
106 </tr>
107 EOT
108 }
110 sidebar() {
111 cat << EOT
112 <div id="sidebar">
113 <h4>Categories</h4>
114 <a class="active_base-system" href="$SCRIPT_NAME?cat=base-system">Base-system</a>
115 <a class="active_x-window" href="$SCRIPT_NAME?cat=x-window">X window</a>
116 <a class="active_utilities" href="$SCRIPT_NAME?cat=utilities">Utilities</a>
117 <a class="active_network" href="$SCRIPT_NAME?cat=network">Network</a>
118 <a class="active_games" href="$SCRIPT_NAME?cat=games">Games</a>
119 <a class="active_graphics" href="$SCRIPT_NAME?cat=graphics">Graphics</a>
120 <a class="active_office" href="$SCRIPT_NAME?cat=office">Office</a>
121 <a class="active_multimedia" href="$SCRIPT_NAME?cat=multimedia">Multimedia</a>
122 <a class="active_developement" href="$SCRIPT_NAME?cat=development">Development</a>
123 <a class="active_system-tools" href="$SCRIPT_NAME?cat=system-tools">System tools</a>
124 <a class="active_security" href="$SCRIPT_NAME?cat=security">Security</a>
125 <a class="active_misc" href="$SCRIPT_NAME?cat=misc">Misc</a>
126 <a class="active_meta" href="$SCRIPT_NAME?cat=meta">Meta</a>
127 <a class="active_non-free" href="$SCRIPT_NAME?cat=non-free">Non free</a>
128 <a class="active_all" href="$SCRIPT_NAME?cat=all">All</a>
129 </div>
130 EOT
131 }
133 #
134 # Commands
135 #
137 case " $(GET) " in
138 *\ list\ *)
139 #
140 # List installed packages. This is the default because parsing
141 # the full packages.desc can be long and take some resources
142 #
143 cd $INSTALLED
144 search_form
145 sidebar
146 LOADING_MSG="Listing packages..."
147 loading_msg
148 cat << EOT
149 <h2>`gettext "My packages"`</h2>
150 <form method='get' action='$SCRIPT_NAME'>
151 <div id="actions">
152 <div class="float-left">
153 `gettext "Selection:"`
154 <input type="submit" name="do" value="Remove" />
155 </div>
156 <div class="float-right">
157 `gettext "List:"`
158 <input type="submit" name="recharge" value="Recharge" />
159 <input type="submit" name="up" value="Upgrade" />
160 </div>
161 </div>
162 EOT
163 table_start
164 table_head
165 for pkg in *
166 do
167 . $pkg/receipt
168 echo '<tr>'
169 # Use default tazpkg icon since all packages displayed are
170 # installed
171 colorpkg=$pkg
172 grep -qs "^$pkg$" $LOCALSTATE/blocked-packages.list &&
173 colorpkg="<span style='color: red;'>$pkg</span>"
174 echo "<td class='pkg'>
175 <input type='checkbox' name='pkg' value=\"$pkg\" />
176 <a href='$SCRIPT_NAME?info=$pkg'><img
177 src='$IMAGES/tazpkg-installed.png'/>$colorpkg</a></td>"
178 echo "<td>$VERSION</td>"
179 echo "<td class='desc'>$SHORT_DESC</td>"
180 echo "<td><a href='$WEB_SITE'><img src='$IMAGES/browser.png'/></a></td>"
181 echo '</tr>'
182 done
183 table_end
184 echo '</form>' ;;
185 *\ cat\ *)
186 #
187 # List all available packages by category on mirror. Listing all
188 # packages is too resource intensive and not useful.
189 #
190 cd $LOCALSTATE
191 category=$(GET cat)
192 [ "$category" == "cat" ] && category="base-system"
193 grep_category=$category
194 [ "$grep_category" == "all" ] && grep_category=".*"
195 search_form
196 sidebar | sed s/"active_${category}"/"active"/
197 LOADING_MSG="Listing packages..."
198 loading_msg
199 cat << EOT
200 <h2>`gettext "Category:"` $category</h2>
201 <form method='get' action='$SCRIPT_NAME'>
202 <div id="actions">
203 <div class="float-left">
204 `gettext "Selection:"`
205 <input type="submit" name="do" value="Install" />
206 <input type="submit" name="do" value="Remove" />
207 </div>
208 <div class="float-right">
209 `gettext "List:"`
210 <input type="submit" name="recharge" value="Recharge" />
211 <input type="submit" name="up" value="Upgrade" />
212 <a class="button" href='$SCRIPT_NAME?list'>
213 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
214 </div>
215 EOT
216 echo '</div>'
217 table_start
218 table_head
219 grep "| $grep_category |" packages.desc | parse_packages_desc
220 table_end
221 echo '</form>' ;;
222 *\ search\ *)
223 #
224 # Search for packages. Here default is to search in packages.desc
225 # and so get result including packages names and descriptions
226 #
227 pkg=$(GET search)
228 cd $LOCALSTATE
229 search_form
230 sidebar
231 LOADING_MSG="Searching packages..."
232 loading_msg
233 cat << EOT
234 <h2>`gettext "Search packages"`</h2>
235 <form method="get" action="$SCRIPT_NAME">
236 <div id="actions">
237 <div class="float-left">
238 `gettext "Selection:"`
239 <input type="submit" name="do" value="Install" />
240 <input type="submit" name="do" value="Remove" />
241 <a href="`cat $PANEL/lib/checkbox.js`">`gettext "Toogle all"`</a>
242 </div>
243 <div class="float-right">
244 `gettext "List:"`
245 <input type="submit" name="recharge" value="Recharge" />
246 <input type="submit" name="up" value="Upgrade" />
247 <a class="button" href='$SCRIPT_NAME?list'>
248 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
249 </div>
250 EOT
251 echo '</div>'
252 table_start
253 if [ "$(GET files)" ]; then
254 cat <<EOT
255 <tr id="thead">
256 <td>`gettext "Package"`</td>
257 <td>`gettext "File"`</td>
258 </tr>
259 $(unlzma -c files.list.lzma | grep -Ei ": .*$(GET search)" | \
260 while read PACKAGE FILE; do
261 PACKAGE=${PACKAGE%:}
262 image=tazpkg-installed.png
263 [ -d $INSTALLED/$PACKAGE ] || image=tazpkg.png
264 echo "<tr>
265 <td><input type='checkbox' name='pkg' value='$PACKAGE'>
266 <a href='$SCRIPT_NAME?info=$PACKAGE'><img src='$IMAGES/$image' />$PACKAGE</a></td>
267 <td>$FILE</td>
268 </tr>"
269 done)
270 EOT
271 else
272 table_head
273 grep -i $pkg packages.desc | parse_packages_desc
274 fi
275 table_end
276 echo '</form>' ;;
277 *\ recharge\ *)
278 #
279 # Let recharge the packages list
280 #
281 search_form
282 sidebar
283 LOADING_MSG="Recharging lists..."
284 loading_msg
285 cat << EOT
286 <h2>`gettext "Recharge"`</h2>
287 <form method='get' action='$SCRIPT_NAME'>
288 <div id="actions">
289 <div class="float-left">
290 <p>
291 `gettext "Recharge checks for new or updated packages"`
292 </p>
293 </div>
294 <div class="float-right">
295 <p>
296 <a class="button" href='$SCRIPT_NAME?up'>
297 `gettext "Check upgrade"`</a>
298 <a class="button" href='$SCRIPT_NAME?list'>
299 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
300 </p>
301 </div>
302 </div>
303 <pre>
304 EOT
305 gettext "Recharging packages list" | log
306 tazpkg recharge | filter_taztools_msgs
307 cat << EOT
308 </pre>
309 <p>
310 `gettext "Packages lists are up-to-date. You should check for upgrades now."`
311 </p>
312 EOT
313 ;;
314 *\ up\ *)
315 #
316 # Ugrade packages
317 #
318 cd $LOCALSTATE
319 search_form
320 sidebar
321 LOADING_MSG="Checking for upgrades..."
322 loading_msg
323 cat << EOT
324 <h2>`gettext "Up packages"`</h2>
325 <form method="get" action="$SCRIPT_NAME">
326 <div id="actions">
327 <div class="float-left">
328 `gettext "Selection:"`
329 <input type="submit" name="do" value="Install" />
330 <input type="submit" name="do" value="Remove" />
331 <a href="`cat $PANEL/lib/checkbox.js`">`gettext "Toogle all"`</a>
332 </div>
333 <div class="float-right">
334 `gettext "List:"`
335 <input type="submit" name="recharge" value="Recharge" />
336 <a class="button" href='$SCRIPT_NAME?list'>
337 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
338 </div>
339 </div>
340 EOT
341 tazpkg up --check >/dev/null
342 table_start
343 table_head
344 for pkg in `cat packages.up`
345 do
346 grep "^$pkg |" $LOCALSTATE/packages.desc | parse_packages_desc
347 done
348 table_end
349 echo '</form>' ;;
350 *\ do\ *)
351 #
352 # Do an action on one or some packages
353 #
354 opt=""
355 pkgs=""
356 cmdline=`echo ${QUERY_STRING#do=} | sed s'/&/ /g'`
357 cmd=`echo ${cmdline} | awk '{print $1}'`
358 pkgs=`echo $cmdline | sed -e s'/+/ /g' -e s'/pkg=//g' -e s/$cmd//`
359 cmd=`echo $cmd | tr [A-Z] [a-z]`
360 case $cmd in
361 install)
362 cmd=get-install opt=--forced ;;
363 esac
364 search_form
365 sidebar
366 LOADING_MSG="${cmd}ing packages..."
367 loading_msg
368 cat << EOT
369 <h2>Tazpkg: $cmd</h2>
370 <form method="get" action="$SCRIPT_NAME">
371 <div id="actions">
372 <div class="float-left">
373 <p>
374 `gettext "Performing tasks on packages"`
375 </p>
376 </div>
377 <div class="float-right">
378 <p>
379 <a class="button" href='$SCRIPT_NAME?list'>
380 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
381 </p>
382 </div>
383 </div>
384 EOT
385 echo '<div class="box">'
386 gettext "Executing $cmd for:$pkgs"
387 echo '</div>'
388 for pkg in $pkgs
389 do
390 echo '<pre>'
391 echo 'y' | tazpkg $cmd $pkg $opt 2>/dev/null | filter_taztools_msgs
392 echo '</pre>'
393 done ;;
394 *\ info\ *)
395 #
396 # Packages info
397 #
398 pkg=$(GET info)
399 search_form
400 sidebar
401 if [ -d $INSTALLED/$pkg ]; then
402 . $INSTALLED/$pkg/receipt
403 files=`cat $INSTALLED/$pkg/files.list | wc -l`
404 action=$(gettext "Remove")
405 else
406 cd $LOCALSTATE
407 LOADING_MSG=$(gettext "Getting package info...")
408 loading_msg
409 IFS='|'
410 set -- $(grep "^$pkg |" packages.desc)
411 unset IFS
412 PACKAGE=$1
413 VERSION="$(echo $2)"
414 SHORT_DESC="$(echo $3)"
415 CATEGORY="$(echo $4)"
416 WEB_SITE="$(echo $5)"
417 action=$(gettext "Install")
418 fi
419 cat << EOT
420 <h2>`gettext "Package"` $PACKAGE</h2>
421 <div id="actions">
422 <div class="float-left">
423 <p>
424 <a class="button" href='$SCRIPT_NAME?do=$action&$pkg'>$action</a>
425 EOT
426 if [ -d $INSTALLED/$pkg ]; then
427 if grep -qs "^$pkg$" $LOCALSTATE/blocked-packages.list; then
428 block=$(gettext "Unblock")
429 else
430 block=$(gettext "Block")
431 fi
432 cat << EOT
433 <a class="button" href='$SCRIPT_NAME?do=$block&$pkg'>$block</a>
434 <a class="button" href='$SCRIPT_NAME?do=Repack&$pkg'>Repack</a>
435 EOT
436 fi
437 cat << EOT
438 </p>
439 </div>
440 <div class="float-right">
441 <p>
442 <a class="button" href='$SCRIPT_NAME?list'>
443 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
444 </p>
445 </div>
446 </div>
447 <pre>
448 Name : $PACKAGE
449 Version : $VERSION
450 Description : $SHORT_DESC
451 Category : $CATEGORY
452 EOT
453 if [ -d $INSTALLED/$pkg ]; then
454 cat << EOT
455 Maintainer : $MAINTAINER
456 Website : <a href="$WEB_SITE">$WEB_SITE</a>
457 Sizes : $PACKED_SIZE/$UNPACKED_SIZE
458 EOT
459 if [ -n "$DEPENDS" ]; then
460 echo -n "Depends : "
461 for i in $DEPENDS; do
462 echo -n "<a href="$SCRIPT_NAME?info=$i">$i</a> "
463 done
464 echo ""
465 fi
466 if [ -n "$SUGGESTED" ]; then
467 echo -n "Suggested : "
468 for i in $SUGGESTED; do
469 echo -n "<a href="$SCRIPT_NAME?info=$i">$i</a> "
470 done
471 echo ""
472 fi
473 [ -n "$TAGS" ] && echo "Tags : $TAGS"
474 cat << EOT
475 </pre>
477 <p>`gettext "Installed files:"` `cat $INSTALLED/$pkg/files.list | wc -l`</p>
478 <pre>
479 `cat $INSTALLED/$pkg/files.list`
480 </pre>
481 EOT
482 else
483 cat << EOT
484 Website : <a href="$WEB_SITE">$WEB_SITE</a>
485 Sizes : `grep -A 3 ^$pkg$ packages.txt | tail -n 1 | sed 's/ *//'`
486 </pre>
488 <p>`gettext "Installed files:"`</p>
489 <pre>
490 `unlzma -c files.list.lzma | sed "/^$pkg: /!d;s/^$pkg: //"`
491 </pre>
492 EOT
493 fi
494 ;;
495 *\ admin\ * )
496 #
497 # Tazpkg configuration page
498 #
499 cmd=$(GET admin)
500 case "$cmd" in
501 clean)
502 rm -rf /var/cache/tazpkg/* ;;
503 add-mirror)
504 # Decode url
505 mirror=$(GET mirror)
506 case "$mirror" in
507 http://*|ftp://*)
508 echo "$mirror" >> $LOCALSTATE/mirrors ;;
509 esac ;;
510 rm-mirror=http://*|rm-mirror=ftp://*)
511 mirror=${cmd#rm-mirror=}
512 sed -i -e "s@$mirror@@" -e '/^$/d' $LOCALSTATE/mirrors ;;
513 esac
514 cache_files=`find /var/cache/tazpkg -name *.tazpkg | wc -l`
515 cache_size=`du -sh /var/cache/tazpkg`
516 sidebar
517 cat << EOT
518 <h2>$(gettext "Administration")</h2>
519 <div>
520 <p>$(gettext "Tazpkg administration and settings")</p>
521 </div>
522 <div id="actions">
523 <a class="button" href='$SCRIPT_NAME?admin=&action=saveconf'>
524 <img src="$IMAGES/tazpkg.png" />`gettext "Save configuration"`</a>
525 <a class="button" href='$SCRIPT_NAME?admin=&action=listconf'>
526 <img src="$IMAGES/edit.png" />`gettext "List configuration files"`</a>
527 <a class="button" href='$SCRIPT_NAME?admin=&action=quickcheck'>
528 <img src="$IMAGES/recharge.png" />`gettext "Quick check"`</a>
529 <a class="button" href='$SCRIPT_NAME?admin=&action=fullcheck'>
530 <img src="$IMAGES/recharge.png" />`gettext "Full check"`</a>
531 </div>
532 EOT
533 case "$(GET action)" in
534 saveconf)
535 LOADING_MSG=$(gettext "Creating the package...")
536 loading_msg
537 echo "<pre>"
538 cd $HOME
539 tazpkg repack-config | filter_taztools_msgs
540 gettext "Path : " && ls $HOME/config-*.tazpkg
541 echo "</pre>" ;;
542 listconf)
543 echo "<h4>`gettext "Configuration files"`</h4>"
544 echo "<ul>"
545 tazpkg list-config | while read file; do
546 [ "${file:0:1}" == "/" ] || continue
547 if [ -e $file ]; then
548 echo "<li><a href=\"index.cgi?file=$file\">$file</a></li>"
549 else
550 echo "<li>$file</li>"
551 fi
552 done
553 echo "</ul>"
554 echo "</pre>" ;;
555 quickcheck)
556 LOADING_MSG=$(gettext "Checking packages consitency...")
557 loading_msg
558 echo "<pre>"
559 tazpkg check
560 echo "</pre>" ;;
561 fullcheck)
562 LOADING_MSG=$(gettext "Full packages check...")
563 loading_msg
564 echo "<pre>"
565 tazpkg check --full
566 echo "</pre>" ;;
567 esac
568 cat << EOT
569 <h3>$(gettext "Packages cache")</h3>
570 <div>
571 <form method="get" action="$SCRIPT_NAME">
572 <p>
573 `gettext "Packages in the cache:"` $cache_files ($cache_size)
574 <input type="hidden" name="admin" value="clean" />
575 <input type="submit" value="Clean" />
576 </p>
577 </form>
578 </div>
580 <h3>`gettext "Current mirror list"`</h3>
581 <div class="box">
582 <ul>
583 `list_mirrors`
584 </ul>
585 </div>
586 <form method="get" action="$SCRIPT_NAME">
587 <p>
588 <input type="hidden" name="config" value="add-mirror" />
589 <input type="text" name="mirror" size="60">
590 <input type="submit" value="Add mirror" />
591 </p>
592 </form>
593 EOT
594 version=$(cat /etc/slitaz-release)
595 cat << EOT
597 <a name="dvd"></a>
598 <h3>`gettext "SliTaz packages DVD"`</h3>
599 <p>
600 $(gettext "A bootable DVD image of all available packages for \
601 the $version version is generated every day. It also contains a copy of \
602 the website and can be used without an internet connection. This image can be \
603 installed on a DVD or an USB key.")
604 </p>
605 <div>
606 <form method="post" action='$SCRIPT_NAME?admin&action=dvdimage#dvd'>
607 <p>
608 <a class="button"
609 href='http://mirror.slitaz.org/iso/$version/packages-$version.iso'>
610 <img src="$IMAGES/tazpkg.png" />$(gettext "Download DVD image")</a>
611 <a class="button" href='$SCRIPT_NAME?admin&action=dvdusbkey#dvd'>
612 <img src="$IMAGES/tazpkg.png" />$(gettext "Install to DVD/USB key")</a>
613 </p>
614 <div class="box">
615 $(gettext "ISO image path: ")
616 <input type="text" name="dvdimage" size="40" value="/root/packages-$version.iso">
617 </div>
618 </form>
619 </div>
620 EOT
621 if [ "$(GET action)" == "dvdimage" ]; then
622 dev=$(POST dvdimage)
623 mkdir -p /mnt/packages 2> /dev/null
624 echo "<pre>"
625 mount -t iso9660 -o loop,ro $dev /mnt/packages &&
626 /mnt/packages/install.sh &&
627 echo "$dev is installed on /mnt/packages"
628 echo "</pre>"
629 fi
630 if [ "$(GET action)" == "dvdusbkey" ]; then
631 mkdir -p /mnt/packages 2> /dev/null
632 for tag in "LABEL=\"packages-$version\" TYPE=\"iso9660\"" \
633 "LABEL=\"sources-$version\" TYPE=\"iso9660\"" ; do
634 dev=$(blkid | grep "$tag" | cut -d: -f1)
635 [ -n "$dev" ] || continue
636 echo "<pre>"
637 mount -t iso9660 -o ro $dev /mnt/packages &&
638 /mnt/packages/install.sh &&
639 echo "$dev is installed on /mnt/packages"
640 echo "</pre>"
641 break
642 done
643 fi
644 ;;
645 *)
646 #
647 # Default to summary
648 #
649 search_form
650 sidebar
651 [ -n "$(GET block)" ] && tazpkg block $(GET block)
652 [ -n "$(GET unblock)" ] && tazpkg unblock $(GET unblock)
653 cat << EOT
654 <h2>`gettext "Summary"`</h2>
655 <div id="actions">
656 <a class="button" href='$SCRIPT_NAME?list'>
657 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
658 <a class="button" href='$SCRIPT_NAME?recharge'>
659 <img src="$IMAGES/recharge.png" />`gettext "Recharge list"`</a>
660 <a class="button" href='$SCRIPT_NAME?up'>
661 <img src="$IMAGES/update.png" />`gettext "Check upgrade"`</a>
662 <a class="button" href='$SCRIPT_NAME?admin'>
663 <img src="$IMAGES/edit.png" />`gettext "Administration"`</a>
664 </div>
665 <pre class="pre-main">
666 `packages_summary`
667 </pre>
669 <h3>`gettext "Latest log entries"`</h3>
670 <pre>
671 `tail -n 5 /var/log/tazpkg.log | fgrep "-" | \
672 awk '{print $1, $2, $3, $4, $5, $6, $7}'`
673 </pre>
674 EOT
675 ;;
676 esac
678 # xHTML 5 footer
679 xhtml_footer
680 exit 0