tazpkg view tazpanel/pkgs.cgi @ rev 745

pkgs.cgi: show last recharge date in a different way; fix Makefile.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Sun Jan 11 11:51:31 2015 +0200 (2015-01-11)
parents 31829db351f2
children 1d6e23a2782f
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
21 _() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; echo; }
22 _n() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; }
23 _p() {
24 local S="$1" P="$2" N="$3"; shift; shift; shift;
25 printf "$(ngettext "$S" "$P" "$N")" "$@"; }
28 # xHTML 5 header with special side bar for categories.
29 TITLE=$(TEXTDOMAIN='tazpkg'; _ 'TazPanel - Packages')
30 xhtml_header | sed 's/id="content"/id="content-sidebar"/'
32 export TEXTDOMAIN='tazpkg'
34 pkg_info_link()
35 {
36 echo "<a class=\"$2\" href=\"?info=${1//+/%2B}\">$1</a>" | sed 's| class=""||'
37 }
40 # Display localized short description
42 i18n_desc() {
43 for L in $LANG ${LANG%%_*}; do
44 if [ -e "$PKGS_DB/packages-desc.$L" ]; then
45 LOCDESC=$(awk -F$'\t' -vp=$1 '{if ($1 == p) print $2}' $PKGS_DB/packages-desc.$L)
46 if [ -n "$LOCDESC" ]; then
47 SHORT_DESC="$LOCDESC"
48 break
49 fi
50 fi
51 done
52 }
55 # We need packages information for list and search
57 parse_packages_desc() {
58 IFS="|"
59 cut -f 1,2,3,5 -d "|" | while read PACKAGE VERSION SHORT_DESC WEB_SITE
60 do
61 class=pkg; [ -d $INSTALLED/${PACKAGE% } ] && class=pkgi
62 i18n_desc $PACKAGE
63 cat << EOT
64 <tr>
65 <td><input type="checkbox" name="pkg" value="$PACKAGE">$(pkg_info_link $PACKAGE $class)</td>
66 <td>$VERSION</td>
67 <td>$SHORT_DESC</td>
68 <td><a class="w" href="$WEB_SITE"></a></td>
69 </tr>
70 EOT
71 done
72 unset IFS
73 }
76 parse_packages_info() {
77 IFS=$'\t'
78 while read PACKAGE VERSION CATEGORY SHORT_DESC WEB_SITE TAGS SIZES DEPENDS; do
79 class=pkg; grep -q "^$PACKAGE$'\t'" $PKGS_DB/installed.info && class=pkgi
80 i18n_desc $PACKAGE
81 cat << EOT
82 <tr>
83 <td><input type="checkbox" name="pkg" value="$PACKAGE">$(pkg_info_link $PACKAGE $class)</td>
84 <td>$VERSION</td>
85 <td>$SHORT_DESC</td>
86 <td><a class="w" href="$WEB_SITE"></a></td>
87 </tr>
88 EOT
89 done
90 unset IFS
91 }
94 # Parse mirrors list to be able to have an icon and remove link
96 list_mirrors() {
97 while read line
98 do
99 cat << EOT
100 <li>
101 <a href="?admin=rm-mirror=$line&amp;file=$(httpd -e $1)">
102 <img src="$IMAGES/clear.png" title="$(_ 'Delete')" />
103 </a>
104 <a href="?admin=select-mirror&amp;mirror=$line">
105 <img src="$IMAGES/start.png" title="$(_ 'Use as default')" />
106 </a>
107 <a href="$line">$line</a>
108 </li>
109 EOT
110 done < $1
111 }
114 # Parse repositories list to be able to have an icon and remove link
116 list_repos() {
117 ls $PKGS_DB/undigest 2> /dev/null | while read repo ; do
118 cat <<EOT
119 <li><a href="?admin=rm-repo=$repo">
120 <img src="$IMAGES/clear.png">$repo</a></li>
121 EOT
122 done
123 }
126 # Show button
127 show_button() {
128 case $1 in
129 recharge) img='recharge'; label="$(_ 'Recharge list')" ;;
130 up) img='update'; label="$(_ 'Check upgrades')" ;;
131 list) img='tazpkg'; label="$(_ 'My packages')" ;;
132 tag=) img=''; label="$(_ 'Tags')" ;;
133 linkable) img='tazpkg'; label="$(_ 'Linkable packages')" ;;
134 admin) img='edit'; label="$(_ 'Administration')" ;;
135 *Install*nf*) img='tazpkg-installed'; label="$(_ 'Install (Non Free)')" ;;
136 *Install*) img='tazpkg-installed'; label="$(_ 'Install')" ;;
137 *Remove*) img='stop'; label="$(_ 'Remove')" ;;
138 *Link*) img='tazpkg'; label="$(_ 'Link')" ;;
139 *Block*) img='tazpkg'; label="$(_ 'Block')" ;;
140 *Unblock*) img='tazpkg'; label="$(_ 'Unblock')" ;;
141 *Repack*) img='tazpkg'; label="$(_ 'Repack')" ;;
142 *saveconf*) img='tazpkg'; label="$(_ 'Save configuration')" ;;
143 *listconf*) img='edit'; label="$(_ 'List configuration files')" ;;
144 *quickcheck*) img='recharge'; label="$(_ 'Quick check')" ;;
145 *fullcheck*) img='recharge'; label="$(_ 'Full check')" ;;
146 *clean*) img='stop'; label="$(_ 'Clean')" ;;
147 *setlink*) img='harddisk'; label="$(_ 'Set link')" ;;
148 *removelink*) img='stop'; label="$(_ 'Remove link')" ;;
149 esac
150 cat << EOT
151 <button class="button" type="submit" name="${1%%=*}" value="${1#*=}">
152 <img src="$IMAGES/$img.png"/>$label
153 </button>
154 EOT
156 }
160 #
161 # xHTML functions
162 #
165 # ENTER will search but user may search for a button, so put one.
167 search_form() {
168 [ -z "$repo" ] && repo="$(GET repo)"
169 [ -z "$repo" ] && repo="Any"
170 cat << EOT
171 <div class="search">
172 <form method="get" action="">
173 <p>
174 <input type="text" name="search" size="20">
175 <input type="submit" value="$(gettext 'Search')">
176 <input class="radius" type="submit" name="files" value="$(_n 'Files')">
177 </p>
178 </form>
179 </div>
180 EOT
181 }
184 table_head() {
185 cat << EOT
186 <table class="zebra pkglist">
187 <thead>
188 <tr>
189 <td>$(_ 'Name')</td>
190 <td>$(_ 'Version')</td>
191 <td>$(_ 'Description')</td>
192 <td>$(_ 'Web')</td>
193 </tr>
194 </thead>
195 <tbody>
196 EOT
197 }
200 sidebar() {
201 repo=$(COOKIE repo); repo=${repo:-Public}; [ -n "$(GET repo)" ] && repo=$(GET repo)
202 my=$(COOKIE my); my=${my:-my}; [ -n "$(GET my)" ] && my=$(GET my)
203 cat=$(COOKIE cat); cat=${cat:-all}; [ -n "$(GET cat)" ] && cat=$(GET cat)
205 cat << EOT
206 <script type="text/javascript">
207 function setCookie(name) {
208 document.cookie = name+"="+document.getElementById(name).value; }
209 function setValue(name, value) {
210 document.getElementById(name).value=value;
211 setCookie(name); }
212 </script>
213 <form method="post" action="?list">
215 <div id="sidebar">
216 <select id="my" value="$my" onchange="setCookie('my'); this.form.submit()">
217 <option value="my">$(_ 'My packages')</option>
218 <option value="no">$(_ 'All packages')</option>
219 </select>
221 <h4>$(_ 'Categories')</h4>
223 <div class="select_wrap">
224 <select id="cat" size="16" onclick="setCookie('cat'); this.form.submit()">
225 <option value="base-system" >$(_ 'base-system')</option>
226 <option value="x-window" >$(_ 'x-window')</option>
227 <option value="utilities" >$(_ 'utilities')</option>
228 <option value="network" >$(_ 'network')</option>
229 <option value="games" >$(_ 'games')</option>
230 <option value="graphics" >$(_ 'graphics')</option>
231 <option value="office" >$(_ 'office')</option>
232 <option value="multimedia" >$(_ 'multimedia')</option>
233 <option value="development" >$(_ 'development')</option>
234 <option value="system-tools">$(_ 'system-tools')</option>
235 <option value="security" >$(_ 'security')</option>
236 <option value="misc" >$(_ 'misc')</option>
237 <option value="meta" >$(_ 'meta')</option>
238 <option value="non-free" >$(_ 'non-free')</option>
239 <option value="all" >$(_ 'all')</option>
240 <option value="extra" >$(_ 'extra')</option>
241 </select>
242 <script type="text/javascript">
243 setValue('my', "$my")
244 setValue('cat', "$cat")
245 </script>
246 </div>
247 EOT
249 if [ -d $PKGS_DB/undigest ]; then
250 cat << EOT
251 <h4>$(_ 'Repository')</h4>
253 <select id="repo" onchange="setCookie('repo')">
254 <option value="Public">$(_ 'Public')</option>
255 $(for i in $(ls $PKGS_DB/undigest); do
256 echo "<option value=\"$i\">$i</option>"
257 done)
258 <option value="Any">$(_ 'Any')</option>
259 </select>
260 <script type="text/javascript">setValue('repo', "$repo")</script>
261 EOT
262 fi
263 cat << EOT
264 <a href="?tags">$(_ 'All tags...')</a>
265 <a href="?cats">$(_ 'All categories...')</a>
266 </div>
267 </form>
268 EOT
269 }
272 repo_list() {
273 if [ -n "$(ls $PKGS_DB/undigest/ 2> /dev/null)" ]; then
274 case "$repo" in
275 Public)
276 ;;
277 ""|Any)
278 for i in $PKGS_DB/undigest/* ; do
279 [ -d "$i" ] && echo "$i$1"
280 done ;;
281 *)
282 echo "$PKGS_DB/undigest/$repo$1"
283 return ;;
284 esac
285 fi
286 echo "$PKGS_DB$1"
287 }
290 repo_name() {
291 case "$1" in
292 $PKGS_DB)
293 echo "Public" ;;
294 $PKGS_DB/undigest/*)
295 echo ${1#$PKGS_DB/undigest/} ;;
296 esac
297 }
300 header_repo_name() {
301 [ -d $PKGS_DB/undigest ] && [ "$repo" != "Public" ] && \
302 echo "<h3>$(_ 'Repository: %s' $(repo_name $1))</h3>"
303 }
306 # Print links to the pages
308 pager() {
309 awk -F'"' -vpage="$page" -vnum_lines="$(wc -l < $1)" -vtext="$(_ 'Pages:') " -vurl="?list&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 r = NR % 100
317 if (r == 1) {
318 p = int(NR / 100) + 1
319 printf "<a class=\"pages%s\" href=\"%s%s\" title=\"%s\n···\n", p==page?" current":"", url, p, $6
320 } else if (r == 0)
321 printf "%s\">%s</a> ", $6, int(NR / 100)
322 }
323 END{
324 if (num_pages == 1) exit
325 if (r != 0) printf "%s\">%s</a>", $6, int(NR / 100) + 1
326 print "</p>"
327 }' $1
328 }
331 # Show packages list by category or tag
333 show_list() {
334 cached=$(mktemp)
335 [ -n "$tag" ] && cat=''
336 {
337 for L in $LANG ${LANG%%_*}; do
338 if [ -e "$PKGS_DB/packages-desc.$L" ]; then
339 sed '/^#/d' $PKGS_DB/packages-desc.$L; break
340 fi
341 done
342 [ -e "$i/blocked-packages.list" ] && cat $i/blocked-packages.list
343 sed 's|.*|&\ti|' $i/installed.info
344 [ "$cat" == 'extra' ] || [ $1 == 'my' ] || cat $i/packages.info
345 [ "$cat" == 'extra' ] && sed 's|.*|&\t-\textra\t-\thttp://mirror.slitaz.org/packages/get/&\t-\t-\t-|' $PKGS_DB/extra.list
346 } | sort -t$'\t' -k1,1 | sed '/^$/d' | awk -F$'\t' -vc="${cat:--}" -vt="${tag:--}" '
347 {
348 if (PKG && PKG != $1) {
349 if (SEL) {
350 if (DSCL) DSC = DSCL
351 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
352 }
353 VER = DSC = WEB = DSCL = INS = BLK = SEL = ""
354 }
356 PKG = $1
357 if (NF == 1) { BLK = "b"; next }
358 if (NF == 2) { DSCL = $2; next }
359 if (c == "all" || $3 == c || index(" "$6" ", " "t" ")) { SEL = 1 }
360 if (SEL) {
361 if ($9 == "i") { VER = $2; DSC = $4; WEB = $5; INS = "i"; next}
362 if (! INS) { VER = $2; DSC = $4; WEB = $5 }
363 }
364 }' > $cached
365 page=$(GET page); [ -z "$page" ] && page=1
367 pager="$(pager $cached)"
368 list="$(tail -n+$((($page-1)*100+1)) $cached | head -n100)"
369 list1=${list:1:1}
370 if [ "$pager" != "<p>$(_ 'Pages:') </p>" ] && [ -n "$list1" ]; then
371 cat << EOT
372 $(header_repo_name $i)
373 $pager
374 $(table_head)
375 $list
376 </tbody></table>
377 $pager
378 EOT
379 fi
380 rm -f $cached
381 }
384 # Show links for "info" page
386 show_info_links() {
387 if [ -n "$1" ]; then
388 echo -n "<tr><td><b>$2</b></td><td>"
389 echo $1 | tr ' ' $'\n' | awk -vt="$3" '{
390 printf "<a href=\"?%s=%s\">%s</a> ", t, gensub(/\+/, "%2B", "g", $1), $1
391 }'
392 echo "</td></tr>"
393 fi
394 }
398 #
399 # Commands
400 #
403 case " $(GET) " in
406 *\ linkable\ *)
407 #
408 # List linkable packages.
409 #
410 search_form; sidebar
411 LOADING_MSG=$(_ 'Listing linkable packages...'); loading_msg
413 cat << EOT
414 <h2>$(_ 'Linkable packages')</h2>
416 <form method="get" action="">
417 <div id="actions">
418 <div class="float-left">$(_ 'Selection:') $(show_button do=Link)</div>
419 <div class="float-right">$(show_button recharge) $(show_button up)</div>
420 </div>
421 EOT
422 table_head
423 target=$(readlink $PKGS_DB/fslink)
424 for pkg in $(ls $target/$INSTALLED); do
425 [ -s $pkg/receipt ] && continue
426 . $target/$INSTALLED/$pkg/receipt
427 i18n_desc $pkg
428 cat << EOT
429 <tr>
430 <td><input type="checkbox" name="pkg" value="$pkg" /><a class="pkg" href="?info=${pkg//+/%2B}">$pkg</a></td>
431 <td>$VERSION</td>
432 <td>$SHORT_DESC</td>
433 <td><a class="w" href="$WEB_SITE"></a></td>
434 </tr>
435 EOT
436 done
437 cat << EOT
438 </tbody>
439 </table>
440 </form>
441 EOT
442 ;;
445 *\ cats\ *)
446 #
447 # List of all categories.
448 #
449 search_form; sidebar
451 echo "<h2>$(_ 'Categories list')</h2>"
453 for pkgsinfo in $(repo_list /packages.info); do
454 header_repo_name $(dirname $pkgsinfo)
455 cat << EOT
456 <table class="zebra outbox">
457 <thead>
458 <tr>
459 <td>$(_ 'Category')</td>
460 <td>$(_ 'Repository')</td>
461 <td>$(_ 'Installed')</td>
462 </tr>
463 </thead>
464 <tbody>
465 EOT
466 {
467 awk -F$'\t' '{print $3}' $pkgsinfo | sort | uniq -c
468 awk -F$'\t' '{print $3}' $PKGS_DB/installed.info | sed 's|.*|& i|' | sort | uniq -c
469 } | sort -k2,2 | awk '
470 {
471 c [$2] = "."
472 if ($3) { i[$2] = $1; } else { m[$2] = $1; }
473 }
474 END {
475 for (n in c) print n, m[n], i[n]
476 }' | sort | awk '{
477 printf "<tr><td><a href=\"?list&amp;cat=%s\">%s</a></td><td>%d</td><td>%d</td></tr>", $1, $1, $2, $3
478 }'
479 echo '</tbody></table>'
480 done
481 ;;
484 *\ list\ *)
485 #
486 # List all packages by category.
487 #
488 search_form; sidebar
489 LOADING_MSG="$(_ 'Listing packages...')"; loading_msg
491 bcat="<b>$cat</b>"; brepo="<b>$repo</b>"
492 case $repo in
493 Any)
494 case $my in
495 my) title="$(_ 'Installed packages of category "%s"' "$bcat")" ;;
496 *) title="$(_ 'All packages of category "%s"' "$bcat")" ;;
497 esac ;;
498 *)
499 case $my in
500 my) title="$(_ 'Installed packages of category "%s" in repository "%s"' "$bcat" "$brepo")" ;;
501 *) title="$(_ 'All packages of category "%s" in repository "%s"' "$bcat" "$brepo")" ;;
502 esac ;;
503 esac
505 cat << EOT
506 <h2>$(_ 'Packages list')</h2>
507 <p>$title</p>
509 <form method="get" action="">
510 <div id="actions">
511 <div class="float-left">$(_ 'Selection:')
512 $([ "$my" != 'my' ] && show_button do=Install)
513 $(show_button do=Remove)
514 </div>
515 <div class="float-right">$(show_button recharge; show_button up)</div>
516 </div>
517 EOT
518 for i in $(repo_list ""); do
519 show_list ${my#no}
520 done
521 echo '</form>'
522 ;;
525 *\ search\ *)
526 #
527 # Search for packages. Here default is to search in packages.desc
528 # and so get result including packages names and descriptions
529 #
530 pkg=$(GET search); [ -z "$pkg" ] && xhtml_footer && exit
531 cd $PKGS_DB
533 search_form; sidebar
534 LOADING_MSG="$(_ 'Searching packages...')"; loading_msg
536 cat << EOT
537 <h2>$(_ 'Search packages')</h2>
539 <form method="get" action="">
540 <div id="actions">
541 <div class="float-left">$(_ 'Selection:'; show_button do=Install; show_button do=Remove)
542 <a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a></div>
543 <div class="float-right">$(show_button recharge; show_button up)</div>
544 </div>
545 EOT
546 if [ -n "$(GET files)" ]; then
547 cat <<EOT
548 <table class="zebra outbox filelist">
549 <thead>
550 <tr>
551 <td>$(_ 'Package')</td>
552 <td>$(_ 'File')</td>
553 </tr>
554 <thead>
555 <tbody>
556 EOT
557 lzcat $(repo_list /files.list.lzma) | grep -Ei ": .*$(GET search)" | \
558 while read PACKAGE FILE; do
559 PACKAGE=${PACKAGE%:}
560 class=pkg; [ -d $INSTALLED/$PACKAGE ] && class=pkgi
561 cat << EOT
562 <tr>
563 <td><input type="checkbox" name="pkg" value="$PACKAGE">$(pkg_info_link $PACKAGE $class)</td>
564 <td>$(echo "$FILE" | sed "s|$pkg|<span class=\"diff-add\">$pkg</span>|g")</td>
565 </tr>
566 EOT
567 done
568 else
569 table_head
570 awk -F$'\t' 'BEGIN{IGNORECASE = 1}
571 $1 $4 ~ /'$pkg'/{print $0}' $(repo_list /packages.info) | parse_packages_info
572 fi
573 cat << EOT
574 </tbody>
575 </table>
576 </form>
577 EOT
578 ;;
581 *\ recharge\ *)
582 #
583 # Lets recharge the packages list
584 #
585 search_form; sidebar
586 LOADING_MSG="$(_ 'Recharging lists...')"; loading_msg
588 cat << EOT
589 <h2>$(_ 'Recharge')</h2>
591 <form method="get" action="">
592 <div id="actions">
593 <div class="float-left">
594 <p>$(_ 'Recharge checks for new or updated packages')</p>
595 </div>
596 <div class="float-right">$(show_button up)</div>
597 </div>
598 <div class="wrapper">
599 <pre>
600 EOT
601 echo $(_ 'Recharging packages list') | log
602 tazpkg recharge | filter_taztools_msgs
603 cat << EOT
604 </pre>
605 </div>
606 <p>$(_ 'Packages lists are up-to-date. You should check for upgrades now.')</p>
607 EOT
608 ;;
611 *\ up\ *)
612 #
613 # Upgrade packages
614 #
615 search_form; sidebar
616 LOADING_MSG="$(_ 'Checking for upgrades...')"; loading_msg
618 cat << EOT
619 <h2>$(_ 'Up packages')</h2>
621 <form method="get" action="">
622 <div id="actions">
623 <div class="float-left">$(_ 'Selection:'; show_button do=Install; show_button do=Remove)
624 <a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a></div>
625 <div class="float-right">$(show_button recharge)</div>
626 </div>
627 EOT
628 tazpkg up --check >/dev/null
629 table_head
630 for pkg in $(cat packages.up); do
631 grep -hs "^$pkg |" $PKGS_DB/packages.desc $PKGS_DB/undigest/*/packages.desc | \
632 parse_packages_desc
633 done
634 cat << EOT
635 </tbody>
636 </table>
637 </form>
638 EOT
639 ;;
642 *\ do\ *)
643 #
644 # Do an action on one or some packages
645 #
646 search_form; sidebar
647 LOADING_MSG="$(_ 'Please wait')"; loading_msg
649 opt=""
650 cmd=$(echo $(GET do) | tr [:upper:] [:lower:])
651 pkgs=$(echo $QUERY_STRING | awk 'BEGIN{RS="&";FS="="}{if($1=="pkg")print $2}')
652 pkgs=$(httpd -d "$pkgs")
653 bpkgs="<b>$pkgs</b>"
654 case $cmd in
655 install) MSG="$(_ 'Installing: %s' "$bpkgs")"; opt=--forced; cmd=get-install ;;
656 remove) MSG="$(_ 'Removing: %s' "$bpkgs")" ;;
657 link) MSG="$(_ 'Linking: %s' "$bpkgs")"; opt=$(readlink $PKGS_DB/fslink) ;;
658 block) MSG="$(_ 'Blocking: %s' "$bpkgs")" ;;
659 unblock) MSG="$(_ 'Unblocking: %s' "$bpkgs")" ;;
660 repack) MSG="$(_ 'Repacking: %s' "$bpkgs")" ;;
661 esac
662 cat << EOT
663 <h2>TazPkg: $(GET do)</h2>
665 <div class="box">$MSG</div>
666 EOT
667 for pkg in $pkgs; do
668 echo '<pre>'
669 echo $(_n 'y') | tazpkg $cmd $pkg $opt 2>/dev/null | filter_taztools_msgs
670 echo '</pre>'
671 done ;;
674 *\ info\ *)
675 #
676 # Packages info
677 #
678 pkg=$(GET info)
679 search_form; sidebar
680 LOADING_MSG=$(_ 'Getting package info...'); loading_msg
682 temp="${pkg#get-}"
683 if [ -d $INSTALLED/$pkg ]; then
684 . $INSTALLED/$pkg/receipt
685 files=$(wc -l < $INSTALLED/$pkg/files.list)
686 action="Remove"
687 else
688 cd $PKGS_DB
689 eval "$(awk -F$'\t' -vp=$pkg '
690 $1==p{
691 printf "PACKAGE=\"%s\"; VERSION=\"%s\"; CATEGORY=\"%s\"; ", $1, $2, $3
692 printf "SHORT_DESC=\"%s\"; WEB_SITE=\"%s\"; TAGS=\"%s\"; ", $4, $5, $6
693 printf "SIZES=\"%s\"; DEPENDS=\"%s\"", $7, $8
694 }' packages.info undigest/*/packages.info)"
695 PACKED_SIZE=${SIZES% *}
696 UNPACKED_SIZE=${SIZES#* }
698 action="Install"
699 fi
700 cat << EOT
701 <h2>$(_ 'Package %s' $PACKAGE)</h2>
703 <form method="get" action="">
704 <input type="hidden" name="pkg" value="$temp"/>
705 <div id="actions">
706 EOT
707 if [ "$temp" != "$pkg" -a "$action" == "Install" ]; then
708 show_button "do=Install&amp;nf"
709 else
710 show_button "do=$action"
711 fi
713 if [ -d $INSTALLED/$pkg ]; then
714 if grep -qs "^$pkg$" $PKGS_DB/blocked-packages.list; then
715 show_button do=Unblock
716 else
717 show_button do=Block
718 fi
719 show_button do=Repack
720 fi
721 i18n_desc $pkg
722 cat << EOT
723 </div>
724 <table class="zebra outbox">
725 <tbody>
726 <tr><td><b>$(_ 'Name')</b></td><td>$PACKAGE</td></tr>
727 <tr><td><b>$(_ 'Version')</b></td><td>$VERSION</td></tr>
728 <tr><td><b>$(_ 'Category')</b></td><td><a href="?cat=$CATEGORY">$CATEGORY</a></td></tr>
729 <tr><td><b>$(_ 'Description')</b></td><td>$SHORT_DESC</td></tr>
730 $([ -n "$MAINTAINER" ] && echo "<tr><td><b>$(_ 'Maintainer')</b></td><td>$MAINTAINER</td></tr>")
731 $([ -n "$LICENSE" ] && echo "<tr><td><b>$(_ 'License')</b></td><td><a href=\"?license=$pkg\">$LICENSE</a></td></tr>")
732 <tr><td><b>$(_ 'Website')</b></td><td><a href="$WEB_SITE">$WEB_SITE</a></td></tr>
733 $(show_info_links "$TAGS" "$(_ 'Tags')" 'tag')
734 <tr><td><b>$(_ 'Sizes')</b></td><td>$PACKED_SIZE/$UNPACKED_SIZE</td></tr>
735 $(show_info_links "$DEPENDS" "$(_ 'Depends')" 'info')
736 $(show_info_links "$SUGGESTED" "$(_ 'Suggested')" 'info')
737 </tbody>
738 </table>
739 EOT
740 DESC="$(tazpkg desc $pkg)"
741 [ -n "$DESC" ] && echo "<pre>$DESC</pre>"
743 if [ -d $INSTALLED/$pkg ]; then
744 cat << EOT
745 <p>$(_ 'Installed files: %s' $(wc -l < $INSTALLED/$pkg/files.list))</p>
747 <pre>$(sort $INSTALLED/$pkg/files.list)</pre>
748 EOT
749 else
750 cat << EOT
751 <p>$(_ 'Installed files: %s' ' ')</p>
753 <pre>
754 $(lzcat files.list.lzma undigest/*/files.list.lzma 2> /dev/null | awk -vp="$pkg:" '$1==p{print $2}' | sort)
755 </pre>
756 EOT
757 fi
758 ;;
761 *\ admin\ * )
762 #
763 # TazPkg configuration page
764 #
765 cmd=$(GET admin)
766 search_form; sidebar
768 case "$cmd" in
769 clean)
770 rm -rf $CACHE_DIR/* ;;
771 add-mirror)
772 # Decode url
773 mirror=$(GET mirror)
774 case "$mirror" in
775 http://*|ftp://*)
776 echo "$mirror" >> $(GET file) ;;
777 esac ;;
778 rm-mirror=http://*|rm-mirror=ftp://*)
779 mirror=${cmd#rm-mirror=}
780 sed -i -e "s@$mirror@@" -e '/^$/d' $(GET file) ;;
781 select-mirror*)
782 release=$(cat /etc/slitaz-release)
783 mirror="$(GET mirror)packages/$release/"
784 tazpkg setup-mirror $mirror | log
785 ;;
786 add-repo)
787 # Decode url
788 mirror=$(GET mirror)
789 repository=$PKGS_DB/undigest/$(GET repository)
790 case "$mirror" in
791 http://*|ftp://*)
792 mkdir -p $repository
793 echo "$mirror" > $repository/mirror
794 echo "$mirror" > $repository/mirrors ;;
795 esac ;;
796 rm-repo=*)
797 repository=${cmd#rm-repo=}
798 rm -rf $PKGS_DB/undigest/$repository ;;
799 setlink)
800 [ -d "$(GET link)/$INSTALLED" ] && ln -fs $(GET link) $PKGS_DB/fslink ;;
801 removelink)
802 rm -f $PKGS_DB/fslink ;;
803 esac
805 cat << EOT
806 <h2>$(_ 'Administration')</h2>
808 <form method="get" action="">
809 <input type="hidden" name="admin" />
811 <div>
812 <p>$(_ 'TazPkg administration and settings')</p>
813 </div>
814 <div id="actions">
815 $(show_button action=saveconf)
816 $(show_button action=listconf)
817 $(show_button action=quickcheck)
818 $(show_button action=fullcheck)
819 </div>
820 </form>
821 EOT
822 case "$(GET action)" in
823 saveconf)
824 LOADING_MSG=$(_ 'Creating the package...'); loading_msg
825 echo "<pre>"
826 cd $HOME
827 tazpkg repack-config | filter_taztools_msgs
828 echo -n "$(_ 'Path:') "; ls $HOME/config-*.tazpkg
829 echo "</pre>" ;;
830 listconf)
831 echo "<h4>$(_ 'Configuration files')</h4>"
832 echo "<ul>"
833 tazpkg list-config | while read file; do
834 if [ -e $file ]; then
835 echo "<li><a href=\"index.cgi?file=$file\">$file</a></li>"
836 else
837 echo "<li>$file</li>"
838 fi
839 done
840 echo "</ul>"
841 ;;
842 quickcheck)
843 LOADING_MSG=$(_ 'Checking packages consistency...'); loading_msg
844 echo "<pre>"
845 tazpkg check
846 echo "</pre>" ;;
847 fullcheck)
848 LOADING_MSG=$(_ 'Full packages check...'); loading_msg
849 echo "<pre>"
850 tazpkg check --full
851 echo "</pre>" ;;
852 esac
854 cache_files=$(find $CACHE_DIR -name *.tazpkg | wc -l)
855 cache_size=$(du -sh $CACHE_DIR | cut -f1 | sed 's|\.0||')
856 [ "$cache_files" == 0 ] && cache_size="0K"
857 cat << EOT
858 <h3>$(_ 'Packages cache')</h3>
860 <div>
861 <form method="get" action="">
862 <p>$(_ 'Packages in the cache: %s (%s)' $cache_files $cache_size)
863 $(show_button admin=clean)
864 <!--input type="hidden" name="admin" value="clean" />
865 <input type="submit" value="$(_n 'Clean')" /-->
866 </p>
867 </form>
868 </div>
870 <h3>$(_ 'Default mirror')</h3>
872 <pre>$(cat $PKGS_DB/mirror)</pre>
874 <h3>$(_ 'Current mirror list')</h3>
875 EOT
876 for i in $PKGS_DB/mirrors $PKGS_DB/undigest/*/mirrors; do
877 [ -s $i ] || continue
878 echo '<div class="box">'
879 if [ $i != $PKGS_DB/mirrors ]; then
880 Repo_Name="$(repo_name $(dirname $i))"
881 echo "<h4>$(_ 'Repository: %s' $Repo_Name)</h4>"
882 fi
883 echo "<ul>"
884 list_mirrors $i
885 echo "</ul>"
886 cat << EOT
887 </div>
888 <form method="get" action="">
889 <p>
890 <input type="hidden" name="admin" value="add-mirror" />
891 <input type="hidden" name="file" value="$i" />
892 <input type="text" name="mirror" size="60">
893 <input type="submit" value="$(_n 'Add mirror')" />
894 </p>
895 </form>
896 EOT
897 done
898 echo "<h3>$(_ 'Private repositories')</h3>"
899 [ -n "$(ls $PKGS_DB/undigest 2> /dev/null)" ] && cat << EOT
900 <div class="box">
901 <ul>
902 $(list_repos)
903 </ul>
904 </div>
905 EOT
906 cat << EOT
907 <form method="get" action="">
908 <p>
909 <input type="hidden" name="admin" value="add-repo" />
910 $(_ 'Name') <input type="text" name="repository" size="10">
911 $(_ 'mirror')
912 <input type="text" name="mirror" value="http://" size="50">
913 <input type="submit" value="$(_n 'Add repository')" />
914 </p>
915 </form>
917 <h3>$(_ 'Link to another SliTaz installation')</h3>
919 <p>$(_ "This link points to the root of another SliTaz installation. \
920 You will be able to install packages using soft links to it.")</p>
922 <form method="get" action="">
923 <p>
924 <input type="text" name="link" value="$(readlink $PKGS_DB/fslink 2> /dev/null)" size="50">
925 $(show_button admin=setlink)
926 $(show_button admin=removelink)
927 </p>
928 </form>
929 EOT
930 version=$(cat /etc/slitaz-release)
931 cat << EOT
933 <h3 id="dvd">$(_ 'SliTaz packages DVD')</h3>
935 <p>$(_ "A bootable DVD image of all available packages for the %s version is \
936 generated every day. It also contains a copy of the website and can be used \
937 without an internet connection. This image can be installed on a DVD or a USB \
938 key." $version)</p>
940 <div>
941 <form method="post" action='?admin&amp;action=dvdimage#dvd'>
942 <p>
943 <a class="button"
944 href='http://mirror.slitaz.org/iso/$version/packages-$version.iso'>
945 <img src="$IMAGES/tazpkg.png" />$(_ 'Download DVD image')</a>
946 <a class="button" href='?admin&amp;action=dvdusbkey#dvd'>
947 <img src="$IMAGES/tazpkg.png" />$(_ 'Install from DVD/USB key')</a>
948 </p>
949 <div class="box">
950 $(_ 'Install from ISO image:')
951 <input type="text" name="dvdimage" size="40" value="/root/packages-$version.iso">
952 </div>
953 </form>
954 </div>
955 EOT
956 if [ "$(GET action)" == "dvdimage" ]; then
957 dev=$(POST dvdimage)
958 mkdir -p /mnt/packages 2> /dev/null
959 echo "<pre>"
960 mount -t iso9660 -o loop,ro $dev /mnt/packages &&
961 /mnt/packages/install.sh &&
962 _ '%s is installed on /mnt/packages' $dev
963 echo "</pre>"
964 fi
965 if [ "$(GET action)" == "dvdusbkey" ]; then
966 mkdir -p /mnt/packages 2> /dev/null
967 for tag in "LABEL=\"packages-$version\" TYPE=\"iso9660\"" \
968 "LABEL=\"sources-$version\" TYPE=\"iso9660\"" ; do
969 dev=$(blkid | grep "$tag" | cut -d: -f1)
970 [ -n "$dev" ] || continue
971 echo "<pre>"
972 mount -t iso9660 -o ro $dev /mnt/packages &&
973 /mnt/packages/install.sh &&
974 _ '%s is installed on /mnt/packages' $dev
975 echo "</pre>"
976 break
977 done
978 fi
979 ;;
982 *\ license\ *)
983 #
984 # Show licenses for installed packages
985 #
986 search_form; sidebar
988 pkg=$(GET license)
989 case $pkg in
990 /*)
991 [ -e $pkg ] && {
992 echo "<h2>${pkg#/usr/share/licenses/}</h2>"
993 case $pkg in
994 *.htm*)
995 cat $pkg ;;
996 *)
997 echo "<pre style=\"white-space: pre-wrap\">"
998 cat $pkg | htmlize | sed 's|\([hf]t*t*ps*://[a-zA-Z0-9./_-]*[a-zA-Z0-9/_-]\)|<a href="\1">\1</a>|'
999 echo "</pre>"
1000 ;;
1001 esac
1002 } ;;
1003 *)
1004 echo "<h2>$(_ 'Licenses for package %s' $pkg)</h2>"
1005 ONLINE=''; OFFLINE=''
1007 if [ -e "$PKGS_DB/installed/$pkg" ]; then
1008 for license in $(. $PKGS_DB/installed/$pkg/receipt; echo "$LICENSE"); do
1009 OSL=''; GNU=''; USR=''; LIC=''
1010 case $license in
1011 Apache) OSL='Apache-2.0'; URL='http://www.apache.org/licenses/' ;;
1012 Artistic) OSL='Artistic-2.0' ;;
1013 BSD) OSL='BSD-2-Clause' ;;
1014 BSD3) OSL='BSD-3-Clause' ;;
1016 CC-BY-SA*|CC-SA*) CCO='by-sa/4.0/' ;;
1017 CC-BY-ND*) CCO='by-nd/4.0/' ;;
1018 CC-BY-NC-SA*) CCO='by-nc-sa/4.0/' ;;
1019 CC-BY-NC-ND*) CCO='by-nc-nd/4.0/' ;;
1020 CC-BY-NC*) CCO='by-nc/4.0/' ;;
1021 CC-BY*) CCO='by/4.0/' ;;
1023 cc-pd) URL='http://creativecommons.org/publicdomain/' ;;
1024 CCPL) ;;
1025 CDDL*) OSL='CDDL-1.0' ;;
1026 CECILL*) OSL='CECILL-2.1' ;;
1027 Eclipse|EPL*) OSL='EPL-1.0' ;;
1028 FDL) GNU='fdl' ;;
1029 GPL) GNU='gpl'; OSL='gpl-license'; LIC='gpl.txt' ;;
1030 GPL2) GNU='old-licenses/gpl-2.0'; OSL='GPL-2.0' ;;
1031 GPL3) GNU='gpl'; OSL='GPL-3.0'; LIC='gpl.txt' ;;
1032 ISC) OSL='ISC' ;;
1033 LGPL) GNU='lgpl'; OSL='lgpl-license' ;;
1034 LGPL2) GNU='old-licenses/lgpl-2.0' ;;
1035 LGPL2.1) GNU='old-licenses/lgpl-2.1'; OSL='LGPL-2.1'; LIC='lgpl.txt' ;;
1036 LGPL3) GNU='lgpl'; OSL='LGPL-3.0' ;;
1037 LPPL*) OSL='LPPL-1.3c' ;;
1038 MIT) OSL='MIT'; LIC='mit.txt' ;;
1039 MPL) OSL='MPL-2.0'; LIC='mozilla.txt' ;;
1040 MPL2) OSL='MPL-2.0' ;;
1041 FL) OSL='Fair' ;; # ?
1042 PSL) ;;
1043 PublicDomain) ;;
1044 QPL*) OSL='QPL-1.0' ;;
1045 SIL_OFL*) OSL='OFL-1.1' ;;
1046 zlib/libpng) OSL='Zlib' ;;
1047 esac
1049 [ -n "$OSL" ] && ONLINE="$ONLINE <li><a href=\"http://opensource.org/licenses/$OSL\">$(_ '%s license on %s website' "<b>$OSL</b>" "OSL")</a></li>\n"
1050 [ -n "$GNU" ] && ONLINE="$ONLINE <li><a href=\"https://www.gnu.org/licenses/$GNU.html\">$(_ '%s license on %s website' "<b>${GNU#*/}</b>" "GNU")</a></li>\n"
1051 [ -n "$CCO" ] && ONLINE="$ONLINE <li><a href=\"http://creativecommons.org/licenses/$CCO\">$(_ '%s license on %s website' "<b>${CCO%%/*}</b>" "Creative Commons")</a></li>\n"
1052 [ -n "$URL" ] && ONLINE="$ONLINE <li><a href=\"$URL\">$URL</a></li>\n"
1053 [ -n "$LIC" ] && OFFLINE="$OFFLINE <li><a href=\"?license=/usr/share/licenses/$LIC\">licenses/<b>$LIC</b></a></li>\n"
1054 done
1056 for lic in $(grep /usr/share/licenses/ $PKGS_DB/installed/$pkg/files.list); do
1057 OFFLINE="$OFFLINE <li><a href=\"?license=$lic\">licenses/<b>${lic#/usr/share/licenses/}</b></a></li>\n"
1058 done
1059 fi
1060 [ -n "$ONLINE" ] && echo -e "<p>$(_ 'Read online:')</p>\n<ul>\n$ONLINE</ul>\n"
1061 [ -n "$OFFLINE" ] && echo -e "<p>$(_ 'Read local:')</p>\n<ul>\n$OFFLINE</ul>\n"
1062 ;;
1063 esac
1064 ;;
1067 *\ tags\ *)
1069 # Show tag cloud
1071 search_form; sidebar
1073 echo "<h2>$(_ 'Tags list')</h2>"
1074 brepo="<b>$repo</b>"
1075 case $repo in
1076 Any) title="$(_ 'List of tags in all repositories')" ;;
1077 *) title="$(_ 'List of tags in repository "%s"' "$brepo")" ;;
1078 esac
1079 echo "<p>$title</p><p>"
1080 to_read=""
1081 for i in $(repo_list ""); do
1082 if [ ! -e $i/packages.info ] && [ $repo == 'Public' ]; then
1083 list=installed; else list=packages; fi
1084 to_read="$to_read $i/$list.info"
1085 done
1086 TAGS="$(awk -F$'\t' '{if($6){print $6}}' $to_read | tr ' ' $'\n' | sort | uniq -c)"
1087 MAX="$(echo "$TAGS" | awk '{if ($1 > MAX) MAX = $1} END{print MAX}')"
1088 echo "$TAGS" | awk -vMAX="$MAX" '{
1089 printf "<a class=\"tag%s\" href=\"?tag=%s\" title=\"%s\">%s</a> ", int($1 * 7 / MAX + 1), $2, $1, $2
1090 }'
1091 echo "</p>"
1092 ;;
1095 *\ tag\ *)
1097 # Show packages with matching tag
1099 search_form; sidebar
1101 tag=$(GET tag)
1102 cat << EOT
1103 <h2>$(_ 'Tag "%s"' $tag)</h2>
1105 <form method="get" action="">
1106 <div id="actions">
1107 <div class="float-left">
1108 $(_ 'Selection:')
1109 <input type="submit" name="do" value="Install" />
1110 <input type="submit" name="do" value="Remove" />
1111 </div>
1112 </div>
1113 EOT
1114 for i in $(repo_list ""); do
1115 show_list all
1116 done
1117 echo '</form>'
1118 ;;
1121 *\ blocked\ *)
1123 # Show blocked packages list
1125 search_form; sidebar
1127 cat << EOT
1128 <h2>$(_ 'Blocked packages list')</h2>
1130 <form method="get" action="">
1131 <div id="actions">
1132 <div class="float-left">$(_ 'Selection:'; show_button do=Unblock)
1133 </div>
1134 </div>
1135 EOT
1136 table_head
1137 for i in $(cat $PKGS_DB/blocked-packages.list); do
1138 awk -F$'\t' -vp="$i" '{
1139 if ($1 == p)
1140 printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\"><a class=\"pkgib\" href=\"?info=%s\">%s</a></td><td>%s</td><td>%s</td><td><a href=\"%s\"></a></td></tr>\n", $1, gensub(/\+/, "%2B", "g", $1), $1, $2, $4, $5
1141 }' $PKGS_DB/installed.info
1142 done
1143 echo '</tbody></table></form>'
1144 ;;
1147 *)
1149 # Default to summary
1151 search_form; sidebar
1153 [ -n "$(GET block)" ] && tazpkg block $(GET block)
1154 [ -n "$(GET unblock)" ] && tazpkg unblock $(GET unblock)
1155 cat << EOT
1156 <h2>$(_ 'Summary')</h2>
1158 <form method="get" action="">
1159 <div id="actions">
1160 EOT
1161 fslink=$(readlink $PKGS_DB/fslink)
1162 [ -n "$fslink" -a -d "$fslink/$INSTALLED" ] && show_button linkable
1163 show_button recharge
1164 show_button up
1165 show_button admin
1166 cat << EOT
1167 </div>
1169 <table class="zebra summary">
1170 <tbody>
1171 <tr>
1172 <td>$(_ 'Last recharge:')</td>
1173 <td>$(list=$PKGS_DB/packages.info
1174 if [ -e $list ]; then
1175 $((days=$(date +%s)/86400-$(date -r $list +%s)/86400))
1176 time=$(date -r $list +%R)
1177 ago="$(_p '%d day ago.' '%d days ago.' $days $days)"
1178 case $days in
1179 0) _ 'Today at %s.' $time;;
1180 1) _ 'Yesterday at %s.' $time;;
1181 [2-9]) echo $ago;;
1182 *) echo "<span style='color:red'>$ago</span>"
1183 _ 'It is recommended to [recharge] the lists.' | \
1184 sed 's|\[|<a href="?recharge">|;s|\]|</a>|';;
1185 esac
1186 else
1187 _ 'never.'
1188 _ 'You need to [download] the lists for further work.' | \
1189 sed 's|\[|<a href="?recharge">|;s|\]|</a>|'
1190 fi)</td></tr>
1191 <tr>
1192 <td>$(_ 'Installed packages:')</td>
1193 <td><b>$(cat $PKGS_DB/installed.info | wc -l)</a></b>
1194 <a href="?list&amp;my=my&amp;cat=all&amp;repo=Any">$(_ '(show)')</a></td></tr>
1195 <tr>
1196 <td>$(_ 'Mirrored packages:')</td>
1197 <td><b>$(cat $PKGS_DB/packages.list | wc -l)</b></td></tr>
1198 <tr>
1199 <td>$(_ 'Upgradeable packages:')</td>
1200 <td><b>$(cat $PKGS_DB/packages.up | wc -l)</b>
1201 <a href="?up">$(_ '(show)')</a></td></tr>
1202 <tr>
1203 <td>$(_ 'Installed files:')</td>
1204 <td><b>$(cat $INSTALLED/*/files.list | wc -l)</b></td></tr>
1205 <tr>
1206 <td>$(_ 'Blocked packages:')</td>
1207 <td><b>$(cat $PKGS_DB/blocked-packages.list | wc -l)</b>
1208 <a href="?blocked">$(_ '(show)')</a></td></tr>
1209 </tbody>
1210 </table>
1212 <h3>$(_ 'Latest log entries')</h3>
1214 <pre>
1215 $(tail -n 5 $LOG | fgrep "-" | awk '{print $1, $2, $3, $4, $5, $6, $7}')
1216 <a href="index.cgi?file=$LOG">$(_ 'more...')</a>
1217 </pre>
1218 EOT
1219 ;;
1220 esac
1222 # xHTML 5 footer
1223 export TEXTDOMAIN='tazpkg'
1224 xhtml_footer
1225 exit 0