tazpkg view tazpanel/pkgs.cgi @ rev 722

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