tazpkg annotate tazpanel/pkgs.cgi @ rev 771

pkgs.cgi: update urls
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Apr 08 09:45:53 2015 +0200 (2015-04-08)
parents a28aa28eb527
children 489b68a58303
rev   line source
pascal@627 1 #!/bin/sh
pascal@627 2 #
al@633 3 # TazPkg CGI interface - Manage packages via a browser
pascal@627 4 #
pascal@627 5 # This CGI interface extensively uses tazpkg to manage packages and have
pascal@627 6 # its own code for some tasks. Please KISS, it is important and keep speed
pascal@627 7 # in mind. Thanks, Pankso.
pascal@627 8 #
al@755 9 # (C) 2011-2015 SliTaz GNU/Linux - BSD License
pascal@627 10 #
pascal@627 11
al@707 12 . /lib/libtaz.sh
pascal@627 13 . lib/libtazpanel
al@725 14
al@725 15 . /etc/slitaz/slitaz.conf
al@725 16 . /etc/slitaz/tazpkg.conf
al@725 17
pascal@627 18 get_config
pascal@627 19
al@741 20 _() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; echo; }
al@741 21 _n() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; }
al@741 22 _p() {
al@763 23 local S="$1" P="$2" N="$3"; shift 3;
al@741 24 printf "$(ngettext "$S" "$P" "$N")" "$@"; }
al@741 25
pascal@764 26 #------
pascal@764 27 # menu
pascal@764 28 #------
pascal@764 29 case "$1" in
pascal@764 30 menu)
pascal@764 31 TEXTDOMAIN_original=$TEXTDOMAIN
pascal@764 32 export TEXTDOMAIN='tazpkg'
pascal@764 33
pascal@764 34 cat <<EOT
pascal@764 35 <li tabindex="0">
pascal@764 36 <span>$(gettext 'Packages')</span>
pascal@764 37 <menu>
pascal@771 38 <li><a data-icon="info" href="pkgs.cgi">$(gettext 'Summary')</a></li>
pascal@771 39 <li><a data-icon="list" href="pkgs.cgi?list&amp;my=my&amp;cat=all&amp;repo=Any">$(gettext 'My packages')</a></li>
pascal@771 40 <li><a data-icon="refresh" href="pkgs.cgi?recharge" data-root>$(gettext 'Recharge list')</a></li>
pascal@771 41 <li><a data-icon="upgrade" href="pkgs.cgi?up" data-root>$(gettext 'Check updates')</a></li>
pascal@771 42 <li><a data-icon="admin" href="pkgs.cgi?admin" data-root>$(gettext 'Administration')</a></li>
pascal@764 43 </menu>
pascal@764 44 </li>
pascal@764 45 EOT
pascal@764 46 export TEXTDOMAIN=$TEXTDOMAIN_original
pascal@764 47 exit
pascal@764 48 esac
pascal@764 49
pascal@764 50 header
al@707 51
pascal@627 52 # xHTML 5 header with special side bar for categories.
al@707 53 TITLE=$(TEXTDOMAIN='tazpkg'; _ 'TazPanel - Packages')
pascal@627 54 xhtml_header | sed 's/id="content"/id="content-sidebar"/'
pascal@627 55
al@633 56 export TEXTDOMAIN='tazpkg'
al@707 57
al@761 58 pkg_info_link() {
al@758 59 echo "<a data-icon=\"$2\" href=\"?info=${1//+/%2B}\">$1</a>" | sed 's| data-icon=""||'
pascal@627 60 }
pascal@627 61
al@707 62
al@718 63 # Display localized short description
al@718 64
pascal@627 65 i18n_desc() {
al@717 66 for L in $LANG ${LANG%%_*}; do
al@717 67 if [ -e "$PKGS_DB/packages-desc.$L" ]; then
al@718 68 LOCDESC=$(awk -F$'\t' -vp=$1 '{if ($1 == p) print $2}' $PKGS_DB/packages-desc.$L)
al@717 69 if [ -n "$LOCDESC" ]; then
al@717 70 SHORT_DESC="$LOCDESC"
al@717 71 break
al@717 72 fi
al@717 73 fi
al@717 74 done
pascal@627 75 }
pascal@627 76
al@707 77
pascal@627 78 # We need packages information for list and search
al@707 79
pascal@627 80 parse_packages_desc() {
pascal@627 81 IFS="|"
al@762 82 cut -f 1,2,3 -d "|" | while read PACKAGE VERSION SHORT_DESC
pascal@627 83 do
al@718 84 class=pkg; [ -d $INSTALLED/${PACKAGE% } ] && class=pkgi
al@718 85 i18n_desc $PACKAGE
pascal@627 86 cat << EOT
pascal@627 87 <tr>
al@755 88 <td><input type="checkbox" name="pkg" value="$PACKAGE">$(pkg_info_link $PACKAGE $class)</td>
al@755 89 <td>$VERSION</td>
al@755 90 <td>$SHORT_DESC</td>
al@718 91 </tr>
al@718 92 EOT
al@718 93 done
al@718 94 unset IFS
al@718 95 }
al@718 96
al@718 97
al@718 98 parse_packages_info() {
al@718 99 IFS=$'\t'
al@718 100 while read PACKAGE VERSION CATEGORY SHORT_DESC WEB_SITE TAGS SIZES DEPENDS; do
al@763 101 class='pkg'
al@763 102 if grep -q "^$PACKAGE"$'\t' $PKGS_DB/installed.info; then
al@763 103 class='pkgi'
al@763 104 grep -q "^$PACKAGE$" $PKGS_DB/blocked-packages.list && class='pkgib'
al@763 105 fi
al@718 106 i18n_desc $PACKAGE
al@718 107 cat << EOT
al@718 108 <tr>
al@755 109 <td><input type="checkbox" name="pkg" value="$PACKAGE">$(pkg_info_link $PACKAGE $class)</td>
al@755 110 <td>$VERSION</td>
al@755 111 <td>$SHORT_DESC</td>
pascal@627 112 </tr>
pascal@627 113 EOT
pascal@627 114 done
pascal@627 115 unset IFS
pascal@627 116 }
pascal@627 117
al@707 118
al@724 119 # Show button
al@724 120 show_button() {
al@747 121 for button in $@; do
al@768 122 class=''; misc=''
al@747 123 case $button in
al@768 124 recharge) class='refresh'; label="$(_ 'Recharge list')"; misc=' data-root' ;;
al@768 125 up) class='upgrade'; label="$(_ 'Check upgrades')"; misc=' data-root' ;;
al@755 126 list) class='list'; label="$(_ 'My packages')" ;;
al@755 127 tags) class='tags'; label="$(_ 'Tags')" ;;
al@755 128 linkable) class='link'; label="$(_ 'Linkable packages')" ;;
al@768 129 admin) class='admin'; label="$(_ 'Administration')"; misc=' data-root' ;;
al@755 130 *Install*nf*) class='install'; label="$(_ 'Install (Non Free)')" ;;
al@755 131 *Install*) class='install'; label="$(_ 'Install')" ;;
al@755 132 *Remove*) class='remove'; label="$(_ 'Remove')" ;;
al@755 133 *Link*) class='link'; label="$(_ 'Link')" ;;
al@755 134 *Block*) class='lock'; label="$(_ 'Block')" ;;
al@755 135 *Unblock*) class='unlock'; label="$(_ 'Unblock')" ;;
al@762 136 *Chblock*) class='chlock'; label="$(_ '(Un)block')" ;;
al@755 137 *Repack*) class='repack'; label="$(_ 'Repack')" ;;
al@755 138 *saveconf*) class='save'; label="$(_ 'Save configuration')" ;;
al@755 139 *listconf*) class='list'; label="$(_ 'List configuration files')" ;;
al@755 140 *quickcheck*) class='check'; label="$(_ 'Quick check')" ;;
al@755 141 *fullcheck*) class='check'; label="$(_ 'Full check')" ;;
al@755 142 *clean*) class='remove'; label="$(_ 'Clean')" ;;
al@755 143 *setlink*) class='link'; label="$(_ 'Set link')" ;;
al@755 144 *removelink*) class='unlink'; label="$(_ 'Remove link')" ;;
al@755 145 *add-mirror) class='add'; label="$(_n 'Add mirror')" ;;
al@755 146 *add-repo) class='add'; label="$(_n 'Add repository')" ;;
al@762 147 toggle) class='toggle'; label="$(_n 'Toggle all')" ;;
al@747 148 esac
al@762 149 if [ "$button" == 'toggle' ]; then
al@762 150 echo -n "<span class=\"float-right\"><button data-icon=\"$class\" onclick=\"checkBoxes()\">$label</button></span>"
al@762 151 else
al@768 152 echo -n "<button data-icon=\"$class\" name=\"${button%%=*}\" value=\"${button#*=}\"$misc>$label</button>"
al@755 153 fi
al@747 154 done
al@724 155 }
al@724 156
al@724 157
al@707 158
pascal@627 159 #
pascal@627 160 # xHTML functions
pascal@627 161 #
pascal@627 162
al@707 163
pascal@627 164 # ENTER will search but user may search for a button, so put one.
al@707 165
pascal@627 166 search_form() {
pascal@627 167 cat << EOT
al@755 168 <form class="search"><!--
al@755 169 --><input type="search" name="search" results="5" autosave="pkgsearch" autocomplete="on"><!--
al@755 170 --><button type="submit">$(_n 'Search')</button><!--
al@759 171 --><button name="files" value="yes">$(_n 'Files')</button><!--
al@755 172 --></form>
pascal@627 173 EOT
pascal@627 174 }
pascal@627 175
al@707 176
pascal@627 177 table_head() {
pascal@627 178 cat << EOT
al@755 179 <table class="wide zebra pkglist" id="head1">
al@755 180 <thead id="head2">
pascal@627 181 <tr>
al@707 182 <td>$(_ 'Name')</td>
al@707 183 <td>$(_ 'Version')</td>
al@707 184 <td>$(_ 'Description')</td>
pascal@627 185 </tr>
al@736 186 </thead>
al@736 187 <tbody>
pascal@627 188 EOT
pascal@627 189 }
pascal@627 190
al@707 191
pascal@627 192 sidebar() {
al@744 193 repo=$(COOKIE repo); repo=${repo:-Public}; [ -n "$(GET repo)" ] && repo=$(GET repo)
al@744 194 my=$(COOKIE my); my=${my:-my}; [ -n "$(GET my)" ] && my=$(GET my)
al@744 195 cat=$(COOKIE cat); cat=${cat:-all}; [ -n "$(GET cat)" ] && cat=$(GET cat)
al@737 196
pascal@627 197 cat << EOT
al@744 198 <script type="text/javascript">
al@744 199 function setCookie(name) {
al@763 200 if (name=='cat') {
al@763 201 var cats = document.getElementsByName('cat');
al@763 202 for (var i = 0; i < cats.length; i++) {
al@763 203 if (cats[i].checked) {
al@763 204 document.cookie = name + "=" + cats[i].value;
al@763 205 break;
al@763 206 }
al@763 207 }
al@763 208 } else {
al@763 209 document.cookie = name+"="+document.getElementById(name).value;
al@763 210 }
al@763 211 }
al@744 212 function setValue(name, value) {
al@744 213 document.getElementById(name).value=value;
al@763 214 setCookie(name);
al@763 215 }
al@744 216 </script>
al@744 217 <form method="post" action="?list">
al@737 218
pascal@627 219 <div id="sidebar">
al@744 220 <select id="my" value="$my" onchange="setCookie('my'); this.form.submit()">
al@738 221 <option value="my">$(_ 'My packages')</option>
al@741 222 <option value="no">$(_ 'All packages')</option>
al@737 223 </select>
al@763 224 <script type="text/javascript">setValue('my', "$my")</script>
al@737 225
al@737 226 <h4>$(_ 'Categories')</h4>
al@737 227
al@763 228 <div class="wide zebra">
al@763 229 $(echo 'base-system x-window utilities network games graphics office
al@763 230 multimedia development system-tools security misc meta non-free all
al@763 231 extra' | tr ' ' '\n' | awk -vcat="$cat" -vn="1" '{
al@763 232 system("gettext " $1 | getline tr)
al@763 233 printf "<input type=\"radio\" name=\"cat\" id=\"c%s\" ", n
al@763 234 printf "value=\"%s\"%s ", $1, $1==cat?" checked":""
al@763 235 printf "onclick=\"setCookie(&#39;cat&#39;); this.form.submit()\">"
al@763 236 printf "<label for=\"c%s\">%s</label>\n", n, tr
al@763 237 n++
al@763 238 }')
al@738 239 </div>
pascal@627 240 EOT
pascal@627 241
al@700 242 if [ -d $PKGS_DB/undigest ]; then
pascal@627 243 cat << EOT
al@737 244 <h4>$(_ 'Repository')</h4>
al@707 245
al@744 246 <select id="repo" onchange="setCookie('repo')">
al@738 247 <option value="Public">$(_ 'Public')</option>
al@737 248 $(for i in $(ls $PKGS_DB/undigest); do
al@738 249 echo "<option value=\"$i\">$i</option>"
al@737 250 done)
al@738 251 <option value="Any">$(_ 'Any')</option>
al@737 252 </select>
al@744 253 <script type="text/javascript">setValue('repo', "$repo")</script>
al@741 254 EOT
al@741 255 fi
al@741 256 cat << EOT
al@755 257 <a data-icon="tags" href="?tags">$(_ 'All tags...')</a><br/>
al@755 258 <a data-icon="list" href="?cats">$(_ 'All categories...')</a>
al@741 259 </div>
al@742 260 </form>
pascal@627 261 EOT
pascal@627 262 }
pascal@627 263
al@707 264
pascal@627 265 repo_list() {
al@700 266 if [ -n "$(ls $PKGS_DB/undigest/ 2> /dev/null)" ]; then
pascal@627 267 case "$repo" in
al@707 268 Public)
al@707 269 ;;
al@707 270 ""|Any)
al@707 271 for i in $PKGS_DB/undigest/* ; do
al@707 272 [ -d "$i" ] && echo "$i$1"
al@707 273 done ;;
al@707 274 *)
al@707 275 echo "$PKGS_DB/undigest/$repo$1"
al@707 276 return ;;
pascal@627 277 esac
pascal@627 278 fi
al@700 279 echo "$PKGS_DB$1"
pascal@627 280 }
pascal@627 281
al@707 282
pascal@627 283 repo_name() {
pascal@627 284 case "$1" in
al@707 285 $PKGS_DB)
al@707 286 echo "Public" ;;
al@707 287 $PKGS_DB/undigest/*)
al@707 288 echo ${1#$PKGS_DB/undigest/} ;;
pascal@627 289 esac
pascal@627 290 }
pascal@627 291
al@726 292
al@744 293 header_repo_name() {
al@744 294 [ -d $PKGS_DB/undigest ] && [ "$repo" != "Public" ] && \
al@755 295 _ 'Repository: %s' $(repo_name $1)
al@744 296 }
al@744 297
al@744 298
al@726 299 # Print links to the pages
al@726 300
al@726 301 pager() {
al@747 302 PAGE_SIZE=${PAGE_SIZE:-100}
al@747 303 [ "$PAGE_SIZE" != "0" ] && \
al@747 304 awk -F'"' -vpage="$page" -vsize="$PAGE_SIZE" -vnum_lines="$(wc -l < $1)" -vtext="$(_ 'Pages:') " -vurl="?list&amp;page=" '
al@726 305 BEGIN{
al@747 306 num_pages = int(num_lines / size) + (num_lines % size != 0)
al@726 307 if (num_pages != 1) printf "<p>%s", text
al@726 308 }
al@726 309 {
al@726 310 if (num_pages == 1) exit
al@747 311 r = NR % size
al@728 312 if (r == 1) {
al@747 313 p = int(NR / size) + 1
al@761 314 printf "<button class=\"pages%s\" name=\"page\" value=\"%s\" title=\"%s\n···\n", p==page?" current":"", p, $6
al@728 315 } else if (r == 0)
al@761 316 printf "%s\">%s</button> ", $6, int(NR / size)
al@726 317 }
al@726 318 END{
al@726 319 if (num_pages == 1) exit
al@761 320 if (r != 0) printf "%s\">%s</button>", $6, int(NR / size) + 1
al@726 321 print "</p>"
al@726 322 }' $1
al@726 323 }
al@726 324
al@726 325
al@736 326 # Show packages list by category or tag
al@736 327
al@736 328 show_list() {
al@747 329 PAGE_SIZE=${PAGE_SIZE:-100}
al@747 330 page=$(GET page); page=${page:-1}
al@736 331 cached=$(mktemp)
al@744 332 [ -n "$tag" ] && cat=''
al@736 333 {
al@736 334 for L in $LANG ${LANG%%_*}; do
al@736 335 if [ -e "$PKGS_DB/packages-desc.$L" ]; then
al@736 336 sed '/^#/d' $PKGS_DB/packages-desc.$L; break
al@736 337 fi
al@736 338 done
al@736 339 [ -e "$i/blocked-packages.list" ] && cat $i/blocked-packages.list
al@736 340 sed 's|.*|&\ti|' $i/installed.info
al@744 341 [ "$cat" == 'extra' ] || [ $1 == 'my' ] || cat $i/packages.info
pascal@760 342 [ "$cat" == 'extra' ] &&
pascal@760 343 sed 's,\([^|]*\)|*\([^|]*\).*,\1\t-\textra\t\2\thttp://mirror.slitaz.org/packages/get/\1\t-\t-\t-,' $PKGS_DB/extra.list
al@744 344 } | sort -t$'\t' -k1,1 | sed '/^$/d' | awk -F$'\t' -vc="${cat:--}" -vt="${tag:--}" '
al@736 345 {
al@736 346 if (PKG && PKG != $1) {
al@736 347 if (SEL) {
al@736 348 if (DSCL) DSC = DSCL
al@761 349 printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\" id=\"%s\">", PKG, PKG
al@761 350 printf "<a data-icon=\"pkg%s%s\" href=\"?info=%s\">%s</a></td>", INS, BLK, gensub(/\+/, "%2B", "g", PKG), PKG
al@761 351 printf "<td>%s</td><td>%s</td><td><a href=\"%s\"></a></td></tr>\n", VER, DSC, WEB
al@736 352 }
al@736 353 VER = DSC = WEB = DSCL = INS = BLK = SEL = ""
al@736 354 }
al@736 355
al@736 356 PKG = $1
al@736 357 if (NF == 1) { BLK = "b"; next }
al@736 358 if (NF == 2) { DSCL = $2; next }
al@736 359 if (c == "all" || $3 == c || index(" "$6" ", " "t" ")) { SEL = 1 }
al@736 360 if (SEL) {
al@736 361 if ($9 == "i") { VER = $2; DSC = $4; WEB = $5; INS = "i"; next}
al@736 362 if (! INS) { VER = $2; DSC = $4; WEB = $5 }
al@736 363 }
al@736 364 }' > $cached
al@736 365
al@736 366 pager="$(pager $cached)"
al@747 367 case $PAGE_SIZE in
al@747 368 0) list="$(cat $cached)";;
al@747 369 *) list="$(tail -n+$((($page-1)*$PAGE_SIZE+1)) $cached | head -n$PAGE_SIZE)";;
al@747 370 esac
al@747 371
al@747 372 if [ "$pager" != "<p>$(_ 'Pages:') </p>" ] && [ -n "${list:1:1}" ]; then
al@744 373 cat << EOT
al@755 374 <h3>$(header_repo_name $i)</h3>
al@744 375 $pager
al@744 376 $(table_head)
al@744 377 $list
al@744 378 </tbody></table>
al@744 379 $pager
al@744 380 EOT
al@737 381 fi
al@736 382 rm -f $cached
al@761 383
al@761 384
al@761 385 ### Re-select packages when you return to the page
al@761 386
al@761 387 # Find the packages list
al@761 388 pkgs=$(echo "$QUERY_STRING&" | awk 'BEGIN{RS="&";FS="="}
al@761 389 {if ($1=="pkg") printf "\"%s\", ", $2}')
al@761 390 pkgs=$(httpd -d "${pkgs%, }")
al@761 391 # now pkgs='"pkg1", "pkg2", ... "pkgn"'
al@761 392
al@761 393 if [ -n "$pkgs" ]; then
al@761 394 cat << EOT
al@761 395 <script type="text/javascript">
al@761 396 var pkgs = [$pkgs];
al@761 397 var theForm = document.getElementById('pkglist');
al@761 398 for (index = 0; index < pkgs.length; index++) {
al@761 399 if (document.getElementById(pkgs[index])) {
al@761 400 // check existing
al@761 401 document.getElementById(pkgs[index]).checked = 'true';
al@761 402 }
al@761 403 else {
al@761 404 // add other as hidden
al@761 405 var hInput = document.createElement('input');
al@761 406 hInput.type = 'hidden';
al@761 407 hInput.name = 'pkg';
al@761 408 hInput.value = pkgs[index];
al@761 409 theForm.appendChild(hInput);
al@761 410 }
al@761 411 }
al@762 412 document.getElementById('countSelected').innerText = pkgs.length;
al@761 413 </script>
al@761 414 EOT
al@761 415 fi
al@736 416 }
al@736 417
al@736 418
al@727 419 # Show links for "info" page
al@727 420
al@727 421 show_info_links() {
al@727 422 if [ -n "$1" ]; then
al@727 423 echo -n "<tr><td><b>$2</b></td><td>"
al@727 424 echo $1 | tr ' ' $'\n' | awk -vt="$3" '{
al@747 425 printf "<a href=\"?%s=%s\">%s</a>   ", t, gensub(/\+/, "%2B", "g", $1), $1
al@727 426 }'
al@727 427 echo "</td></tr>"
al@727 428 fi
al@727 429 }
al@727 430
al@727 431
al@707 432
pascal@627 433 #
pascal@627 434 # Commands
pascal@627 435 #
pascal@627 436
al@707 437
pascal@627 438 case " $(GET) " in
al@741 439
al@741 440
pascal@627 441 *\ linkable\ *)
pascal@627 442 #
pascal@627 443 # List linkable packages.
pascal@627 444 #
al@744 445 search_form; sidebar
al@744 446 LOADING_MSG=$(_ 'Listing linkable packages...'); loading_msg
al@744 447
pascal@627 448 cat << EOT
al@707 449 <h2>$(_ 'Linkable packages')</h2>
pascal@627 450
al@755 451 <form class="wide">
al@755 452 $(_ 'Selection:') $(show_button do=Link)
pascal@627 453 EOT
al@736 454 table_head
al@700 455 target=$(readlink $PKGS_DB/fslink)
al@707 456 for pkg in $(ls $target/$INSTALLED); do
pascal@627 457 [ -s $pkg/receipt ] && continue
pascal@627 458 . $target/$INSTALLED/$pkg/receipt
al@718 459 i18n_desc $pkg
pascal@627 460 cat << EOT
pascal@627 461 <tr>
al@758 462 <td><input type="checkbox" name="pkg" value="$pkg" /><a data-icon="pkg" href="?info=${pkg//+/%2B}">$pkg</a></td>
pascal@627 463 <td>$VERSION</td>
al@719 464 <td>$SHORT_DESC</td>
al@758 465 <td><a data-img="web" href="$WEB_SITE"></a></td>
pascal@627 466 </tr>
pascal@627 467 EOT
pascal@627 468 done
pascal@627 469 cat << EOT
al@736 470 </tbody>
al@736 471 </table>
pascal@627 472 </form>
pascal@627 473 EOT
pascal@627 474 ;;
pascal@627 475
pascal@627 476
al@744 477 *\ cats\ *)
pascal@627 478 #
al@744 479 # List of all categories.
pascal@627 480 #
al@744 481 search_form; sidebar
al@744 482
al@744 483 echo "<h2>$(_ 'Categories list')</h2>"
al@744 484
al@744 485 for pkgsinfo in $(repo_list /packages.info); do
al@728 486 cat << EOT
al@755 487 <section>
al@755 488 <header>$(header_repo_name $(dirname $pkgsinfo))</header>
al@755 489 <table class="wide zebra center">
al@755 490 <thead>
al@755 491 <tr>
al@755 492 <td>$(_ 'Category')</td>
al@755 493 <td>$(_ 'Available packages')</td>
al@755 494 <td>$(_ 'Installed packages')</td>
al@755 495 </tr>
al@755 496 </thead>
al@755 497 <tbody>
al@728 498 EOT
al@728 499 {
al@744 500 awk -F$'\t' '{print $3}' $pkgsinfo | sort | uniq -c
al@728 501 awk -F$'\t' '{print $3}' $PKGS_DB/installed.info | sed 's|.*|& i|' | sort | uniq -c
al@728 502 } | sort -k2,2 | awk '
al@728 503 {
al@728 504 c [$2] = "."
al@728 505 if ($3) { i[$2] = $1; } else { m[$2] = $1; }
al@728 506 }
al@728 507 END {
al@728 508 for (n in c) print n, m[n], i[n]
al@744 509 }' | sort | awk '{
al@744 510 printf "<tr><td><a href=\"?list&amp;cat=%s\">%s</a></td><td>%d</td><td>%d</td></tr>", $1, $1, $2, $3
al@728 511 }'
al@755 512 cat << EOT
al@755 513 </tbody>
al@755 514 </table>
al@755 515 </section>
al@755 516 EOT
al@744 517 done
al@744 518 ;;
al@744 519
al@744 520
al@761 521 *\ list\ *|*\ page\ *)
al@744 522 #
al@744 523 # List all packages by category.
al@744 524 #
al@744 525 search_form; sidebar
al@744 526 LOADING_MSG="$(_ 'Listing packages...')"; loading_msg
al@744 527
al@744 528 bcat="<b>$cat</b>"; brepo="<b>$repo</b>"
al@744 529 case $repo in
al@744 530 Any)
al@744 531 case $my in
al@744 532 my) title="$(_ 'Installed packages of category "%s"' "$bcat")" ;;
al@744 533 *) title="$(_ 'All packages of category "%s"' "$bcat")" ;;
al@744 534 esac ;;
al@744 535 *)
al@744 536 case $my in
al@744 537 my) title="$(_ 'Installed packages of category "%s" in repository "%s"' "$bcat" "$brepo")" ;;
al@744 538 *) title="$(_ 'All packages of category "%s" in repository "%s"' "$bcat" "$brepo")" ;;
al@744 539 esac ;;
al@744 540 esac
al@744 541
al@744 542 cat << EOT
al@744 543 <h2>$(_ 'Packages list')</h2>
al@744 544 <p>$title</p>
pascal@627 545
pascal@764 546 EOT
pascal@764 547 [ "$REMOTE_USER" == "root" ] && cat << EOT
al@762 548 <section>
al@762 549 <div>$(_ 'Selected packages:') <span id="countSelected"></span></div>
al@762 550 <footer>
al@762 551 $({
al@762 552 [ "$my" != 'my' ] && show_button do=Install
al@762 553 show_button do=Chblock do=Remove
al@762 554 } | sed 's|button |button form="pkglist" |g')
al@762 555 $(show_button toggle)
al@762 556 </footer>
al@762 557 </section>
pascal@764 558 EOT
pascal@764 559 cat << EOT
al@758 560
al@758 561 <form id="pkglist" class="wide">
pascal@627 562 EOT
al@744 563 for i in $(repo_list ""); do
al@744 564 show_list ${my#no}
al@744 565 done
al@755 566 cat << EOT
al@755 567 </form>
al@762 568 <script type="text/javascript">window.onscroll = scrollHandler; setCountSelPkgs();</script>
al@755 569 EOT
al@728 570 ;;
pascal@627 571
pascal@627 572
pascal@627 573 *\ search\ *)
pascal@627 574 #
pascal@627 575 # Search for packages. Here default is to search in packages.desc
pascal@627 576 # and so get result including packages names and descriptions
pascal@627 577 #
al@725 578 pkg=$(GET search); [ -z "$pkg" ] && xhtml_footer && exit
al@718 579 cd $PKGS_DB
al@744 580
al@759 581 search_form | sed "s|name=\"search\"|& value=\"$pkg\"|"
al@759 582 sidebar
al@744 583 LOADING_MSG="$(_ 'Searching packages...')"; loading_msg
al@744 584
pascal@627 585 cat << EOT
al@707 586 <h2>$(_ 'Search packages')</h2>
al@736 587
al@762 588 <section>
al@762 589 <div>$(_ 'Selected packages:') <span id="countSelected"></span></div>
al@762 590 <footer>
al@762 591 $(show_button do=Install do=Chblock do=Remove | sed 's|button |button form="pkglist" |g')
al@762 592 $(show_button toggle)
al@762 593 </footer>
al@762 594 </section>
al@758 595
al@758 596 <form id="pkglist" class="wide">
pascal@627 597 EOT
al@763 598 if [ -n "$(GET files)" -o -n "$(echo $pkg | grep '/')" ]; then
pascal@627 599 cat <<EOT
al@759 600 <table class="wide zebra filelist">
pascal@627 601 <thead>
pascal@627 602 <tr>
al@707 603 <td>$(_ 'Package')</td>
al@707 604 <td>$(_ 'File')</td>
pascal@627 605 </tr>
pascal@627 606 <thead>
pascal@627 607 <tbody>
pascal@627 608 EOT
al@718 609 lzcat $(repo_list /files.list.lzma) | grep -Ei ": .*$(GET search)" | \
al@718 610 while read PACKAGE FILE; do
al@718 611 PACKAGE=${PACKAGE%:}
al@763 612 class='pkg'
al@763 613 if [ -d $INSTALLED/$PACKAGE ]; then
al@763 614 class='pkgi'
al@763 615 grep -q "^$PACKAGE$" $PKGS_DB/blocked-packages.list && class='pkgib'
al@763 616 fi
al@718 617 cat << EOT
pascal@627 618 <tr>
al@719 619 <td><input type="checkbox" name="pkg" value="$PACKAGE">$(pkg_info_link $PACKAGE $class)</td>
al@759 620 <td>$(echo "$FILE" | sed "s|$pkg|<span class=\"diff-add\">&</span>|gI")</td>
pascal@627 621 </tr>
pascal@627 622 EOT
al@718 623 done
pascal@627 624 else
al@718 625 table_head
al@718 626 awk -F$'\t' 'BEGIN{IGNORECASE = 1}
al@755 627 $1 " " $4 ~ /'$pkg'/{print $0}' $(repo_list /packages.info) | parse_packages_info
pascal@627 628 fi
pascal@627 629 cat << EOT
pascal@627 630 </tbody>
pascal@627 631 </table>
pascal@627 632 </form>
al@762 633 <script type="text/javascript">window.onscroll = scrollHandler; setCountSelPkgs();</script>
pascal@627 634 EOT
pascal@627 635 ;;
pascal@627 636
pascal@627 637
pascal@627 638 *\ recharge\ *)
pascal@627 639 #
pascal@627 640 # Lets recharge the packages list
pascal@627 641 #
al@744 642 search_form; sidebar
al@744 643 LOADING_MSG="$(_ 'Recharging lists...')"; loading_msg
al@744 644
pascal@627 645 cat << EOT
al@707 646 <h2>$(_ 'Recharge')</h2>
pascal@627 647
al@755 648 <form>
pascal@627 649 <div id="actions">
al@755 650 <p>$(_ 'Recharge checks for new or updated packages')</p>
al@744 651 <div class="float-right">$(show_button up)</div>
pascal@627 652 </div>
al@755 653
pascal@627 654 <pre>
pascal@627 655 EOT
al@707 656 echo $(_ 'Recharging packages list') | log
pascal@627 657 tazpkg recharge | filter_taztools_msgs
pascal@627 658 cat << EOT
pascal@627 659 </pre>
al@755 660
al@707 661 <p>$(_ 'Packages lists are up-to-date. You should check for upgrades now.')</p>
pascal@627 662 EOT
pascal@627 663 ;;
pascal@627 664
pascal@627 665
pascal@627 666 *\ up\ *)
pascal@627 667 #
pascal@627 668 # Upgrade packages
pascal@627 669 #
al@744 670 search_form; sidebar
al@744 671 LOADING_MSG="$(_ 'Checking for upgrades...')"; loading_msg
al@744 672
pascal@627 673 cat << EOT
al@707 674 <h2>$(_ 'Up packages')</h2>
pascal@627 675
al@762 676 <section>
al@762 677 <div>$(_ 'Selected packages:') <span id="countSelected"></span></div>
al@762 678 <footer>
al@762 679 $(show_button do=Install do=Chblock do=Remove | sed 's|button |button form="pkglist" |g')
al@762 680 $(show_button toggle)
al@762 681 </footer>
al@762 682 </section>
al@758 683
al@758 684 <form id="pkglist" class="wide">
pascal@627 685 EOT
al@747 686 # Ask tazpkg to make "packages.up" file
pascal@627 687 tazpkg up --check >/dev/null
al@736 688 table_head
al@747 689
al@747 690 for pkg in $(cat $PKGS_DB/packages.up); do
al@747 691 grep -hs "^$pkg " $PKGS_DB/packages.info $PKGS_DB/undigest/*/packages.info | parse_packages_info
pascal@627 692 done
al@747 693
al@762 694 cat << EOT
al@762 695 </tbody>
al@762 696 </table>
al@762 697 </form>
al@762 698 <script type="text/javascript">window.onscroll = scrollHandler; setCountSelPkgs();</script>
al@762 699 EOT
pascal@627 700 ;;
pascal@627 701
pascal@627 702
pascal@627 703 *\ do\ *)
pascal@627 704 #
pascal@627 705 # Do an action on one or some packages
pascal@627 706 #
al@744 707 search_form; sidebar
al@747 708 loading_msg
al@744 709
al@747 710 # Find the command
al@744 711 cmd=$(echo $(GET do) | tr [:upper:] [:lower:])
al@747 712
al@747 713 # Find the packages list
al@744 714 pkgs=$(echo $QUERY_STRING | awk 'BEGIN{RS="&";FS="="}{if($1=="pkg")print $2}')
al@744 715 pkgs=$(httpd -d "$pkgs")
al@747 716
al@747 717 # Describe the command
al@747 718 bpkgs="<b>$pkgs</b>"; opt=''
pascal@627 719 case $cmd in
al@762 720 install) MSG="$(_ 'Installing: %s' "$bpkgs")"; opt=--forced; cmd=get-install ;;
al@762 721 remove) MSG="$(_ 'Removing: %s' "$bpkgs")" ;;
al@762 722 link) MSG="$(_ 'Linking: %s' "$bpkgs")"; opt=$(readlink $PKGS_DB/fslink) ;;
al@762 723 block) MSG="$(_ 'Blocking: %s' "$bpkgs")" ;;
al@762 724 unblock) MSG="$(_ 'Unblocking: %s' "$bpkgs")" ;;
al@762 725 chblock) MSG="$(_ '(Un)blocking: %s' "$bpkgs")" ;;
al@762 726 repack) MSG="$(_ 'Repacking: %s' "$bpkgs")" ;;
pascal@627 727 esac
al@747 728
pascal@627 729 cat << EOT
al@744 730 <h2>TazPkg: $(GET do)</h2>
al@747 731 <p>$MSG</p>
pascal@627 732 EOT
al@747 733 # Do the command for all asked packages
al@707 734 for pkg in $pkgs; do
pascal@627 735 echo '<pre>'
al@747 736 echo $(_n 'y') | tazpkg $cmd $pkg $opt 2>/dev/null | filter_taztools_msgs
pascal@627 737 echo '</pre>'
pascal@627 738 done ;;
pascal@627 739
pascal@627 740
pascal@627 741 *\ info\ *)
pascal@627 742 #
pascal@627 743 # Packages info
pascal@627 744 #
pascal@627 745 pkg=$(GET info)
al@744 746 search_form; sidebar
al@744 747 LOADING_MSG=$(_ 'Getting package info...'); loading_msg
al@744 748
al@747 749 cat << EOT
al@755 750 <section>
al@755 751 <header>
al@755 752 $(_ 'Package %s' $pkg)
al@755 753 <form>
al@755 754 <input type="hidden" name="pkg" value="${pkg#get-}"/>
al@747 755 EOT
al@747 756
al@747 757 # Get receipt variables, show Install/Remove buttons
pascal@627 758 if [ -d $INSTALLED/$pkg ]; then
pascal@627 759 . $INSTALLED/$pkg/receipt
al@718 760 files=$(wc -l < $INSTALLED/$pkg/files.list)
pascal@767 761 [ "$REMOTE_USER" == "root" ] &&
al@747 762 show_button do=Remove
pascal@627 763 else
al@718 764 cd $PKGS_DB
al@727 765 eval "$(awk -F$'\t' -vp=$pkg '
al@727 766 $1==p{
al@727 767 printf "PACKAGE=\"%s\"; VERSION=\"%s\"; CATEGORY=\"%s\"; ", $1, $2, $3
al@727 768 printf "SHORT_DESC=\"%s\"; WEB_SITE=\"%s\"; TAGS=\"%s\"; ", $4, $5, $6
al@727 769 printf "SIZES=\"%s\"; DEPENDS=\"%s\"", $7, $8
al@727 770 }' packages.info undigest/*/packages.info)"
al@727 771 PACKED_SIZE=${SIZES% *}
al@727 772 UNPACKED_SIZE=${SIZES#* }
pascal@767 773 [ "$REMOTE_USER" == "root" ] &&
al@747 774 if [ "${pkg#get-}" != "$pkg" ]; then
al@747 775 show_button "do=Install&amp;nf"
al@747 776 else
al@747 777 show_button do=Install
al@747 778 fi
pascal@627 779 fi
pascal@627 780
al@747 781 # Show Block/Unblock, and Repack buttons
pascal@767 782 [ "$REMOTE_USER" == "root" ] &&
pascal@627 783 if [ -d $INSTALLED/$pkg ]; then
al@700 784 if grep -qs "^$pkg$" $PKGS_DB/blocked-packages.list; then
al@744 785 show_button do=Unblock
pascal@627 786 else
al@744 787 show_button do=Block
pascal@627 788 fi
al@744 789 show_button do=Repack
pascal@627 790 fi
al@747 791
al@747 792 # Translate short description
al@718 793 i18n_desc $pkg
al@747 794
al@747 795 # Show info table
pascal@627 796 cat << EOT
al@755 797 </form>
al@755 798 </header>
al@755 799
al@755 800 <table class="wide zebra summary">
pascal@627 801 <tbody>
al@707 802 <tr><td><b>$(_ 'Name')</b></td><td>$PACKAGE</td></tr>
al@707 803 <tr><td><b>$(_ 'Version')</b></td><td>$VERSION</td></tr>
al@758 804 <tr><td><b>$(_ 'Category')</b></td><td><a href="?list&amp;cat=$CATEGORY">$CATEGORY</a></td></tr>
al@707 805 <tr><td><b>$(_ 'Description')</b></td><td>$SHORT_DESC</td></tr>
al@727 806 $([ -n "$MAINTAINER" ] && echo "<tr><td><b>$(_ 'Maintainer')</b></td><td>$MAINTAINER</td></tr>")
al@727 807 $([ -n "$LICENSE" ] && echo "<tr><td><b>$(_ 'License')</b></td><td><a href=\"?license=$pkg\">$LICENSE</a></td></tr>")
al@747 808 <tr><td><b>$(_ 'Website')</b></td><td><a href="$WEB_SITE" target="_blank">$WEB_SITE</a></td></tr>
al@727 809 $(show_info_links "$TAGS" "$(_ 'Tags')" 'tag')
al@707 810 <tr><td><b>$(_ 'Sizes')</b></td><td>$PACKED_SIZE/$UNPACKED_SIZE</td></tr>
al@727 811 $(show_info_links "$DEPENDS" "$(_ 'Depends')" 'info')
al@727 812 $(show_info_links "$SUGGESTED" "$(_ 'Suggested')" 'info')
pascal@627 813 </tbody>
pascal@627 814 </table>
al@755 815 </section>
al@717 816 EOT
al@747 817
al@747 818 # Show description
al@727 819 DESC="$(tazpkg desc $pkg)"
al@755 820 [ -n "$DESC" ] && echo "<section><pre>$DESC</pre></section>"
pascal@627 821
al@747 822 # Show configuration files list
al@747 823 CONFIGS="$(tazpkg list-config $pkg | sed 's|\(.*\)|\1 \1|')"
al@755 824 [ -n "$CONFIGS" ] && cat << EOT
al@755 825 <section>
al@755 826 <header>$(_ 'Configuration files')</header>
al@755 827 <pre>$(printf '<a href="index.cgi?file=%s">%s</a>\n' $CONFIGS)</pre>
al@755 828 </section>
al@755 829 EOT
al@747 830
al@747 831 # Show installed files list
al@727 832 if [ -d $INSTALLED/$pkg ]; then
al@717 833 cat << EOT
al@755 834 <section>
al@755 835 <header>$(_ 'Installed files: %s' $(wc -l < $INSTALLED/$pkg/files.list))</header>
al@755 836 <pre>$(sort $INSTALLED/$pkg/files.list)</pre>
al@755 837 </section>
pascal@627 838 EOT
pascal@627 839 else
pascal@627 840 cat << EOT
al@755 841 <section>
al@755 842 <header>$(_ 'Installed files: %s' ' ')</header>
al@755 843 <pre>$(lzcat files.list.lzma undigest/*/files.list.lzma 2> /dev/null | awk -vp="$pkg:" '$1==p{print $2}' | sort)</pre>
al@755 844 </section>
pascal@627 845 EOT
pascal@627 846 fi
pascal@627 847 ;;
pascal@627 848
pascal@627 849
pascal@627 850 *\ admin\ * )
pascal@627 851 #
al@633 852 # TazPkg configuration page
pascal@627 853 #
pascal@627 854 cmd=$(GET admin)
al@747 855 pager="$(GET pager)"; pager=${pager:-$PAGE_SIZE}; pager=${pager:-100}
al@747 856 mirror="$(GET mirror)"; mirror="${mirror%/}/"
al@747 857 repository="$PKGS_DB/undigest/$(GET repository)"
al@747 858 link="$(GET link)"; link=${link%/}
al@744 859 search_form; sidebar
al@747 860 loading_msg
al@744 861
pascal@627 862 case "$cmd" in
pascal@627 863 clean)
al@725 864 rm -rf $CACHE_DIR/* ;;
pascal@627 865 add-mirror)
al@747 866 echo "$mirror" >> $(GET file) ;;
al@747 867 rm-mirror)
al@747 868 sed -i "/^"$(echo $mirror | sed 's|/|\\/|g')"$/d" $(GET file) ;;
al@747 869 select-mirror)
al@747 870 tazpkg setup-mirror "${mirror}packages/$(cat /etc/slitaz-release)/" | log ;;
pascal@627 871 add-repo)
al@747 872 mkdir -p $repository
al@747 873 echo "$mirror" > $repository/mirror
al@747 874 echo "$mirror" > $repository/mirrors ;;
al@747 875 rm-repo)
al@747 876 rm -rf $repository ;;
al@744 877 setlink)
al@747 878 [ -d "$link/$INSTALLED" ] && ln -fs $link $PKGS_DB/fslink ;;
al@744 879 removelink)
al@744 880 rm -f $PKGS_DB/fslink ;;
al@747 881 pager)
al@747 882 TP_CONF=/etc/slitaz/tazpanel.conf
al@747 883 if [ -z "$PAGE_SIZE" ]; then
al@747 884 echo -e "\n# Size of packages list page\nPAGE_SIZE=\"$pager\"" >> $TP_CONF
al@747 885 else
al@747 886 sed -i "s|PAGE_SIZE=.*|PAGE_SIZE=\"$pager\"|" $TP_CONF
al@747 887 fi ;;
pascal@627 888 esac
al@736 889
pascal@627 890 cat << EOT
al@707 891 <h2>$(_ 'Administration')</h2>
al@742 892
al@747 893 <p>$(_ 'TazPkg administration and settings')</p>
al@747 894
al@755 895 <form id="actions">
al@755 896 <input type="hidden" name="admin"/>
al@747 897 $(show_button action=saveconf action=listconf action=quickcheck action=fullcheck)
al@742 898 </form>
pascal@627 899 EOT
pascal@627 900 case "$(GET action)" in
al@747 901 saveconf)
al@747 902 LOADING_MSG=$(_ 'Creating the package...'); loading_msg
al@747 903 echo "<pre>"
al@747 904 cd /tmp
al@747 905 tazpkg repack-config | filter_taztools_msgs
al@747 906 echo -n "$(_ 'Path:') "; ls /tmp/config-*.tazpkg
al@747 907 echo "</pre>" ;;
al@747 908 listconf)
al@747 909 echo "<h4>$(_ 'Configuration files')</h4>"
al@747 910 echo "<ul>"
al@747 911 tazpkg list-config | while read file; do
al@747 912 if [ -e $file ]; then
al@747 913 echo "<li><a href=\"index.cgi?file=$file\">$file</a></li>"
al@747 914 else
al@747 915 echo "<li>$file</li>"
al@747 916 fi
al@747 917 done
al@747 918 echo "</ul>" ;;
al@747 919 quickcheck)
al@747 920 LOADING_MSG=$(_ 'Checking packages consistency...'); loading_msg
al@747 921 echo "<pre>"
al@747 922 tazpkg check
al@747 923 echo "</pre>" ;;
al@747 924 fullcheck)
al@747 925 LOADING_MSG=$(_ 'Full packages check...'); loading_msg
al@747 926 echo "<pre>"
al@747 927 tazpkg check --full
al@747 928 echo "</pre>" ;;
al@747 929 dvdimage)
al@747 930 dev=$(POST dvdimage)
al@747 931 mkdir -p /mnt/packages 2> /dev/null
al@747 932 echo "<pre>"
al@747 933 mount -t iso9660 -o loop,ro $dev /mnt/packages &&
al@747 934 /mnt/packages/install.sh &&
al@747 935 _ '%s is installed on /mnt/packages' $dev
al@747 936 echo "</pre>" ;;
al@747 937 dvdusbkey)
al@747 938 mkdir -p /mnt/packages 2> /dev/null
al@747 939 for tag in "LABEL=\"packages-$version\" TYPE=\"iso9660\"" \
al@747 940 "LABEL=\"sources-$version\" TYPE=\"iso9660\"" ; do
al@747 941 dev=$(blkid | grep "$tag" | cut -d: -f1)
al@747 942 [ -n "$dev" ] || continue
pascal@627 943 echo "<pre>"
al@747 944 mount -t iso9660 -o ro $dev /mnt/packages &&
al@747 945 /mnt/packages/install.sh &&
al@747 946 _ '%s is installed on /mnt/packages' $dev
al@747 947 echo "</pre>"
al@747 948 break
al@747 949 done ;;
al@747 950 esac
al@744 951
al@747 952 cache_files=$(find $CACHE_DIR -name '*.tazpkg' | wc -l)
al@744 953 cache_size=$(du -sh $CACHE_DIR | cut -f1 | sed 's|\.0||')
al@744 954 [ "$cache_files" == 0 ] && cache_size="0K"
al@747 955 mirror=$(cat $PKGS_DB/mirror)
al@747 956 default_mirror=${mirror%/packages/*}
pascal@627 957 cat << EOT
al@755 958 <section>
al@755 959 <header>$(_ 'Packages cache')</header>
al@755 960 <form class="wide">
al@755 961 <div>$(_ 'Packages in the cache: %s (%s)' $cache_files $cache_size)</div>
al@755 962 <footer>$(show_button admin=clean)</footer>
al@755 963 </form>
al@755 964 </section>
pascal@627 965
pascal@627 966
al@755 967 <section>
al@755 968 <header>$(_ 'Current mirror list')</header>
pascal@627 969 EOT
al@747 970
al@747 971 # List mirrors
al@747 972 version=$(cat /etc/slitaz-release)
al@700 973 for i in $PKGS_DB/mirrors $PKGS_DB/undigest/*/mirrors; do
pascal@627 974 [ -s $i ] || continue
al@700 975 if [ $i != $PKGS_DB/mirrors ]; then
al@747 976 echo "<h4>$(_ 'Repository: %s' "$(repo_name $(dirname $i))")</h4>"
pascal@627 977 fi
pascal@627 978 cat << EOT
al@755 979 <form class="wide">
al@755 980 <input type="hidden" name="admin" value="select-mirror"/>
al@755 981 <table class="wide zebra">
al@747 982 EOT
al@747 983 while read line; do
al@747 984 cat << EOT
al@755 985 <tr>
al@755 986 <td>
al@755 987 <input type="radio" name="mirror" id="$line" value="$line" onchange="this.form.submit()"
al@755 988 $([ "$line" == "$default_mirror/" ] && echo -n 'checked="checked"')>
al@755 989 <label for="$line"><code>$line</code></label></td>
al@755 990 <td><a data-img="web" href="$line" target="_blank"></a></td>
al@755 991 <td><a data-img="remove" href="?admin=rm-mirror&amp;mirror=$line&amp;file=$i" title="$(_ 'Delete')"></a></td>
al@755 992 </tr>
al@747 993 EOT
al@747 994 done < $i
al@747 995 cat << EOT
al@755 996 </table>
al@755 997 </form>
al@747 998
al@755 999 <form class="wide">
al@755 1000 <footer>
al@755 1001 <input type="hidden" name="file" value="$i" />
al@755 1002 <input type="text" name="mirror" size="40" />
al@755 1003 $(show_button admin=add-mirror)
al@755 1004 </footer>
al@755 1005 </form>
pascal@627 1006 EOT
pascal@627 1007 done
al@755 1008 cat << EOT
al@755 1009 </section>
al@755 1010
al@755 1011
al@755 1012 <section>
al@755 1013 <header>$(_ 'Private repositories')</header>
al@755 1014 EOT
al@747 1015 if [ -n "$(ls $PKGS_DB/undigest 2> /dev/null)" ]; then
al@755 1016 cat << EOT
al@755 1017 <table class="wide zebra">
al@755 1018 EOT
al@747 1019 ls $PKGS_DB/undigest 2> /dev/null | while read repo ; do
al@747 1020 cat <<EOT
al@755 1021 <tr>
al@755 1022 <td><code>$repo</code></td>
al@755 1023 <td><a data-img="remove" href="?admin=rm-repo&amp;repository=$repo" title="$(_ 'Delete')"></a></td>
al@755 1024 </tr>
pascal@627 1025 EOT
al@747 1026 done
al@755 1027 cat << EOT
al@755 1028 </table>
al@755 1029 EOT
al@747 1030 fi
al@747 1031
pascal@627 1032 cat << EOT
al@755 1033 <form class="wide">
al@755 1034 <table>
al@755 1035 <tr><td>$(_ 'Name')</td><td><input type="text" name="repository" size="10"/></td></tr>
al@755 1036 <tr><td>$(_ 'URL:')</td><td><input type="text" name="mirror" value="http://"></td></tr>
al@755 1037 </table>
al@755 1038 <footer>
al@755 1039 $(show_button admin=add-repo)
al@755 1040 </footer>
al@755 1041 </form>
al@755 1042 </section>
pascal@627 1043
al@747 1044
al@755 1045 <section>
al@755 1046 <header>$(_ 'Link to another SliTaz installation')</header>
al@755 1047 <form class="wide">
al@755 1048 <div>
al@755 1049 $(_ "This link points to the root of another SliTaz installation. You will be able to install packages using soft links to it.")
al@755 1050 </div>
al@755 1051 <input type="text" name="link" value="$(readlink $PKGS_DB/fslink 2> /dev/null)"/>
al@755 1052 <footer>
al@755 1053 $(show_button admin=setlink admin=removelink)
al@755 1054 </footer>
al@755 1055 </form>
al@755 1056 </section>
pascal@627 1057
pascal@627 1058
al@755 1059 <section>
al@755 1060 <header id="dvd">$(_ 'SliTaz packages DVD')</header>
pascal@627 1061
al@755 1062 <div>
al@755 1063 $(_ "A bootable DVD image of all available packages for the %s version is generated every day. It also contains a copy of the website and can be used without an internet connection. This image can be installed on a DVD or a USB key." $version)
al@747 1064
al@755 1065 <form method="post" action='?admin&amp;action=dvdimage'>
al@755 1066 $(_ 'Install from ISO image:')
al@755 1067 <input type="text" name="dvdimage" size="40" value="/root/packages-$version.iso" />
al@755 1068 </form>
al@755 1069 </div>
pascal@627 1070
al@755 1071 <footer>
al@755 1072 <button data-icon="download" onclick='http://mirror.slitaz.org/iso/$version/packages-$version.iso'>
al@755 1073 $(_ 'Download DVD image')</button>
al@755 1074 <button data-icon="link" onclick='?admin&amp;action=dvdusbkey'>
al@755 1075 $(_ 'Install from DVD/USB key')</button>
al@755 1076 </footer>
al@755 1077 </section>
pascal@627 1078
al@747 1079
al@755 1080 <section>
al@755 1081 <header>$(_ 'Packages list')</header>
al@755 1082 <form class="wide">
al@755 1083 <div>
al@755 1084 $(_ 'Long list of packages is paginated. Here you can set the page size (default: 100, turning off the pager: 0).')
al@755 1085 </div>
al@755 1086 <input type="hidden" name="admin" value="pager"/>
al@755 1087 <input type="number" name="pager" value="$pager" min="0" step="10" size="4"/>
al@755 1088 <footer>
al@755 1089 <button data-icon="ok" type="submit">$(_ 'Set')</button>
al@755 1090 </footer>
al@755 1091 </form>
al@755 1092 </section>
pascal@627 1093 EOT
al@727 1094 ;;
al@727 1095
al@727 1096
al@727 1097 *\ license\ *)
al@727 1098 #
al@727 1099 # Show licenses for installed packages
al@727 1100 #
al@744 1101 search_form; sidebar
al@744 1102
al@727 1103 pkg=$(GET license)
al@727 1104 case $pkg in
al@747 1105 /*) [ -e $pkg ] && {
al@727 1106 echo "<h2>${pkg#/usr/share/licenses/}</h2>"
al@727 1107 case $pkg in
al@747 1108 *.htm*) cat $pkg ;;
al@747 1109 *) echo "<pre style=\"white-space: pre-wrap\">"
al@727 1110 cat $pkg | htmlize | sed 's|\([hf]t*t*ps*://[a-zA-Z0-9./_-]*[a-zA-Z0-9/_-]\)|<a href="\1">\1</a>|'
al@727 1111 echo "</pre>"
al@727 1112 ;;
al@727 1113 esac
al@727 1114 } ;;
al@747 1115 *) echo "<h2>$(_ 'Licenses for package %s' $pkg)</h2>"
al@747 1116 OFFLINE=''
al@727 1117 if [ -e "$PKGS_DB/installed/$pkg" ]; then
al@727 1118 for lic in $(grep /usr/share/licenses/ $PKGS_DB/installed/$pkg/files.list); do
al@727 1119 OFFLINE="$OFFLINE <li><a href=\"?license=$lic\">licenses/<b>${lic#/usr/share/licenses/}</b></a></li>\n"
al@727 1120 done
al@747 1121 echo "\
al@747 1122 Apache|Apache-2.0||||http://www.apache.org/licenses/#Artistic|Artistic-2.0||||#\
al@747 1123 BSD|BSD-2-Clause||||#BSD3|BSD-3-Clause||||#CC-BY-SA||by-sa/4.0/|||#\
al@747 1124 CC-SA||by-sa/4.0/|||#CC-BY-ND||by-nd/4.0/|||#CC-BY-NC-SA||by-nc-sa/4.0/|||#\
al@747 1125 CC-BY-NC-ND||by-nc-nd/4.0/|||#CC-BY-NC||by-nc/4.0/|||#CC-BY||by/4.0/|||#\
al@747 1126 cc-pd|||||http://creativecommons.org/publicdomain/#CDDL|CDDL-1.0||||#\
al@747 1127 CECILL|CECILL-2.1||||#Eclipse|EPL-1.0||||#EPL|EPL-1.0||||#FDL|||fdl||#\
al@747 1128 GPL|gpl-license||gpl|gpl.txt|#GPL2|GPL-2.0||old-licenses/gpl-2.0||#\
al@747 1129 GPL3|GPL-3.0||gpl|gpl.txt|#ISC|ISC||||#LGPL|lgpl-license||lgpl||#\
al@747 1130 LGPL2|||old-licenses/lgpl-2.0||#\
al@747 1131 LGPL2.1|LGPL-2.1||old-licenses/lgpl-2.1|lgpl.txt|#LGPL3|LGPL-3.0||lgpl||#\
al@747 1132 LPPL|LPPL-1.3c||||#MIT|MIT|||mit.txt|#MPL|MPL-2.0|||mozilla.txt|#\
al@747 1133 MPL2|MPL-2.0||||#PublicDomain|||||http://creativecommons.org/publicdomain/#\
al@747 1134 QPL|QPL-1.0||||#SIL_OFL|OFL-1.1||||#OFL|OFL-1.1||||#zlib/libpng|Zlib||||" | \
al@747 1135 awk -vlicenses="$(. $PKGS_DB/installed/$pkg/receipt; echo "$LICENSE")" \
al@747 1136 -vtext="$(_ '%s license on %s website' %s %s)" \
al@747 1137 -vro="$(_ 'Read online:')" -vrl="$(_ 'Read local:')" \
al@747 1138 -vofflic="$OFFLINE" '
al@747 1139 BEGIN{ FS="|"; RS="#"; split(licenses, lic, " "); if (offlic) OFFLINE[0]=offlic }
al@747 1140 function link1(u, l, ll, w) {
al@747 1141 return sprintf("\t<li><a href=\"%s%s\">" text "</a></li>", u, l, "<b>" ll "</b>", w) }
al@747 1142 function link2(u, l, ll) {
al@747 1143 return sprintf("\t<li><a href=\"%s%s\">%s</b></a></li>", u, l, ll) }
al@747 1144 function link_osl(n) {
al@747 1145 return link1("http://opensource.org/licenses/", n, n, "OSL") }
al@747 1146 function link_cc(n) {
al@747 1147 split(n, ll, "/")
al@747 1148 return link1("http://creativecommons.org/licenses/", n, ll[1], "Creative Commons") }
al@747 1149 function link_gnu(n) {
al@747 1150 split(n, ll, "/")
al@747 1151 return link1("https://www.gnu.org/licenses/", n ".html", ll[2] ? ll[2] : ll[1], "GNU") }
al@747 1152 function link_loc(n) {
al@747 1153 return link2("?license=/usr/share/licenses/", n, "licenses/<b>" n "</b>") }
al@747 1154 function link_url(n) {
al@747 1155 return link2(n, "", n) }
al@747 1156 {
al@747 1157 if ($1 == lic[1] || $1 == lic[2] || $1 == lic[3] || $1 == lic[4]) {
al@747 1158 if ($2) ONLINE[$2]=link_osl($2)
al@747 1159 if ($3) ONLINE[$3]=link_cc($3)
al@747 1160 if ($4) ONLINE[$4]=link_gnu($4)
al@747 1161 if ($5) OFFLINE[$5]=link_loc($5)
al@747 1162 if ($6) OFFLINE[$6]=link_url($6)
al@747 1163 }
al@747 1164 }
al@747 1165 END{
al@747 1166 if (length(ONLINE) > 0) { print "<p>" ro "</p>\n<ul>"; for (o in ONLINE) print ONLINE[o]; print "</ul>" }
al@747 1167 if (length(OFFLINE) > 0) { print "<p>" rl "</p>\n<ul>"; for (o in OFFLINE) print OFFLINE[o]; print "</ul>" }
al@747 1168 }'
al@747 1169 fi ;;
al@727 1170 esac
al@727 1171 ;;
al@727 1172
al@727 1173
al@744 1174 *\ tags\ *)
al@744 1175 #
al@744 1176 # Show tag cloud
al@744 1177 #
al@744 1178 search_form; sidebar
al@744 1179
al@744 1180 echo "<h2>$(_ 'Tags list')</h2>"
al@744 1181 brepo="<b>$repo</b>"
al@744 1182 case $repo in
al@744 1183 Any) title="$(_ 'List of tags in all repositories')" ;;
al@744 1184 *) title="$(_ 'List of tags in repository "%s"' "$brepo")" ;;
al@744 1185 esac
al@747 1186 echo "<p>$title</p><p id=\"tags\">"
al@744 1187 to_read=""
al@744 1188 for i in $(repo_list ""); do
al@747 1189 if [ ! -e $i/packages.info ]; then
al@747 1190 list=installed
al@747 1191 else
al@747 1192 list=packages
al@747 1193 fi
al@744 1194 to_read="$to_read $i/$list.info"
al@744 1195 done
al@744 1196 TAGS="$(awk -F$'\t' '{if($6){print $6}}' $to_read | tr ' ' $'\n' | sort | uniq -c)"
al@744 1197 MAX="$(echo "$TAGS" | awk '{if ($1 > MAX) MAX = $1} END{print MAX}')"
al@744 1198 echo "$TAGS" | awk -vMAX="$MAX" '{
al@744 1199 printf "<a class=\"tag%s\" href=\"?tag=%s\" title=\"%s\">%s</a> ", int($1 * 7 / MAX + 1), $2, $1, $2
al@744 1200 }'
al@744 1201 echo "</p>"
al@744 1202 ;;
al@744 1203
al@744 1204
al@728 1205 *\ tag\ *)
al@728 1206 #
al@744 1207 # Show packages with matching tag
al@728 1208 #
al@744 1209 search_form; sidebar
al@744 1210
al@744 1211 tag=$(GET tag)
al@744 1212 cat << EOT
al@755 1213 <h2 data-icon="tag">$(_ 'Tag "%s"' $tag)</h2>
pascal@770 1214 EOT
pascal@770 1215 [ "$REMOTE_USER" == "root" ] && cat << EOT
al@762 1216 <section>
al@762 1217 <div>$(_ 'Selected packages:') <span id="countSelected"></span></div>
al@762 1218 <footer>
al@762 1219 $(show_button do=Install do=Chblock do=Remove | sed 's|button |button form="pkglist" |g')
al@762 1220 $(show_button toggle)
al@762 1221 </footer>
al@762 1222 </section>
pascal@770 1223 EOT
pascal@770 1224 cat << EOT
al@758 1225 <form id="pkglist" class="wide">
al@732 1226 EOT
al@744 1227 for i in $(repo_list ""); do
al@744 1228 show_list all
al@744 1229 done
al@762 1230 cat << EOT
al@762 1231 </form>
al@762 1232 <script type="text/javascript">window.onscroll = scrollHandler; setCountSelPkgs();</script>
al@762 1233 EOT
al@744 1234 ;;
al@732 1235
al@744 1236
al@744 1237 *\ blocked\ *)
al@744 1238 #
al@744 1239 # Show blocked packages list
al@744 1240 #
al@744 1241 search_form; sidebar
al@744 1242
al@744 1243 cat << EOT
al@744 1244 <h2>$(_ 'Blocked packages list')</h2>
al@744 1245
al@762 1246 <section>
al@762 1247 <div>$(_ 'Selected packages:') <span id="countSelected"></span></div>
al@762 1248 <footer>
al@762 1249 $(show_button do=Unblock | sed 's|button |button form="pkglist" |g')
al@762 1250 $(show_button toggle)
al@762 1251 </footer>
al@762 1252 </section>
al@762 1253
al@762 1254 <form id="pkglist" class="wide">
al@744 1255 EOT
al@744 1256 table_head
al@744 1257 for i in $(cat $PKGS_DB/blocked-packages.list); do
al@744 1258 awk -F$'\t' -vp="$i" '{
al@744 1259 if ($1 == p)
al@758 1260 printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\"><a data-icon=\"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
al@744 1261 }' $PKGS_DB/installed.info
al@744 1262 done
al@762 1263 cat << EOT
al@762 1264 </tbody>
al@762 1265 </table>
al@762 1266 </form>
al@762 1267 <script type="text/javascript">window.onscroll = scrollHandler; setCountSelPkgs();</script>
al@762 1268 EOT
al@728 1269 ;;
al@728 1270
al@728 1271
al@727 1272 *)
pascal@627 1273 #
pascal@627 1274 # Default to summary
pascal@627 1275 #
al@744 1276 search_form; sidebar
al@744 1277
pascal@627 1278 cat << EOT
al@755 1279 <form id="actions2">
pascal@627 1280 EOT
al@700 1281 fslink=$(readlink $PKGS_DB/fslink)
al@724 1282 [ -n "$fslink" -a -d "$fslink/$INSTALLED" ] && show_button linkable
al@747 1283 show_button recharge up admin
pascal@627 1284 cat << EOT
al@755 1285 </form>
pascal@627 1286
al@755 1287 <section>
al@755 1288 <header>$(_ 'Summary')</header>
al@755 1289
al@755 1290 <table class="wide zebra">
al@755 1291 <tr>
al@755 1292 <td>$(_ 'Last recharge:')</td>
al@755 1293 <td>$(list=$PKGS_DB/ID
al@745 1294 if [ -e $list ]; then
al@755 1295 # Timezone offset as string, ex. '+0200' for EET (+2 hours)
al@755 1296 ohhmm="$(date +%z)"
al@755 1297 # Timezone offset in the seconds
al@755 1298 offset=$(( 60 * (60 * ${ohhmm:0:3} + ${ohhmm:3:2}) ))
al@747 1299 daynow=$(( ($(date +%s) + $offset) / 86400 ))
al@747 1300 dayupd=$(( ($(date -r $list +%s) + $offset) / 86400 ))
al@747 1301 days=$(( $daynow - $dayupd ))
al@745 1302 time=$(date -r $list +%R)
al@745 1303 ago="$(_p '%d day ago.' '%d days ago.' $days $days)"
al@745 1304 case $days in
al@745 1305 0) _ 'Today at %s.' $time;;
al@745 1306 1) _ 'Yesterday at %s.' $time;;
al@745 1307 [2-9]) echo $ago;;
al@745 1308 *) echo "<span style='color:red'>$ago</span>"
al@745 1309 _ 'It is recommended to [recharge] the lists.' | \
al@755 1310 sed 's|\[|<a data-icon="refresh" href="?recharge">|;s|\]|</a>|';;
al@745 1311 esac
al@745 1312 else
al@745 1313 _ 'never.'
al@745 1314 _ 'You need to [download] the lists for further work.' | \
al@768 1315 sed 's|\[|<a data-icon="download" href="?recharge" data-root>|;s|\]|</a>|'
al@745 1316 fi)</td></tr>
al@755 1317 <tr>
al@755 1318 <td>$(_ 'Installed packages:')</td>
al@755 1319 <td><a href="?list&amp;my=my&amp;cat=all&amp;repo=Any">
al@755 1320 <b>$(cat $PKGS_DB/installed.info | wc -l)</b>
al@755 1321 </a></td></tr>
al@755 1322 <tr>
al@755 1323 <td>$(_ 'Mirrored packages:')</td>
al@755 1324 <td><a href="?list&amp;my=no&amp;cat=all&amp;repo=Any">
al@755 1325 <b>$(cat $PKGS_DB/packages.list | wc -l)</b>
al@755 1326 </a></td></tr>
al@755 1327 <tr>
al@755 1328 <td>$(_ 'Upgradeable packages:')</td>
al@755 1329 <td><a href="?up">
al@755 1330 <b>$(cat $PKGS_DB/packages.up | wc -l)</b>
al@755 1331 </a></td></tr>
al@755 1332 <tr>
al@755 1333 <td>$(_ 'Installed files:')</td>
al@755 1334 <td><b>$(cat $INSTALLED/*/files.list | wc -l)</b></td></tr>
al@755 1335 <tr>
al@755 1336 <td>$(_ 'Blocked packages:')</td>
al@755 1337 <td><a href="?blocked">
al@755 1338 <b>$(cat $PKGS_DB/blocked-packages.list | wc -l)</b>
al@755 1339 </a></td></tr>
al@755 1340 </table>
al@755 1341 </section>
pascal@627 1342
pascal@627 1343
al@755 1344 <section>
al@755 1345 <header>
al@755 1346 $(_ 'Latest log entries')
al@755 1347 <form action="index.cgi">
al@755 1348 <button name="file" value="$LOG" data-icon="view">$(_ 'Show')</button>
al@755 1349 </form>
al@755 1350 </header>
al@755 1351 <pre>$(tail -n 5 $LOG | tac | fgrep "-" | awk '{print $1, $2, $3, $4, $5, "<a href=\"?info=" $6 "\">" $6 "</a>", $7}')</pre>
al@755 1352 </section>
pascal@627 1353 EOT
pascal@627 1354 ;;
pascal@627 1355 esac
pascal@627 1356
pascal@627 1357 # xHTML 5 footer
al@633 1358 export TEXTDOMAIN='tazpkg'
pascal@627 1359 xhtml_footer
pascal@627 1360 exit 0