tazpkg annotate tazpanel/pkgs.cgi @ rev 767

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