tazpkg view tazpanel/pkgs.cgi @ rev 726

pkgs.cgi: add pager to "cat"
"cat" runs fast enough, so not to cache it, but can add setting in the config file (as well as config for page length)
author Aleksej Bobylev <al.bobylev@gmail.com>
date Wed Dec 24 17:29:07 2014 +0200 (2014-12-24)
parents 0bfdb6c09732
children f32370a20712
line source
1 #!/bin/sh
2 #
3 # TazPkg CGI interface - Manage packages via a browser
4 #
5 # This CGI interface extensively 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-2014 SliTaz GNU/Linux - BSD License
10 #
12 . /lib/libtaz.sh
13 . lib/libtazpanel
15 . /etc/slitaz/slitaz.conf
16 . /etc/slitaz/tazpkg.conf
18 get_config
19 header
22 # xHTML 5 header with special side bar for categories.
23 TITLE=$(TEXTDOMAIN='tazpkg'; _ 'TazPanel - Packages')
24 xhtml_header | sed 's/id="content"/id="content-sidebar"/'
26 export TEXTDOMAIN='tazpkg'
28 pkg_info_link()
29 {
30 echo "<a class=\"$2\" href=\"?info=${1//+/%2B}\">$1</a>" | sed 's| class=""||'
31 }
34 # Display localized short description
36 i18n_desc() {
37 for L in $LANG ${LANG%%_*}; do
38 if [ -e "$PKGS_DB/packages-desc.$L" ]; then
39 LOCDESC=$(awk -F$'\t' -vp=$1 '{if ($1 == p) print $2}' $PKGS_DB/packages-desc.$L)
40 if [ -n "$LOCDESC" ]; then
41 SHORT_DESC="$LOCDESC"
42 break
43 fi
44 fi
45 done
46 }
49 # We need packages information for list and search
51 parse_packages_desc() {
52 IFS="|"
53 cut -f 1,2,3,5 -d "|" | while read PACKAGE VERSION SHORT_DESC WEB_SITE
54 do
55 class=pkg; [ -d $INSTALLED/${PACKAGE% } ] && class=pkgi
56 i18n_desc $PACKAGE
57 cat << EOT
58 <tr>
59 <td><input type="checkbox" name="pkg" value="$PACKAGE">$(pkg_info_link $PACKAGE $class)</td>
60 <td>$VERSION</td>
61 <td>$SHORT_DESC</td>
62 <td><a class="w" href="$WEB_SITE"></a></td>
63 </tr>
64 EOT
65 done
66 unset IFS
67 }
70 parse_packages_info() {
71 IFS=$'\t'
72 while read PACKAGE VERSION CATEGORY SHORT_DESC WEB_SITE TAGS SIZES DEPENDS; do
73 class=pkg; grep -q "^$PACKAGE$'\t'" $PKGS_DB/installed.info && class=pkgi
74 i18n_desc $PACKAGE
75 cat << EOT
76 <tr>
77 <td><input type="checkbox" name="pkg" value="$PACKAGE">$(pkg_info_link $PACKAGE $class)</td>
78 <td>$VERSION</td>
79 <td>$SHORT_DESC</td>
80 <td><a class="w" href="$WEB_SITE"></a></td>
81 </tr>
82 EOT
83 done
84 unset IFS
85 }
88 # Display a full summary of packages stats
90 packages_summary() {
91 cat << EOT
92 <table class="zebra outbox">
93 <tbody>
94 <tr><td>$(_ 'Last recharge:')</td><td>
95 EOT
96 ls -l $PKGS_DB/packages.list | awk '{print $6, $7, $8}'
97 if [ -n "$(find $PKGS_DB/packages.list -mtime +10)" ]; then
98 _ '(Older than 10 days)'
99 else
100 _ '(Not older than 10 days)'
101 fi
102 cat << EOT
103 </td></tr>
104 <tr><td>$(_ 'Installed packages:')</td>
105 <td>$(cat $PKGS_DB/installed.info | wc -l)</td></tr>
106 <tr><td>$(_ 'Mirrored packages:')</td>
107 <td>$(cat $PKGS_DB/packages.list | wc -l)</td></tr>
108 <tr><td>$(_ 'Upgradeable packages:')</td>
109 <td>$(cat $PKGS_DB/packages.up | wc -l)</td></tr>
110 <tr><td>$(_ 'Installed files:')</td>
111 <td>$(cat $INSTALLED/*/files.list | wc -l)</td></tr>
112 <tr><td>$(_ 'Blocked packages:')</td>
113 <td>$(cat $PKGS_DB/blocked-packages.list | wc -l)</td></tr>
114 </tbody>
115 </table>
116 EOT
117 }
120 # Parse mirrors list to be able to have an icon and remove link
122 list_mirrors() {
123 while read line
124 do
125 cat << EOT
126 <li>
127 <a href="$SCRIPT_NAME?admin=rm-mirror=$line&amp;file=$(httpd -e $1)">
128 <img src="$IMAGES/clear.png" title="$(_ 'Delete')" />
129 </a>
130 <a href="$SCRIPT_NAME?admin=select-mirror&amp;mirror=$line">
131 <img src="$IMAGES/start.png" title="$(_ 'Use as default')" />
132 </a>
133 <a href="$line">$line</a>
134 </li>
135 EOT
136 done < $1
137 }
140 # Parse repositories list to be able to have an icon and remove link
142 list_repos() {
143 ls $PKGS_DB/undigest 2> /dev/null | while read repo ; do
144 cat <<EOT
145 <li><a href="$SCRIPT_NAME?admin=rm-repo=$repo">
146 <img src="$IMAGES/clear.png">$repo</a></li>
147 EOT
148 done
149 }
152 # Show button
153 show_button() {
154 case $1 in
155 recharge) img='recharge'; label="$(_ 'Recharge list')" ;;
156 up) img='update'; label="$(_ 'Check upgrades')" ;;
157 list) img='tazpkg'; label="$(_ 'My packages')" ;;
158 linkable) img='tazpkg'; label="$(_ 'Linkable packages')" ;;
159 admin) img='edit'; label="$(_ 'Administration')" ;;
160 *Install*nf*) img=''; label="$(_ 'Install (Non Free)')" ;;
161 *Install*) img=''; label="$(_ 'Install')" ;;
162 *Remove*) img='stop'; label="$(_ 'Remove')" ;;
163 *Block*) img=''; label="$(_ 'Block')" ;;
164 *Unblock*) img=''; label="$(_ 'Unblock')" ;;
165 *Repack*) img=''; label="$(_ 'Repack')" ;;
166 *saveconf*) img='tazpkg'; label="$(_ 'Save configuration')" ;;
167 *listconf*) img='edit'; label="$(_ 'List configuration files')" ;;
168 *quickcheck*) img='recharge'; label="$(_ 'Quick check')" ;;
169 *fullcheck*) img='recharge'; label="$(_ 'Full check')" ;;
170 esac
171 echo -n "<a class=\"button\" href=\"?$1\">"
172 [ -n "$img" ] && echo -n "<img src=\"$IMAGES/$img.png\" />"
173 echo "$label</a>"
174 }
178 #
179 # xHTML functions
180 #
183 # ENTER will search but user may search for a button, so put one.
185 search_form() {
186 [ -z "$repo" ] && repo="$(GET repo)"
187 [ -z "$repo" ] && repo="Any"
188 cat << EOT
189 <div class="search">
190 <form method="get" action="$SCRIPT_NAME">
191 <p>
192 <input type="text" name="search" size="20">
193 <input type="submit" value="$(gettext 'Search')">
194 <input class="radius" type="submit" name="files"
195 value="$(_n 'Files')">
196 <input type="hidden" name="repo" value="$repo" />
197 </p>
198 </form>
199 </div>
200 EOT
201 }
204 table_head() {
205 cat << EOT
206 <thead>
207 <tr>
208 <td>$(_ 'Name')</td>
209 <td>$(_ 'Version')</td>
210 <td>$(_ 'Description')</td>
211 <td>$(_ 'Web')</td>
212 </tr>
213 </thead>
214 EOT
215 }
218 sidebar() {
219 [ -n "$repo" ] || repo=Public
220 cat << EOT
221 <div id="sidebar">
222 <h4>$(_ 'Categories')</h4>
223 <a class="active_base-system" href="$SCRIPT_NAME?cat=base-system&repo=$repo" >$(_ 'base-system')</a>
224 <a class="active_x-window" href="$SCRIPT_NAME?cat=x-window&repo=$repo" >$(_ 'x-window')</a>
225 <a class="active_utilities" href="$SCRIPT_NAME?cat=utilities&repo=$repo" >$(_ 'utilities')</a>
226 <a class="active_network" href="$SCRIPT_NAME?cat=network&repo=$repo" >$(_ 'network')</a>
227 <a class="active_games" href="$SCRIPT_NAME?cat=games&repo=$repo" >$(_ 'games')</a>
228 <a class="active_graphics" href="$SCRIPT_NAME?cat=graphics&repo=$repo" >$(_ 'graphics')</a>
229 <a class="active_office" href="$SCRIPT_NAME?cat=office&repo=$repo" >$(_ 'office')</a>
230 <a class="active_multimedia" href="$SCRIPT_NAME?cat=multimedia&repo=$repo" >$(_ 'multimedia')</a>
231 <a class="active_development" href="$SCRIPT_NAME?cat=development&repo=$repo" >$(_ 'development')</a>
232 <a class="active_system-tools" href="$SCRIPT_NAME?cat=system-tools&repo=$repo">$(_ 'system-tools')</a>
233 <a class="active_security" href="$SCRIPT_NAME?cat=security&repo=$repo" >$(_ 'security')</a>
234 <a class="active_misc" href="$SCRIPT_NAME?cat=misc&repo=$repo" >$(_ 'misc')</a>
235 <a class="active_meta" href="$SCRIPT_NAME?cat=meta&repo=$repo" >$(_ 'meta')</a>
236 <a class="active_non-free" href="$SCRIPT_NAME?cat=non-free&repo=$repo" >$(_ 'non-free')</a>
237 <a class="active_all" href="$SCRIPT_NAME?cat=all&repo=$repo" >$(_ 'all')</a>
238 <a class="active_extra" href="$SCRIPT_NAME?cat=extra&repo=$repo" >$(_ 'extra')</a>
239 EOT
241 if [ -d $PKGS_DB/undigest ]; then
242 [ -n "$category" ] || category="base-system"
243 cat << EOT
244 <h4>$(_ 'Repositories')</h4>
245 <a class="repo_Public" href="$SCRIPT_NAME?repo=Public&cat=$category">$(_ 'Public')</a>
246 EOT
248 for i in $(ls $PKGS_DB/undigest); do
249 cat << EOT
250 <a class="repo_$i" href="$SCRIPT_NAME?repo=$i&cat=$category">$i</a>
251 EOT
252 done
254 cat << EOT
255 <a class="repo_Any" href="$SCRIPT_NAME?repo=Any&cat=$category">$(_ 'Any')</a>
256 EOT
257 fi
258 echo "</div>"
259 }
262 repo_list() {
263 if [ -n "$(ls $PKGS_DB/undigest/ 2> /dev/null)" ]; then
264 case "$repo" in
265 Public)
266 ;;
267 ""|Any)
268 for i in $PKGS_DB/undigest/* ; do
269 [ -d "$i" ] && echo "$i$1"
270 done ;;
271 *)
272 echo "$PKGS_DB/undigest/$repo$1"
273 return ;;
274 esac
275 fi
276 echo "$PKGS_DB$1"
277 }
280 repo_name() {
281 case "$1" in
282 $PKGS_DB)
283 echo "Public" ;;
284 $PKGS_DB/undigest/*)
285 echo ${1#$PKGS_DB/undigest/} ;;
286 esac
287 }
290 make_mixed_list() {
291 for L in $LANG ${LANG%%_*}; do
292 if [ -e "$PKGS_DB/packages-desc.$L" ]; then
293 sed '/^#/d' $PKGS_DB/packages-desc.$L
294 break
295 fi
296 done
298 [ -e "$i/blocked-packages.list" ] && cat $i/blocked-packages.list
300 sed 's|.*|&\ti|' $i/installed.info
302 cat $i/packages.info
303 }
306 # Print links to the pages
308 pager() {
309 awk -F'"' -vpage="$page" -vcached="$1" -vnum_lines="$(wc -l < $1)" -vtext="$(_ 'Pages:') " -vurl="cat=$category&amp;repo=$repo&amp;page=" '
310 BEGIN{
311 num_pages = int(num_lines / 100) + (num_lines % 100 != 0)
312 if (num_pages != 1) printf "<p>%s", text
313 }
314 {
315 if (num_pages == 1) exit
316 p = int(NR/100) + 1
317 if (p != page) current = ""; else current=" current"
319 if (NR%100 == 1) printf "<a class=\"pages%s\" href=\"?%s%s\" title=\"%s\n···\n", current, url, p, $6
320 if (NR%100 == 0) printf "%s\">%s</a> ", $6, p - 1
321 }
322 END{
323 if (num_pages == 1) exit
324 if (NR%100 != 0) printf "%s\">%s</a>", $6, p
325 print "</p>"
326 }' $1
327 }
331 #
332 # Commands
333 #
336 case " $(GET) " in
337 *\ list\ *)
338 #
339 # List installed packages. This is the default because parsing
340 # the full packages.desc can be long and take up some resources
341 #
342 cd $INSTALLED
343 search_form
344 sidebar
345 LOADING_MSG="$(_ 'Listing packages...')"
346 loading_msg
347 cat << EOT
348 <h2>$(_ 'My packages')</h2>
349 <form method='get' action='$SCRIPT_NAME'>
350 <input type="hidden" name="do" value="Remove" />
351 <div id="actions">
352 <div class="float-left">
353 $(_ 'Selection:')
354 <input type="submit" value="$(_ 'Remove')" />
355 </div>
356 <div class="float-right">
357 $(show_button recharge)
358 $(show_button up)
359 </div>
360 </div>
362 <table class="zebra outbox pkglist">
363 $(table_head)
364 <tbody>
365 EOT
366 for pkg in *; do
367 . $pkg/receipt
368 echo '<tr>'
369 # Use default tazpkg icon since all packages displayed are
370 # installed
371 blocked=
372 grep -qs "^$pkg$" $PKGS_DB/blocked-packages.list && blocked="b"
373 i18n_desc $pkg
374 cat << EOT
375 <td><input type="checkbox" name="pkg" value="$pkg" />$(pkg_info_link $pkg pkgi$blocked)</td>
376 <td>$VERSION</td>
377 <td>$SHORT_DESC</td>
378 <td><a class="w" href="$WEB_SITE"></a></td>
379 </tr>
380 EOT
381 done
382 cat << EOT
383 </tbody>
384 </table>
385 </form>
386 EOT
387 ;;
390 *\ linkable\ *)
391 #
392 # List linkable packages.
393 #
394 cd $INSTALLED
395 search_form
396 sidebar
397 LOADING_MSG=$(_ 'Listing linkable packages...')
398 loading_msg
399 cat << EOT
400 <h2>$(_ 'Linkable packages')</h2>
402 <form method='get' action='$SCRIPT_NAME'>
403 <input type="hidden" name="do" value="Link" />
404 <div id="actions">
405 <div class="float-left">
406 $(_ 'Selection:')
407 <input type="submit" value="$(_ 'Link')" />
408 </div>
409 <div class="float-right">
410 $(show_button recharge)
411 $(show_button up)
412 </div>
413 </div>
414 EOT
415 cat << EOT
416 <table class="zebra outbox pkglist">
417 $(table_head)
418 <tbody>
419 EOT
420 target=$(readlink $PKGS_DB/fslink)
421 for pkg in $(ls $target/$INSTALLED); do
422 [ -s $pkg/receipt ] && continue
423 . $target/$INSTALLED/$pkg/receipt
424 i18n_desc $pkg
425 cat << EOT
426 <tr>
427 <td><input type="checkbox" name="pkg" value="$pkg" />$(pkg_info_link $pkg pkg)</td>
428 <td>$VERSION</td>
429 <td>$SHORT_DESC</td>
430 <td><a class="w" href="$WEB_SITE"></a></td>
431 </tr>
432 EOT
433 done
434 cat << EOT
435 </tbody>
436 </table>
437 </form>
438 EOT
439 ;;
442 *\ cat\ *)
443 #
444 # List all available packages by category on mirror. Listing all
445 # packages is too resource intensive and not useful.
446 #
447 cd $PKGS_DB
448 repo=$(GET repo)
449 category=$(GET cat)
450 [ -z "$category" ] && category="base-system"
451 search_form
452 sidebar | sed "s/active_$category/active/;s/repo_$repo/active/"
453 LOADING_MSG="$(_ 'Listing packages...')"
454 loading_msg
455 cat << EOT
456 <h2>$(_ 'Category: %s' $category)</h2>
458 <form method='get' action='$SCRIPT_NAME'>
459 <div id="actions">
460 <div class="float-left">
461 $(_ 'Selection:')
462 <input type="submit" name="do" value="Install" />
463 <input type="submit" name="do" value="Remove" />
464 <input type="hidden" name="repo" value="$repo" />
465 </div>
466 <div class="float-right">
467 $(show_button recharge)
468 $(show_button up)
469 $(show_button list)
470 </div>
471 </div>
472 EOT
473 for i in $(repo_list ""); do
474 if [ "$repo" != "Public" ]; then
475 Repo_Name="$(repo_name $i)"
476 cat << EOT
477 <h3>$(_ 'Repository: %s' $Repo_Name)</h3>
478 EOT
479 fi
481 case $category in
482 extra)
483 echo '<table class="zebra outbox pkglist">'
484 table_head
485 echo '<tbody>'
486 NA="$(_n 'n/a')"
487 for pkg in $(cat $i/extra.list); do
488 PKG="$(grep ^$pkg$'\t' $i/installed.info)"
489 if [ -n "$PKG" ]; then
490 echo "$PKG"
491 else
492 echo "$pkg $NA - $NA http://mirror.slitaz.org/packages/get/$pkg - - -"
493 fi
494 done | parse_packages_info
495 echo "</tbody></table>"
496 ;;
497 *)
498 cached="$CACHE_DIR/$repo-$category"
499 make_mixed_list | sort -t$'\t' -k1,1 | awk -F$'\t' -vc="$category" '
500 {
501 if (PKG && PKG != $1) {
502 if (CAT) {
503 if (DSCL) DSC = DSCL
504 printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\"><a class=\"pkg%s%s\" href=\"?info=%s\">%s</a></td><td>%s</td><td>%s</td><td><a href=\"%s\"></a></td></tr>\n", PKG, INS, BLK, gensub(/\+/, "%2B", "g", PKG), PKG, VER, DSC, WEB
505 }
506 VER = DSC = WEB = DSCL = INS = BLK = CAT = ""
507 }
509 PKG = $1
510 if (NF == 1) { BLK = "b"; next }
511 if (NF == 2) { DSCL = $2; next }
512 if (c == "all" || $3 == c) {
513 CAT = c
514 if ($9 == "i") { PKG = $1; VER = $2; DSC = $4; WEB = $5; INS = "i"; next}
515 if (! INS) { PKG = $1; VER = $2; DSC = $4; WEB = $5 }
516 }
517 }' > $cached
518 page=$(GET page); [ -z "$page" ] && page=1
519 pager="$(pager $cached)"
521 echo "$pager"
522 echo '<table class="zebra outbox pkglist">'
523 table_head
524 echo '<tbody>'
525 tail -n+$((($page-1)*100+1)) $cached | head -n100
526 echo "</tbody></table>"
527 echo "$pager"
528 rm -f $cached
529 ;;
530 esac
531 done
532 echo '</form>' ;;
535 *\ search\ *)
536 #
537 # Search for packages. Here default is to search in packages.desc
538 # and so get result including packages names and descriptions
539 #
540 pkg=$(GET search); [ -z "$pkg" ] && xhtml_footer && exit
541 repo=$(GET repo)
542 cd $PKGS_DB
543 search_form
544 sidebar | sed "s/repo_$repo/active/"
545 LOADING_MSG="$(_ 'Searching packages...')"
546 loading_msg
547 cat << EOT
548 <h2>$(_ 'Search packages')</h2>
549 <form method="get" action="$SCRIPT_NAME">
550 <div id="actions">
551 <div class="float-left">
552 $(_ 'Selection:')
553 <input type="submit" name="do" value="Install" />
554 <input type="submit" name="do" value="Remove" />
555 <a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a>
556 </div>
557 <div class="float-right">
558 $(show_button recharge)
559 $(show_button up)
560 $(show_button list)
561 </div>
562 </div>
563 <input type="hidden" name="repo" value="$repo" />
564 EOT
565 if [ -n "$(GET files)" ]; then
566 cat <<EOT
567 <table class="zebra outbox filelist">
568 <thead>
569 <tr>
570 <td>$(_ 'Package')</td>
571 <td>$(_ 'File')</td>
572 </tr>
573 <thead>
574 <tbody>
575 EOT
576 lzcat $(repo_list /files.list.lzma) | grep -Ei ": .*$(GET search)" | \
577 while read PACKAGE FILE; do
578 PACKAGE=${PACKAGE%:}
579 class=pkg; [ -d $INSTALLED/$PACKAGE ] && class=pkgi
580 cat << EOT
581 <tr>
582 <td><input type="checkbox" name="pkg" value="$PACKAGE">$(pkg_info_link $PACKAGE $class)</td>
583 <td>$(echo "$FILE" | sed "s|$pkg|<span class=\"diff-add\">$pkg</span>|g")</td>
584 </tr>
585 EOT
586 done
587 else
588 echo ' <table class="zebra outbox pkglist">'
589 table_head
590 echo " <tbody>"
591 awk -F$'\t' 'BEGIN{IGNORECASE = 1}
592 $1 $4 ~ /'$pkg'/{print $0}' $(repo_list /packages.info) | parse_packages_info
593 fi
594 cat << EOT
595 </tbody>
596 </table>
597 </form>
598 EOT
599 ;;
602 *\ recharge\ *)
603 #
604 # Lets recharge the packages list
605 #
606 search_form
607 sidebar
608 LOADING_MSG="$(_ 'Recharging lists...')"
609 loading_msg
610 cat << EOT
611 <h2>$(_ 'Recharge')</h2>
613 <form method='get' action='$SCRIPT_NAME'>
614 <div id="actions">
615 <div class="float-left">
616 <p>$(_ 'Recharge checks for new or updated packages')</p>
617 </div>
618 <div class="float-right">
619 $(show_button up)
620 $(show_button list)
621 </div>
622 </div>
623 <div class="wrapper">
624 <pre>
625 EOT
626 echo $(_ 'Recharging packages list') | log
627 tazpkg recharge | filter_taztools_msgs
628 cat << EOT
629 </pre>
630 </div>
631 <p>$(_ 'Packages lists are up-to-date. You should check for upgrades now.')</p>
632 EOT
633 ;;
636 *\ up\ *)
637 #
638 # Upgrade packages
639 #
640 cd $PKGS_DB
641 search_form
642 sidebar
643 LOADING_MSG="$(_ 'Checking for upgrades...')"
644 loading_msg
645 cat << EOT
646 <h2>$(_ 'Up packages')</h2>
648 <form method="get" action="$SCRIPT_NAME">
649 <div id="actions">
650 <div class="float-left">
651 $(_ 'Selection:')
652 <input type="submit" name="do" value="Install" />
653 <input type="submit" name="do" value="Remove" />
654 <a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a>
655 </div>
656 <div class="float-right">
657 $(show_button recharge)
658 $(show_button list)
659 </div>
660 </div>
661 EOT
662 tazpkg up --check >/dev/null
663 cat << EOT
664 <table class="zebra outbox">
665 $(table_head)
666 <tbody>
667 EOT
668 for pkg in $(cat packages.up); do
669 grep -hs "^$pkg |" $PKGS_DB/packages.desc $PKGS_DB/undigest/*/packages.desc | \
670 parse_packages_desc
671 done
672 cat << EOT
673 </tbody>
674 </table>
675 </form>
676 EOT
677 ;;
680 *\ do\ *)
681 #
682 # Do an action on one or some packages
683 #
684 opt=""
685 pkgs=""
686 cmdline=$(echo ${QUERY_STRING#do=} | sed s'/&/ /g')
687 cmd=$(echo ${cmdline} | awk '{print $1}')
688 cmdline=${cmdline#*repo=* }
689 pkgs=$(echo $cmdline | sed -e s'/+/ /g' -e s'/pkg=//g' -e s/$cmd//)
690 pkgs="$(httpd -d "$pkgs")"
691 cmd=$(echo $cmd | tr [:upper:] [:lower:])
692 case $cmd in
693 install)
694 cmd=get-install opt=--forced
695 LOADING_MSG="get-installing packages..."
696 ;;
697 link)
698 opt=$(readlink $PKGS_DB/fslink)
699 LOADING_MSG="linking packages..."
700 ;;
701 esac
702 search_form
703 sidebar
704 loading_msg
705 cat << EOT
706 <h2>TazPkg: $cmd</h2>
708 <form method="get" action="$SCRIPT_NAME">
709 <div id="actions">
710 <div class="float-left">
711 <p>$(_ 'Performing tasks on packages')</p>
712 </div>
713 <div class="float-right">
714 $(show_button list)
715 </div>
716 </div>
717 <div class="box">
718 $(_ 'Executing %s for: %s' $cmd $pkgs)
719 </div>
720 EOT
721 for pkg in $pkgs; do
722 echo '<pre>'
723 echo $(_n 'y') | tazpkg $cmd $pkg $opt 2>/dev/null | filter_taztools_msgs
724 echo '</pre>'
725 done ;;
728 *\ info\ *)
729 #
730 # Packages info
731 #
732 pkg=$(GET info)
733 search_form
734 sidebar
735 if [ -d $INSTALLED/$pkg ]; then
736 . $INSTALLED/$pkg/receipt
737 files=$(wc -l < $INSTALLED/$pkg/files.list)
738 action="Remove"
739 else
740 cd $PKGS_DB
741 LOADING_MSG=$(_ 'Getting package info...')
742 loading_msg
743 IFS='|'
744 set -- $(grep -hs "^$pkg |" packages.desc undigest/*/packages.desc)
745 unset IFS
746 PACKAGE=$1
747 VERSION="$(echo $2)"
748 SHORT_DESC="$(echo $3)"
749 CATEGORY="$(echo $4)"
750 WEB_SITE="$(echo $5)"
751 action="Install"
752 temp="${pkg#get-}"
753 fi
754 cat << EOT
755 <h2>$(_ 'Package %s' $PACKAGE)</h2>
757 <div id="actions">
758 <div class="float-left">
759 <p>
760 EOT
761 if [ "$temp" != "$pkg" -a "$action" == "Install" ]; then
762 temp="$(echo $pkg | sed 's/get-//g')"
763 show_button "do=Install&$temp&nf"
764 else
765 show_button "do=$action&$pkg"
766 fi
768 if [ -d $INSTALLED/$pkg ]; then
769 if grep -qs "^$pkg$" $PKGS_DB/blocked-packages.list; then
770 show_button "do=Unblock&$pkg"
771 else
772 show_button "do=Block&$pkg"
773 fi
774 show_button "do=Repack&$pkg"
775 fi
776 i18n_desc $pkg
777 cat << EOT
778 </p>
779 </div>
780 <div class="float-right">
781 $(show_button list)
782 </div>
783 </div>
784 <table class="zebra outbox">
785 <tbody>
786 <tr><td><b>$(_ 'Name')</b></td><td>$PACKAGE</td></tr>
787 <tr><td><b>$(_ 'Version')</b></td><td>$VERSION</td></tr>
788 <tr><td><b>$(_ 'Description')</b></td><td>$SHORT_DESC</td></tr>
789 <tr><td><b>$(_ 'Category')</b></td><td>$CATEGORY</td></tr>
790 EOT
791 if [ -d $INSTALLED/$pkg ]; then
792 cat << EOT
793 <tr><td><b>$(_ 'Maintainer')</b></td><td>$MAINTAINER</td></tr>
794 <tr><td><b>$(_ 'Website')</b></td><td><a href="$WEB_SITE">$WEB_SITE</a></td></tr>
795 <tr><td><b>$(_ 'Sizes')</b></td><td>$PACKED_SIZE/$UNPACKED_SIZE</td></tr>
796 EOT
797 if [ -n "$DEPENDS" ]; then
798 echo "<tr><td><b>$(_ 'Depends')</b></td><td>"
799 for i in $DEPENDS; do
800 pkg_info_link $i
801 done
802 echo "</td></tr>"
803 fi
804 if [ -n "$SUGGESTED" ]; then
805 echo "<tr><td><b>$(_ 'Suggested')</b></td><td>"
806 for i in $SUGGESTED; do
807 pkg_info_link $i
808 done
809 echo "</td></tr>"
810 fi
811 [ -n "$TAGS" ] && echo "<tr><td><b>$(_ 'Tags')</b></td><td>$TAGS</td></tr>"
812 I_FILES=$(cat $INSTALLED/$pkg/files.list | wc -l)
813 cat << EOT
814 </tbody>
815 </table>
816 EOT
817 DESC="$(tazpkg desc $pkg)"
818 [ -n "$DESC" ] && echo "<pre>$DESC</pre>"
820 cat << EOT
821 <p>$(_ 'Installed files: %s' $I_FILES)</p>
823 <pre>$(sort $INSTALLED/$pkg/files.list)</pre>
824 EOT
825 else
826 cat << EOT
827 <tr><td><b>$(_ 'Website')</b></td><td><a href="$WEB_SITE">$WEB_SITE</a></td></tr>
828 <tr><td><b>$(_ 'Sizes')</b></td><td>$(grep -hsA 3 ^$pkg$ packages.txt undigest/*/packages.txt | \
829 tail -n 1 | sed 's/ *//')</td></tr>
830 </table>
832 <p>$(_ 'Installed files:')</p>
834 <pre>
835 $(lzcat files.list.lzma undigest/*/files.list.lzma 2> /dev/null | \
836 sed "/^$pkg: /!d;s/^$pkg: //" | sort)
837 </pre>
838 EOT
839 fi
840 ;;
843 *\ admin\ * )
844 #
845 # TazPkg configuration page
846 #
847 cmd=$(GET admin)
848 case "$cmd" in
849 clean)
850 rm -rf $CACHE_DIR/* ;;
851 add-mirror)
852 # Decode url
853 mirror=$(GET mirror)
854 case "$mirror" in
855 http://*|ftp://*)
856 echo "$mirror" >> $(GET file) ;;
857 esac ;;
858 rm-mirror=http://*|rm-mirror=ftp://*)
859 mirror=${cmd#rm-mirror=}
860 sed -i -e "s@$mirror@@" -e '/^$/d' $(GET file) ;;
861 select-mirror*)
862 release=$(cat /etc/slitaz-release)
863 mirror="$(GET mirror)packages/$release/"
864 tazpkg setup-mirror $mirror | log
865 ;;
866 add-repo)
867 # Decode url
868 mirror=$(GET mirror)
869 repository=$PKGS_DB/undigest/$(GET repository)
870 case "$mirror" in
871 http://*|ftp://*)
872 mkdir -p $repository
873 echo "$mirror" > $repository/mirror
874 echo "$mirror" > $repository/mirrors ;;
875 esac ;;
876 rm-repo=*)
877 repository=${cmd#rm-repo=}
878 rm -rf $PKGS_DB/undigest/$repository ;;
879 esac
880 [ "$cmd" == "$(_n 'Set link')" ] &&
881 [ -d "$(GET link)/$INSTALLED" ] && ln -fs $(GET link) $PKGS_DB/fslink
882 [ "$cmd" == "$(_n 'Remove link')" ] && rm -f $PKGS_DB/fslink
883 cache_files=$(find $CACHE_DIR -name *.tazpkg | wc -l)
884 cache_size=$(du -sh $CACHE_DIR | cut -f1 | sed 's|\.0||')
885 sidebar
886 cat << EOT
887 <h2>$(_ 'Administration')</h2>
888 <div>
889 <p>$(_ 'TazPkg administration and settings')</p>
890 </div>
891 <div id="actions">
892 $(show_button 'admin=&action=saveconf')
893 $(show_button 'admin=&action=listconf')
894 $(show_button 'admin=&action=quickcheck')
895 $(show_button 'admin=&action=fullcheck')
896 </div>
897 EOT
898 case "$(GET action)" in
899 saveconf)
900 LOADING_MSG=$(_ 'Creating the package...')
901 loading_msg
902 echo "<pre>"
903 cd $HOME
904 tazpkg repack-config | filter_taztools_msgs
905 echo -n "$(_ 'Path:') "; ls $HOME/config-*.tazpkg
906 echo "</pre>" ;;
907 listconf)
908 echo "<h4>$(_ 'Configuration files')</h4>"
909 echo "<ul>"
910 tazpkg list-config | while read file; do
911 if [ -e $file ]; then
912 echo "<li><a href=\"index.cgi?file=$file\">$file</a></li>"
913 else
914 echo "<li>$file</li>"
915 fi
916 done
917 echo "</ul>"
918 ;;
919 quickcheck)
920 LOADING_MSG=$(_ 'Checking packages consistency...')
921 loading_msg
922 echo "<pre>"
923 tazpkg check
924 echo "</pre>" ;;
925 fullcheck)
926 LOADING_MSG=$(_ 'Full packages check...')
927 loading_msg
928 echo "<pre>"
929 tazpkg check --full
930 echo "</pre>" ;;
931 esac
932 cat << EOT
933 <h3>$(_ 'Packages cache')</h3>
935 <div>
936 <form method="get" action="$SCRIPT_NAME">
937 <p>
938 $(_ 'Packages in the cache: %s (%s)' $cache_files $cache_size)
939 <input type="hidden" name="admin" value="clean" />
940 <input type="submit" value="Clean" />
941 </p>
942 </form>
943 </div>
945 <h3>$(_ 'Default mirror')</h3>
947 <pre>$(cat $PKGS_DB/mirror)</pre>
949 <h3>$(_ 'Current mirror list')</h3>
950 EOT
951 for i in $PKGS_DB/mirrors $PKGS_DB/undigest/*/mirrors; do
952 [ -s $i ] || continue
953 echo '<div class="box">'
954 if [ $i != $PKGS_DB/mirrors ]; then
955 Repo_Name="$(repo_name $(dirname $i))"
956 echo "<h4>$(_ 'Repository: %s' $Repo_Name)</h4>"
957 fi
958 echo "<ul>"
959 list_mirrors $i
960 echo "</ul>"
961 cat << EOT
962 </div>
963 <form method="get" action="$SCRIPT_NAME">
964 <p>
965 <input type="hidden" name="admin" value="add-mirror" />
966 <input type="hidden" name="file" value="$i" />
967 <input type="text" name="mirror" size="60">
968 <input type="submit" value="Add mirror" />
969 </p>
970 </form>
971 EOT
972 done
973 echo "<h3>$(_ 'Private repositories')</h3>"
974 [ -n "$(ls $PKGS_DB/undigest 2> /dev/null)" ] && cat << EOT
975 <div class="box">
976 <ul>
977 $(list_repos)
978 </ul>
979 </div>
980 EOT
981 cat << EOT
982 <form method="get" action="$SCRIPT_NAME">
983 <p>
984 <input type="hidden" name="admin" value="add-repo" />
985 $(_ 'Name') <input type="text" name="repository" size="10">
986 $(_ 'mirror')
987 <input type="text" name="mirror" value="http://" size="50">
988 <input type="submit" value="Add repository" />
989 </p>
990 </form>
992 <h3>$(_ 'Link to another SliTaz installation')</h3>
994 <p>$(_ "This link points to the root of another SliTaz installation. \
995 You will be able to install packages using soft links to it.")</p>
997 <form method="get" action="$SCRIPT_NAME">
998 <p>
999 <input type="hidden" name="admin" value="add-link" />
1000 <input type="text" name="link"
1001 value="$(readlink $PKGS_DB/fslink 2> /dev/null)" size="50">
1002 <input type="submit" name="admin" value="$(_ 'Set link')" />
1003 <input type="submit" name="admin" value="$(_ 'Remove link')" />
1004 </p>
1005 </form>
1006 EOT
1007 version=$(cat /etc/slitaz-release)
1008 cat << EOT
1010 <h3 id="dvd">$(_ 'SliTaz packages DVD')</h3>
1012 <p>$(_ "A bootable DVD image of all available packages for the %s version is \
1013 generated every day. It also contains a copy of the website and can be used \
1014 without an internet connection. This image can be installed on a DVD or a USB \
1015 key." $version)</p>
1017 <div>
1018 <form method="post" action='$SCRIPT_NAME?admin&action=dvdimage#dvd'>
1019 <p>
1020 <a class="button"
1021 href='http://mirror.slitaz.org/iso/$version/packages-$version.iso'>
1022 <img src="$IMAGES/tazpkg.png" />$(_ 'Download DVD image')</a>
1023 <a class="button" href='$SCRIPT_NAME?admin&action=dvdusbkey#dvd'>
1024 <img src="$IMAGES/tazpkg.png" />$(_ 'Install from DVD/USB key')</a>
1025 </p>
1026 <div class="box">
1027 $(_ 'Install from ISO image:')
1028 <input type="text" name="dvdimage" size="40" value="/root/packages-$version.iso">
1029 </div>
1030 </form>
1031 </div>
1032 EOT
1033 if [ "$(GET action)" == "dvdimage" ]; then
1034 dev=$(POST dvdimage)
1035 mkdir -p /mnt/packages 2> /dev/null
1036 echo "<pre>"
1037 mount -t iso9660 -o loop,ro $dev /mnt/packages &&
1038 /mnt/packages/install.sh &&
1039 _ '%s is installed on /mnt/packages' $dev
1040 echo "</pre>"
1041 fi
1042 if [ "$(GET action)" == "dvdusbkey" ]; then
1043 mkdir -p /mnt/packages 2> /dev/null
1044 for tag in "LABEL=\"packages-$version\" TYPE=\"iso9660\"" \
1045 "LABEL=\"sources-$version\" TYPE=\"iso9660\"" ; do
1046 dev=$(blkid | grep "$tag" | cut -d: -f1)
1047 [ -n "$dev" ] || continue
1048 echo "<pre>"
1049 mount -t iso9660 -o ro $dev /mnt/packages &&
1050 /mnt/packages/install.sh &&
1051 _ '%s is installed on /mnt/packages' $dev
1052 echo "</pre>"
1053 break
1054 done
1055 fi
1056 ;;
1057 *)
1059 # Default to summary
1061 search_form
1062 sidebar
1063 [ -n "$(GET block)" ] && tazpkg block $(GET block)
1064 [ -n "$(GET unblock)" ] && tazpkg unblock $(GET unblock)
1065 cat << EOT
1066 <h2>$(_ 'Summary')</h2>
1068 <div id="actions">
1069 $(show_button list)
1070 EOT
1071 fslink=$(readlink $PKGS_DB/fslink)
1072 [ -n "$fslink" -a -d "$fslink/$INSTALLED" ] && show_button linkable
1073 show_button recharge
1074 show_button up
1075 show_button admin
1076 cat << EOT
1077 </div>
1079 $(packages_summary)
1082 <h3>$(_ 'Latest log entries')</h3>
1084 <pre>
1085 $(tail -n 5 $LOG | fgrep "-" | awk '{print $1, $2, $3, $4, $5, $6, $7}')
1086 </pre>
1087 EOT
1088 ;;
1089 esac
1091 # xHTML 5 footer
1092 export TEXTDOMAIN='tazpkg'
1093 xhtml_footer
1094 exit 0