tazpkg view tazpanel/pkgs.cgi @ rev 718

pkgs.cgi: new package' links (less HTML, more CSS); add pkgs.css; transition to packages.info.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Thu Dec 18 03:43:49 2014 +0200 (2014-12-18)
parents 1dea2235808c
children 474681a166a8
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 class="pkg"><input type="checkbox" name="pkg" value="$PACKAGE">$(pkg_info_link $PACKAGE $class)</td>
57 <td>$VERSION</td>
58 <td class="desc">$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 class="pkg"><input type="checkbox" name="pkg" value="$PACKAGE">$(pkg_info_link $PACKAGE $class)</td>
75 <td>$VERSION</td>
76 <td class="desc">$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 }
266 #
267 # Commands
268 #
271 case " $(GET) " in
272 *\ list\ *)
273 #
274 # List installed packages. This is the default because parsing
275 # the full packages.desc can be long and take up some resources
276 #
277 cd $INSTALLED
278 search_form
279 sidebar
280 LOADING_MSG="$(_ 'Listing packages...')"
281 loading_msg
282 cat << EOT
283 <h2>$(_ 'My packages')</h2>
284 <form method='get' action='$SCRIPT_NAME'>
285 <input type="hidden" name="do" value="Remove" />
286 <div id="actions">
287 <div class="float-left">
288 $(_ 'Selection:')
289 <input type="submit" value="$(_ 'Remove')" />
290 </div>
291 <div class="float-right">
292 <a class="button" href="$SCRIPT_NAME?recharge">
293 <img src="$IMAGES/recharge.png" />$(_ 'Recharge list')</a>
294 <a class="button" href='$SCRIPT_NAME?up'>
295 <img src="$IMAGES/update.png" />$(_ 'Check upgrades')</a>
296 </div>
297 </div>
299 <table class="zebra outbox">
300 $(table_head)
301 <tbody>
302 EOT
303 for pkg in *; do
304 . $pkg/receipt
305 echo '<tr>'
306 # Use default tazpkg icon since all packages displayed are
307 # installed
308 blocked=
309 grep -qs "^$pkg$" $PKGS_DB/blocked-packages.list && blocked="b"
310 i18n_desc $pkg
311 cat << EOT
312 <td class="pkg"><input type="checkbox" name="pkg" value="$pkg" />$(pkg_info_link $pkg pkgi$blocked)</td>
313 <td>$VERSION</td>
314 <td class="desc">$SHORT_DESC</td>
315 <td><a class="w" href="$WEB_SITE"></a></td>
316 </tr>
317 EOT
318 done
319 cat << EOT
320 </tbody>
321 </table>
322 </form>
323 EOT
324 ;;
327 *\ linkable\ *)
328 #
329 # List linkable packages.
330 #
331 cd $INSTALLED
332 search_form
333 sidebar
334 LOADING_MSG=$(_ 'Listing linkable packages...')
335 loading_msg
336 cat << EOT
337 <h2>$(_ 'Linkable packages')</h2>
339 <form method='get' action='$SCRIPT_NAME'>
340 <input type="hidden" name="do" value="Link" />
341 <div id="actions">
342 <div class="float-left">
343 $(_ 'Selection:')
344 <input type="submit" value="$(_ 'Link')" />
345 </div>
346 <div class="float-right">
347 <a class="button" href="$SCRIPT_NAME?recharge">
348 <img src="$IMAGES/recharge.png" />$(_ 'Recharge list')</a>
349 <a class="button" href="$SCRIPT_NAME?up">
350 <img src="$IMAGES/update.png" />$(_ 'Check upgrades')</a>
351 </div>
352 </div>
353 EOT
354 cat << EOT
355 <table class="zebra outbox">
356 $(table_head)
357 <tbody>
358 EOT
359 target=$(readlink $PKGS_DB/fslink)
360 for pkg in $(ls $target/$INSTALLED); do
361 [ -s $pkg/receipt ] && continue
362 . $target/$INSTALLED/$pkg/receipt
363 i18n_desc $pkg
364 cat << EOT
365 <tr>
366 <td class="pkg"><input type="checkbox" name="pkg" value="$pkg" />$(pkg_info_link $pkg pkg)</td>
367 <td>$VERSION</td>
368 <td class="desc">$SHORT_DESC</td>
369 <td><a class="w" href="$WEB_SITE"></a></td>
370 </tr>
371 EOT
372 done
373 cat << EOT
374 </tbody>
375 </table>
376 </form>
377 EOT
378 ;;
381 *\ cat\ *)
382 #
383 # List all available packages by category on mirror. Listing all
384 # packages is too resource intensive and not useful.
385 #
386 cd $PKGS_DB
387 repo=$(GET repo)
388 category=$(GET cat)
389 [ "$category" == "cat" ] && category="base-system"
390 #grep_category=$category
391 #[ "$grep_category" == "all" ] && grep_category="*"
392 search_form
393 sidebar | sed "s/active_$category/active/;s/repo_$repo/active/"
394 LOADING_MSG="$(_ 'Listing packages...')"
395 loading_msg
396 cat << EOT
397 <h2>$(_ 'Category: %s' $category)</h2>
399 <form method='get' action='$SCRIPT_NAME'>
400 <div id="actions">
401 <div class="float-left">
402 $(_ 'Selection:')
403 <input type="submit" name="do" value="Install" />
404 <input type="submit" name="do" value="Remove" />
405 <input type="hidden" name="repo" value="$repo" />
406 </div>
407 <div class="float-right">
408 <a class="button" href="$SCRIPT_NAME?recharge">
409 <img src="$IMAGES/recharge.png" />$(_ 'Recharge list')</a>
410 <a class="button" href="$SCRIPT_NAME?up">
411 <img src="$IMAGES/update.png" />$(_ 'Check upgrades')</a>
412 <a class="button" href='$SCRIPT_NAME?list'>
413 <img src="$IMAGES/tazpkg.png" />$(_ 'My packages')</a>
414 </div>
415 </div>
416 EOT
417 for i in $(repo_list ""); do
418 if [ "$repo" != "Public" ]; then
419 Repo_Name="$(repo_name $i)"
420 cat << EOT
421 <h3>$(_ 'Repository: %s' $Repo_Name)</h3>
422 EOT
423 fi
424 echo '<table class="zebra outbox">'
425 table_head
426 echo '<tbody>'
428 case $category in
429 extra)
430 sed 's|.*|& -- - -- http://mirror.slitaz.org/packages/get/& - - -|' \
431 $i/extra.list | parse_packages_info
432 ;;
433 all)
434 parse_packages_info < $i/packages.info
435 ;;
436 *)
437 awk -F$'\t' -vc=$category '{if ($3 == c) print $0}' \
438 $i/packages.info | parse_packages_info
439 ;;
440 esac
441 cat << EOT
442 </tbody>
443 </table>
444 EOT
445 done
446 echo '</form>' ;;
449 *\ search\ *)
450 #
451 # Search for packages. Here default is to search in packages.desc
452 # and so get result including packages names and descriptions
453 #
454 pkg=$(GET search)
455 repo=$(GET repo)
456 cd $PKGS_DB
457 search_form
458 sidebar | sed "s/repo_$repo/active/"
459 LOADING_MSG="$(_ 'Searching packages...')"
460 loading_msg
461 cat << EOT
462 <h2>$(_ 'Search packages')</h2>
463 <form method="get" action="$SCRIPT_NAME">
464 <div id="actions">
465 <div class="float-left">
466 $(_ 'Selection:')
467 <input type="submit" name="do" value="Install" />
468 <input type="submit" name="do" value="Remove" />
469 <a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a>
470 </div>
471 <div class="float-right">
472 <a class="button" href="$SCRIPT_NAME?recharge">
473 <img src="$IMAGES/recharge.png" />$(_ 'Recharge list')</a>
474 <a class="button" href="$SCRIPT_NAME?up">
475 <img src="$IMAGES/update.png" />$(_ 'Check upgrades')</a>
476 <a class="button" href='$SCRIPT_NAME?list'>
477 <img src="$IMAGES/tazpkg.png" />$(_ 'My packages')</a>
478 </div>
479 </div>
480 <input type="hidden" name="repo" value="$repo" />
482 <table class="zebra outbox">
483 EOT
484 if [ "$(GET files)" ]; then
485 cat <<EOT
486 <thead>
487 <tr>
488 <td>$(_ 'Package')</td>
489 <td>$(_ 'File')</td>
490 </tr>
491 <thead>
492 <tbody>
493 EOT
494 lzcat $(repo_list /files.list.lzma) | grep -Ei ": .*$(GET search)" | \
495 while read PACKAGE FILE; do
496 PACKAGE=${PACKAGE%:}
497 class=pkg; [ -d $INSTALLED/$PACKAGE ] && class=pkgi
498 cat << EOT
499 <tr>
500 <td class="pkg"><input type="checkbox" name="pkg" value="$PACKAGE">$(pkg_info_link $PACKAGE $class)</td>
501 <td>$FILE</td>
502 </tr>
503 EOT
504 done
505 else
506 table_head
507 echo " <tbody>"
508 awk -F$'\t' 'BEGIN{IGNORECASE = 1}
509 $1 $4 ~ /'$pkg'/{print $0}' $(repo_list /packages.info) | parse_packages_info
510 fi
511 cat << EOT
512 </tbody>
513 </table>
514 </form>
515 EOT
516 ;;
519 *\ recharge\ *)
520 #
521 # Lets recharge the packages list
522 #
523 search_form
524 sidebar
525 LOADING_MSG="$(_ 'Recharging lists...')"
526 loading_msg
527 cat << EOT
528 <h2>$(_ 'Recharge')</h2>
530 <form method='get' action='$SCRIPT_NAME'>
531 <div id="actions">
532 <div class="float-left">
533 <p>$(_ 'Recharge checks for new or updated packages')</p>
534 </div>
535 <div class="float-right">
536 <a class="button" href='$SCRIPT_NAME?up'>
537 <img src="$IMAGES/update.png" />$(_ 'Check upgrades')</a>
538 <a class="button" href='$SCRIPT_NAME?list'>
539 <img src="$IMAGES/tazpkg.png" />$(_ 'My packages')</a>
540 </div>
541 </div>
542 <div class="wrapper">
543 <pre>
544 EOT
545 echo $(_ 'Recharging packages list') | log
546 tazpkg recharge | filter_taztools_msgs
547 cat << EOT
548 </pre>
549 </div>
550 <p>$(_ 'Packages lists are up-to-date. You should check for upgrades now.')</p>
551 EOT
552 ;;
555 *\ up\ *)
556 #
557 # Upgrade packages
558 #
559 cd $PKGS_DB
560 search_form
561 sidebar
562 LOADING_MSG="$(_ 'Checking for upgrades...')"
563 loading_msg
564 cat << EOT
565 <h2>$(_ 'Up packages')</h2>
567 <form method="get" action="$SCRIPT_NAME">
568 <div id="actions">
569 <div class="float-left">
570 $(_ 'Selection:')
571 <input type="submit" name="do" value="Install" />
572 <input type="submit" name="do" value="Remove" />
573 <a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a>
574 </div>
575 <div class="float-right">
576 <a class="button" href="$SCRIPT_NAME?recharge">
577 <img src="$IMAGES/recharge.png" />$(_ 'Recharge list')</a>
578 <a class="button" href="$SCRIPT_NAME?list">
579 <img src="$IMAGES/tazpkg.png" />$(_ 'My packages')</a>
580 </div>
581 </div>
582 EOT
583 tazpkg up --check >/dev/null
584 cat << EOT
585 <table class="zebra outbox">
586 $(table_head)
587 <tbody>
588 EOT
589 for pkg in `cat packages.up`
590 do
591 grep -hs "^$pkg |" $PKGS_DB/packages.desc \
592 $PKGS_DB/undigest/*/packages.desc | \
593 parse_packages_desc
594 done
595 cat << EOT
596 </tbody>
597 </table>
598 </form>
599 EOT
600 ;;
603 *\ do\ *)
604 #
605 # Do an action on one or some packages
606 #
607 opt=""
608 pkgs=""
609 cmdline=$(echo ${QUERY_STRING#do=} | sed s'/&/ /g')
610 cmd=$(echo ${cmdline} | awk '{print $1}')
611 cmdline=${cmdline#*repo=* }
612 pkgs=$(echo $cmdline | sed -e s'/+/ /g' -e s'/pkg=//g' -e s/$cmd//)
613 pkgs="$(httpd -d "$pkgs")"
614 cmd=$(echo $cmd | tr [:upper:] [:lower:])
615 case $cmd in
616 install)
617 cmd=get-install opt=--forced
618 LOADING_MSG="get-installing packages..."
619 ;;
620 link)
621 opt=$(readlink $PKGS_DB/fslink)
622 LOADING_MSG="linking packages..."
623 ;;
624 esac
625 search_form
626 sidebar
627 loading_msg
628 cat << EOT
629 <h2>TazPkg: $cmd</h2>
631 <form method="get" action="$SCRIPT_NAME">
632 <div id="actions">
633 <div class="float-left">
634 <p>$(_ 'Performing tasks on packages')</p>
635 </div>
636 <div class="float-right">
637 <p>
638 <a class="button" href="$SCRIPT_NAME?list">
639 <img src="$IMAGES/tazpkg.png" />$(_ 'My packages')</a>
640 </p>
641 </div>
642 </div>
643 <div class="box">
644 $(_ 'Executing %s for: %s' $cmd $pkgs)
645 </div>
646 EOT
647 for pkg in $pkgs; do
648 echo '<pre>'
649 echo $(_n 'y') | tazpkg $cmd $pkg $opt 2>/dev/null | filter_taztools_msgs
650 echo '</pre>'
651 done ;;
654 *\ info\ *)
655 #
656 # Packages info
657 #
658 pkg=$(GET info)
659 search_form
660 sidebar
661 if [ -d $INSTALLED/$pkg ]; then
662 . $INSTALLED/$pkg/receipt
663 files=$(wc -l < $INSTALLED/$pkg/files.list)
664 action="Remove"
665 action_i18n=$(_ 'Remove')
666 else
667 cd $PKGS_DB
668 LOADING_MSG=$(_ 'Getting package info...')
669 loading_msg
670 IFS='|'
671 set -- $(grep -hs "^$pkg |" packages.desc undigest/*/packages.desc)
672 unset IFS
673 PACKAGE=$1
674 VERSION="$(echo $2)"
675 SHORT_DESC="$(echo $3)"
676 CATEGORY="$(echo $4)"
677 WEB_SITE="$(echo $5)"
678 action="Install"
679 action_i18n=$(_ 'Install')
680 temp="${pkg#get-}"
681 fi
682 cat << EOT
683 <h2>$(_ 'Package %s' $PACKAGE)</h2>
685 <div id="actions">
686 <div class="float-left">
687 <p>
688 EOT
689 if [ "$temp" != "$pkg" -a "$action" == "Install" ]; then
690 temp="$(echo $pkg | sed 's/get-//g')"
691 echo "<a class='button' href='$SCRIPT_NAME?do=Install&$temp'>$(_ 'Install (Non Free)')</a>"
692 else
693 echo "<a class='button' href='$SCRIPT_NAME?do=$action&$pkg'>$action_i18n</a>"
694 fi
696 if [ -d $INSTALLED/$pkg ]; then
697 if grep -qs "^$pkg$" $PKGS_DB/blocked-packages.list; then
698 cat << EOT
699 <a class="button" href="$SCRIPT_NAME?do=Unblock&$pkg">$(_ 'Unblock')</a>
700 EOT
701 else
702 cat << EOT
703 <a class="button" href='$SCRIPT_NAME?do=Block&$pkg'>$(_ 'Block')</a>
704 EOT
705 fi
706 cat << EOT
707 <a class="button" href='$SCRIPT_NAME?do=Repack&$pkg'>$(_ 'Repack')</a>
708 EOT
709 fi
710 i18n_desc $pkg
711 cat << EOT
712 </p>
713 </div>
714 <div class="float-right">
715 <p>
716 <a class="button" href='$SCRIPT_NAME?list'>
717 <img src="$IMAGES/tazpkg.png" />$(_ 'My packages')</a>
718 </p>
719 </div>
720 </div>
721 <table class="zebra outbox">
722 <tbody>
723 <tr><td><b>$(_ 'Name')</b></td><td>$PACKAGE</td></tr>
724 <tr><td><b>$(_ 'Version')</b></td><td>$VERSION</td></tr>
725 <tr><td><b>$(_ 'Description')</b></td><td>$SHORT_DESC</td></tr>
726 <tr><td><b>$(_ 'Category')</b></td><td>$CATEGORY</td></tr>
727 EOT
728 if [ -d $INSTALLED/$pkg ]; then
729 cat << EOT
730 <tr><td><b>$(_ 'Maintainer')</b></td><td>$MAINTAINER</td></tr>
731 <tr><td><b>$(_ 'Website')</b></td><td><a href="$WEB_SITE">$WEB_SITE</a></td></tr>
732 <tr><td><b>$(_ 'Sizes')</b></td><td>$PACKED_SIZE/$UNPACKED_SIZE</td></tr>
733 EOT
734 if [ -n "$DEPENDS" ]; then
735 echo "<tr><td><b>$(_ 'Depends')</b></td><td>"
736 for i in $DEPENDS; do
737 pkg_info_link $i
738 done
739 echo "</td></tr>"
740 fi
741 if [ -n "$SUGGESTED" ]; then
742 echo "<tr><td><b>$(_ 'Suggested')</b></td><td>"
743 for i in $SUGGESTED; do
744 pkg_info_link $i
745 done
746 echo "</td></tr>"
747 fi
748 [ -n "$TAGS" ] && echo "<tr><td><b>$(_ 'Tags')</b></td><td>$TAGS</td></tr>"
749 I_FILES=$(cat $INSTALLED/$pkg/files.list | wc -l)
750 cat << EOT
751 </tbody>
752 </table>
753 EOT
754 DESC="$(tazpkg desc $pkg)"
755 [ -n "$DESC" ] && echo "<pre>$DESC</pre>"
757 cat << EOT
758 <p>$(_ 'Installed files: %s' $I_FILES)</p>
760 <pre>$(sort $INSTALLED/$pkg/files.list)</pre>
761 EOT
762 else
763 cat << EOT
764 <tr><td><b>$(_ 'Website')</b></td><td><a href="$WEB_SITE">$WEB_SITE</a></td></tr>
765 <tr><td><b>$(_ 'Sizes')</b></td><td>$(grep -hsA 3 ^$pkg$ packages.txt undigest/*/packages.txt | \
766 tail -n 1 | sed 's/ *//')</td></tr>
767 </table>
769 <p>$(_ 'Installed files:')</p>
771 <pre>
772 $(lzcat files.list.lzma undigest/*/files.list.lzma 2> /dev/null | \
773 sed "/^$pkg: /!d;s/^$pkg: //" | sort)
774 </pre>
775 EOT
776 fi
777 ;;
780 *\ admin\ * )
781 #
782 # TazPkg configuration page
783 #
784 cmd=$(GET admin)
785 case "$cmd" in
786 clean)
787 rm -rf /var/cache/tazpkg/* ;;
788 add-mirror)
789 # Decode url
790 mirror=$(GET mirror)
791 case "$mirror" in
792 http://*|ftp://*)
793 echo "$mirror" >> $(GET file) ;;
794 esac ;;
795 rm-mirror=http://*|rm-mirror=ftp://*)
796 mirror=${cmd#rm-mirror=}
797 sed -i -e "s@$mirror@@" -e '/^$/d' $(GET file) ;;
798 select-mirror*)
799 release=$(cat /etc/slitaz-release)
800 mirror="$(GET mirror)packages/$release/"
801 tazpkg setup-mirror $mirror | log
802 ;;
803 add-repo)
804 # Decode url
805 mirror=$(GET mirror)
806 repository=$PKGS_DB/undigest/$(GET repository)
807 case "$mirror" in
808 http://*|ftp://*)
809 mkdir -p $repository
810 echo "$mirror" > $repository/mirror
811 echo "$mirror" > $repository/mirrors ;;
812 esac ;;
813 rm-repo=*)
814 repository=${cmd#rm-repo=}
815 rm -rf $PKGS_DB/undigest/$repository ;;
816 esac
817 [ "$cmd" == "$(_n 'Set link')" ] &&
818 [ -d "$(GET link)/$INSTALLED" ] &&
819 ln -fs $(GET link) $PKGS_DB/fslink
820 [ "$cmd" == "$(_n 'Remove link')" ] &&
821 rm -f $PKGS_DB/fslink
822 cache_files=$(find /var/cache/tazpkg -name *.tazpkg | wc -l)
823 cache_size=$(du -sh /var/cache/tazpkg | cut -f1 | sed 's|\.0||')
824 sidebar
825 cat << EOT
826 <h2>$(_ 'Administration')</h2>
827 <div>
828 <p>$(_ 'TazPkg administration and settings')</p>
829 </div>
830 <div id="actions">
831 <a class="button" href='$SCRIPT_NAME?admin=&action=saveconf'>
832 <img src="$IMAGES/tazpkg.png" />$(_ 'Save configuration')</a>
833 <a class="button" href='$SCRIPT_NAME?admin=&action=listconf'>
834 <img src="$IMAGES/edit.png" />$(_ 'List configuration files')</a>
835 <a class="button" href='$SCRIPT_NAME?admin=&action=quickcheck'>
836 <img src="$IMAGES/recharge.png" />$(_ 'Quick check')</a>
837 <a class="button" href='$SCRIPT_NAME?admin=&action=fullcheck'>
838 <img src="$IMAGES/recharge.png" />$(_ 'Full check')</a>
839 </div>
840 EOT
841 case "$(GET action)" in
842 saveconf)
843 LOADING_MSG=$(_ 'Creating the package...')
844 loading_msg
845 echo "<pre>"
846 cd $HOME
847 tazpkg repack-config | filter_taztools_msgs
848 echo -n "$(_ 'Path:') "; ls $HOME/config-*.tazpkg
849 echo "</pre>" ;;
850 listconf)
851 echo "<h4>$(_ 'Configuration files')</h4>"
852 echo "<ul>"
853 tazpkg list-config | while read file; do
854 [ "${file:0:1}" == "/" ] || continue
855 if [ -e $file ]; then
856 echo "<li><a href=\"index.cgi?file=$file\">$file</a></li>"
857 else
858 echo "<li>$file</li>"
859 fi
860 done
861 echo "</ul>"
862 echo "</pre>" ;;
863 quickcheck)
864 LOADING_MSG=$(_ 'Checking packages consistency...')
865 loading_msg
866 echo "<pre>"
867 tazpkg check
868 echo "</pre>" ;;
869 fullcheck)
870 LOADING_MSG=$(_ 'Full packages check...')
871 loading_msg
872 echo "<pre>"
873 tazpkg check --full
874 echo "</pre>" ;;
875 esac
876 cat << EOT
877 <h3>$(_ 'Packages cache')</h3>
879 <div>
880 <form method="get" action="$SCRIPT_NAME">
881 <p>
882 $(_ 'Packages in the cache: %s (%s)' $cache_files $cache_size)
883 <input type="hidden" name="admin" value="clean" />
884 <input type="submit" value="Clean" />
885 </p>
886 </form>
887 </div>
889 <h3>$(_ 'Default mirror')</h3>
891 <pre>$(cat /var/lib/tazpkg/mirror)</pre>
893 <h3>$(_ 'Current mirror list')</h3>
894 EOT
895 for i in $PKGS_DB/mirrors $PKGS_DB/undigest/*/mirrors; do
896 [ -s $i ] || continue
897 echo '<div class="box">'
898 if [ $i != $PKGS_DB/mirrors ]; then
899 Repo_Name="$(repo_name $(dirname $i))"
900 echo "<h4>$(_ 'Repository: %s' $Repo_Name)</h4>"
901 fi
902 echo "<ul>"
903 list_mirrors $i
904 echo "</ul>"
905 cat << EOT
906 </div>
907 <form method="get" action="$SCRIPT_NAME">
908 <p>
909 <input type="hidden" name="admin" value="add-mirror" />
910 <input type="hidden" name="file" value="$i" />
911 <input type="text" name="mirror" size="60">
912 <input type="submit" value="Add mirror" />
913 </p>
914 </form>
915 EOT
916 done
917 echo "<h3>$(_ 'Private repositories')</h3>"
918 [ -n "$(ls $PKGS_DB/undigest 2> /dev/null)" ] && cat << EOT
919 <div class="box">
920 <ul>
921 $(list_repos)
922 </ul>
923 </div>
924 EOT
925 cat << EOT
926 <form method="get" action="$SCRIPT_NAME">
927 <p>
928 <input type="hidden" name="admin" value="add-repo" />
929 $(_ 'Name') <input type="text" name="repository" size="10">
930 $(_ 'mirror')
931 <input type="text" name="mirror" value="http://" size="50">
932 <input type="submit" value="Add repository" />
933 </p>
934 </form>
936 <h3>$(_ 'Link to another SliTaz installation')</h3>
938 <p>$(_ "This link points to the root of another SliTaz installation. \
939 You will be able to install packages using soft links to it.")</p>
941 <form method="get" action="$SCRIPT_NAME">
942 <p>
943 <input type="hidden" name="admin" value="add-link" />
944 <input type="text" name="link"
945 value="$(readlink $PKGS_DB/fslink 2> /dev/null)" size="50">
946 <input type="submit" name="admin" value="$(_ 'Set link')" />
947 <input type="submit" name="admin" value="$(_ 'Remove link')" />
948 </p>
949 </form>
950 EOT
951 version=$(cat /etc/slitaz-release)
952 cat << EOT
954 <h3 id="dvd">$(_ 'SliTaz packages DVD')</h3>
956 <p>$(_ "A bootable DVD image of all available packages for the %s version is \
957 generated every day. It also contains a copy of the website and can be used \
958 without an internet connection. This image can be installed on a DVD or a USB \
959 key." $version)</p>
961 <div>
962 <form method="post" action='$SCRIPT_NAME?admin&action=dvdimage#dvd'>
963 <p>
964 <a class="button"
965 href='http://mirror.slitaz.org/iso/$version/packages-$version.iso'>
966 <img src="$IMAGES/tazpkg.png" />$(_ 'Download DVD image')</a>
967 <a class="button" href='$SCRIPT_NAME?admin&action=dvdusbkey#dvd'>
968 <img src="$IMAGES/tazpkg.png" />$(_ 'Install from DVD/USB key')</a>
969 </p>
970 <div class="box">
971 $(_ 'Install from ISO image:')
972 <input type="text" name="dvdimage" size="40" value="/root/packages-$version.iso">
973 </div>
974 </form>
975 </div>
976 EOT
977 if [ "$(GET action)" == "dvdimage" ]; then
978 dev=$(POST dvdimage)
979 mkdir -p /mnt/packages 2> /dev/null
980 echo "<pre>"
981 mount -t iso9660 -o loop,ro $dev /mnt/packages &&
982 /mnt/packages/install.sh &&
983 _ '%s is installed on /mnt/packages' $dev
984 echo "</pre>"
985 fi
986 if [ "$(GET action)" == "dvdusbkey" ]; then
987 mkdir -p /mnt/packages 2> /dev/null
988 for tag in "LABEL=\"packages-$version\" TYPE=\"iso9660\"" \
989 "LABEL=\"sources-$version\" TYPE=\"iso9660\"" ; do
990 dev=$(blkid | grep "$tag" | cut -d: -f1)
991 [ -n "$dev" ] || continue
992 echo "<pre>"
993 mount -t iso9660 -o ro $dev /mnt/packages &&
994 /mnt/packages/install.sh &&
995 _ '%s is installed on /mnt/packages' $dev
996 echo "</pre>"
997 break
998 done
999 fi
1000 ;;
1001 *)
1003 # Default to summary
1005 search_form
1006 sidebar
1007 [ -n "$(GET block)" ] && tazpkg block $(GET block)
1008 [ -n "$(GET unblock)" ] && tazpkg unblock $(GET unblock)
1009 cat << EOT
1010 <h2>$(_ 'Summary')</h2>
1012 <div id="actions">
1013 <a class="button" href="$SCRIPT_NAME?list">
1014 <img src="$IMAGES/tazpkg.png" />$(_ 'My packages')</a>
1015 EOT
1016 fslink=$(readlink $PKGS_DB/fslink)
1017 [ -n "$fslink" -a -d "$fslink/$INSTALLED" ] &&
1018 cat << EOT
1019 <a class="button" href="$SCRIPT_NAME?linkable">
1020 <img src="$IMAGES/tazpkg.png" />$(_ 'Linkable packages')</a>
1021 EOT
1022 cat << EOT
1023 <a class="button" href="$SCRIPT_NAME?recharge">
1024 <img src="$IMAGES/recharge.png" />$(_ 'Recharge list')</a>
1025 <a class="button" href="$SCRIPT_NAME?up">
1026 <img src="$IMAGES/update.png" />$(_ 'Check upgrades')</a>
1027 <a class="button" href="$SCRIPT_NAME?admin">
1028 <img src="$IMAGES/edit.png" />$(_ 'Administration')</a>
1029 </div>
1031 $(packages_summary)
1034 <h3>$(_ 'Latest log entries')</h3>
1036 <pre>
1037 $(tail -n 5 /var/log/slitaz/tazpkg.log | fgrep "-" | \
1038 awk '{print $1, $2, $3, $4, $5, $6, $7}')
1039 </pre>
1040 EOT
1041 ;;
1042 esac
1044 # xHTML 5 footer
1045 export TEXTDOMAIN='tazpkg'
1046 xhtml_footer
1047 exit 0