tazpanel view pkgs.cgi @ rev 92

pkgs.cgi: add block/unblock buttons
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Apr 14 17:48:18 2011 +0200 (2011-04-14)
parents 3e9b8a48e16e
children 4b09b20ce287
line source
1 #!/bin/sh
2 #
3 # TazPKG CGI interface - Manage packages via a browser
4 #
5 # This CGI interface intensively uses tazpkg to manage packages and have
6 # its own code for some tasks. Please KISS, it is important and keep speed
7 # in mind. Thanks, Pankso.
8 #
9 # (C) 2011 SliTaz GNU/Linux - GNU gpl v3
10 #
12 . lib/libtazpanel
13 get_config
14 header
16 # Include gettext helper script.
17 . /usr/bin/gettext.sh
19 # Export package name for gettext.
20 TEXTDOMAIN='tazpanel'
21 export TEXTDOMAIN
23 # xHTML 5 header with special side bar fo categories.
24 TITLE="- Packages"
25 xhtml_header | sed 's/id="content"/id="content-sidebar"/'
28 # We need packages information for list and search
29 parse_packages_desc() {
30 IFS="|"
31 cut -f 1,2,3,5 -d "|" | while read PACKAGE VERSION SHORT_DESC WEB_SITE
32 do
33 echo '<tr>'
34 if [ -d $INSTALLED/${PACKAGE% } ]; then
35 echo -e "<td><input type='checkbox' name='pkg' value='$PACKAGE'>\n
36 <a href='$SCRIPT_NAME?info=$PACKAGE'>
37 <img src='$IMAGES/tazpkg-installed.png'/>$PACKAGE</a></td>"
38 else
39 echo -e "<td><input type='checkbox' name='pkg' value='$PACKAGE'>\n
40 <a href='$SCRIPT_NAME?info=$PACKAGE'>
41 <img src='$IMAGES/tazpkg.png'/>$PACKAGE</a></td>"
42 fi
43 echo "<td>$VERSION</td>"
44 echo "<td class='desc'>$SHORT_DESC</td>"
45 echo "<td><a href='$WEB_SITE'>web</a></td>"
46 echo '</tr>'
47 done
48 unset IFS
49 }
51 # Remove status and ESC char from tazpkg commands output
52 filter_tazpkg_msgs() {
53 grep ^[a-zA-Z0-9] | sed s'/\.*\]//'
54 }
56 # Display a full summary of packages stats
57 packages_summary() {
58 gettext "Last recharge : "
59 stat=`stat -c %y $LOCALSTATE/packages.list | \
60 sed 's/\(:..\):.*/\1/' | awk '{print $1}'`
61 mtime=`find /var/lib/tazpkg/packages.list -mtime +10`
62 echo -n "$stat "
63 if [ "$mtime" ]; then
64 echo "(Older than 10 days)"
65 else
66 echo "(Not older than 10 days)"
67 fi
68 gettext "Installed packages : "
69 ls $INSTALLED | wc -l
70 gettext "Mirrored packages : "
71 cat $LOCALSTATE/packages.list | wc -l
72 gettext "Upgradeable packages : "
73 cat $LOCALSTATE/packages.up | wc -l
74 #gettext "Installed files : "
75 #cat $INSTALLED/*/files.list | wc -l
76 gettext "Blocked packages : "
77 cat $LOCALSTATE/blocked-packages.list | wc -l
78 }
80 # Parse mirrors list to be able to have an icon an remove link
81 list_mirrors() {
82 cat $LOCALSTATE/mirrors | while read line
83 do
84 cat << EOT
85 <li><a href="$SCRIPT_NAME?config=rm-mirror=$line"><img
86 src="$IMAGES/clear.png" /></a><a href="$line">$line</a></li>
87 EOT
88 done
89 }
91 #
92 # xHTML functions
93 #
95 # ENTER will search but user may search for a button, so put one.
96 search_form() {
97 cat << EOT
98 <div class="search">
99 <form method="get" action="$SCRIPT_NAME">
100 <p>
101 <input type="text" name="search" size="20">
102 <input type="submit" value="`gettext "Search"`">
103 <input class="radius" type="submit" name="files"
104 value="`gettext "files"`">
105 </p>
106 </form>
107 </div>
108 EOT
109 }
111 table_head() {
112 cat << EOT
113 <tr id="thead">
114 <td>`gettext "Name"`</td>
115 <td>`gettext "Version"`</td>
116 <td>`gettext "Description"`</td>
117 <td>`gettext "Web"`</td>
118 </tr>
119 EOT
120 }
122 sidebar() {
123 cat << EOT
124 <div id="sidebar">
125 <h4>Categories</h4>
126 <a class="active_base-system" href="$SCRIPT_NAME?cat=base-system">Base-system</a>
127 <a class="active_x-window" href="$SCRIPT_NAME?cat=x-window">X window</a>
128 <a class="active_utilities" href="$SCRIPT_NAME?cat=utilities">Utilities</a>
129 <a class="active_network" href="$SCRIPT_NAME?cat=network">Network</a>
130 <a class="active_games" href="$SCRIPT_NAME?cat=games">Games</a>
131 <a class="active_graphics" href="$SCRIPT_NAME?cat=graphics">Graphics</a>
132 <a class="active_office" href="$SCRIPT_NAME?cat=office">Office</a>
133 <a class="active_multimedia" href="$SCRIPT_NAME?cat=multimedia">Multimedia</a>
134 <a class="active_developement" href="$SCRIPT_NAME?cat=development">Development</a>
135 <a class="active_system-tools" href="$SCRIPT_NAME?cat=system-tools">System tools</a>
136 <a class="active_security" href="$SCRIPT_NAME?cat=security">Security</a>
137 <a class="active_misc" href="$SCRIPT_NAME?cat=misc">Misc</a>
138 <a class="active_meta" href="$SCRIPT_NAME?cat=meta">Meta</a>
139 <a class="active_non-free" href="$SCRIPT_NAME?cat=non-free">Non free</a>
140 </div>
141 EOT
142 }
144 #
145 # Commands
146 #
148 case " $(GET) " in
149 *\ list\ *)
150 #
151 # List installed packages. This is the default because parsing
152 # the full packages.desc can be long and take some resources
153 #
154 cd $INSTALLED
155 search_form
156 sidebar
157 LOADING_MSG="Listing packages..."
158 loading_msg
159 cat << EOT
160 <h2>`gettext "My packages"`</h2>
161 <form method='get' action='$SCRIPT_NAME'>
162 <div id="actions">
163 <div class="float-left">
164 `gettext "Selection:"`
165 <input type="submit" name="do" value="Remove" />
166 </div>
167 <div class="float-right">
168 `gettext "List:"`
169 <input type="submit" name="recharge" value="Recharge" />
170 <input type="submit" name="up" value="Upgrade" />
171 </div>
172 </div>
173 EOT
174 table_start
175 table_head
176 for pkg in *
177 do
178 . $pkg/receipt
179 echo '<tr>'
180 # Use default tazpkg icon since all packages displayed are
181 # installed
182 colorpkg=$pkg
183 grep -qs "^$pkg$" $LOCALSTATE/blocked-packages.list &&
184 colorpkg="<span style='color: red;'>$pkg</span>"
185 echo "<td class='pkg'>
186 <input type='checkbox' name='pkg' value=\"$pkg\" />
187 <a href='$SCRIPT_NAME?info=$pkg'><img
188 src='$IMAGES/tazpkg-installed.png'/>$colorpkg</a></td>"
189 echo "<td>$VERSION</td>"
190 echo "<td class='desc'>$SHORT_DESC</td>"
191 echo "<td><a href='$WEB_SITE'>web</a></td>"
192 echo '</tr>'
193 done
194 table_end
195 echo '</form>' ;;
196 *\ cat\ *)
197 #
198 # List all available packages by category on mirror. Listing all
199 # packages is too resource intensive and not useful.
200 #
201 cd $LOCALSTATE
202 category=$(GET cat)
203 [ "$category" == "cat" ] && category="base-system"
204 search_form
205 sidebar | sed s/"active_${category}"/"active"/
206 LOADING_MSG="Listing packages..."
207 loading_msg
208 cat << EOT
209 <h2>`gettext "Category:"` $category</h2>
210 <form method='get' action='$SCRIPT_NAME'>
211 <div id="actions">
212 <div class="float-left">
213 `gettext "Selection:"`
214 <input type="submit" name="do" value="Install" />
215 <input type="submit" name="do" value="Remove" />
216 </div>
217 <div class="float-right">
218 `gettext "List:"`
219 <input type="submit" name="recharge" value="Recharge" />
220 <input type="submit" name="up" value="Upgrade" />
221 <a class="button" href='$SCRIPT_NAME?list'>
222 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
223 </div>
224 EOT
225 echo '</div>'
226 table_start
227 table_head
228 grep "| $category |" packages.desc | parse_packages_desc
229 table_end
230 echo '</form>' ;;
231 *\ search\ *)
232 #
233 # Search for packages. Here default is to search in packages.desc
234 # and so get result including packages names and descriptions
235 #
236 pkg=$(GET search)
237 cd $LOCALSTATE
238 search_form
239 sidebar
240 LOADING_MSG="Searching packages..."
241 loading_msg
242 cat << EOT
243 <h2>`gettext "Search packages"`</h2>
244 <form method="get" action="$SCRIPT_NAME">
245 <div id="actions">
246 <div class="float-left">
247 `gettext "Selection:"`
248 <input type="submit" name="do" value="Install" />
249 <input type="submit" name="do" value="Remove" />
250 <a href="`cat $PANEL/lib/checkbox.js`">`gettext "Toogle all"`</a>
251 </div>
252 <div class="float-right">
253 `gettext "List:"`
254 <input type="submit" name="recharge" value="Recharge" />
255 <input type="submit" name="up" value="Upgrade" />
256 <a class="button" href='$SCRIPT_NAME?list'>
257 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
258 </div>
259 EOT
260 echo '</div>'
261 table_start
262 if [ "$(GET files)" ]; then
263 cat <<EOT
264 <tr id="thead">
265 <td>`gettext "Package"`</td>
266 <td>`gettext "File"`</td>
267 </tr>
268 $(unlzma -c files.list.lzma | grep -Ei ": .*$(GET search)" | \
269 while read PACKAGE FILE; do
270 PACKAGE=${PACKAGE%:}
271 image=tazpkg-installed.png
272 [ -d $INSTALLED/$PACKAGE ] || image=tazpkg.png
273 echo "<tr>
274 <td><input type='checkbox' name='pkg' value='$PACKAGE'>
275 <a href='$SCRIPT_NAME?info=$PACKAGE'><img src='$IMAGES/$image' />$PACKAGE</a></td>
276 <td>$FILE</td>
277 </tr>"
278 done)
279 EOT
280 else
281 table_head
282 grep -i $pkg packages.desc | parse_packages_desc
283 fi
284 table_end
285 echo '</form>' ;;
286 *\ recharge\ *)
287 #
288 # Let recharge the packages list
289 #
290 search_form
291 sidebar
292 LOADING_MSG="Recharging lists..."
293 loading_msg
294 cat << EOT
295 <h2>`gettext "Recharge"`</h2>
296 <form method='get' action='$SCRIPT_NAME'>
297 <div id="actions">
298 <div class="float-left">
299 <p>
300 `gettext "Recharge checks for new or updated packages"`
301 </p>
302 </div>
303 <div class="float-right">
304 <p>
305 <a class="button" href='$SCRIPT_NAME?up'>
306 `gettext "Check upgrade"`</a>
307 <a class="button" href='$SCRIPT_NAME?list'>
308 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
309 </p>
310 </div>
311 </div>
312 <pre>
313 EOT
314 echo "$(date +%Y%M%d-%H:%M) Recharging packages list" | log
315 tazpkg recharge | filter_tazpkg_msgs
316 cat << EOT
317 </pre>
318 <p>
319 `gettext "Packages lists are up-to-date. You should check for upgrades now."`
320 </p>
321 EOT
322 ;;
323 *\ up\ *)
324 #
325 # Ugrade packages
326 #
327 cd $LOCALSTATE
328 search_form
329 sidebar
330 LOADING_MSG="Checking for upgrades..."
331 loading_msg
332 cat << EOT
333 <h2>`gettext "Up packages"`</h2>
334 <form method="get" action="$SCRIPT_NAME">
335 <div id="actions">
336 <div class="float-left">
337 `gettext "Selection:"`
338 <input type="submit" name="do" value="Install" />
339 <input type="submit" name="do" value="Remove" />
340 <a href="`cat $PANEL/lib/checkbox.js`">`gettext "Toogle all"`</a>
341 </div>
342 <div class="float-right">
343 `gettext "List:"`
344 <input type="submit" name="recharge" value="Recharge" />
345 <a class="button" href='$SCRIPT_NAME?list'>
346 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
347 </div>
348 </div>
349 EOT
350 tazpkg up --check >/dev/null
351 table_start
352 table_head
353 for pkg in `cat packages.up`
354 do
355 grep "^$pkg |" $LOCALSTATE/packages.desc | parse_packages_desc
356 done
357 table_end
358 echo '</form>' ;;
359 *\ do\ *)
360 #
361 # Do an action on one or some packages
362 #
363 opt=""
364 pkgs=""
365 cmdline=`echo ${QUERY_STRING#do=} | sed s'/&/ /g'`
366 cmd=`echo ${cmdline} | awk '{print $1}'`
367 pkgs=`echo $cmdline | sed -e s'/+/ /g' -e s'/pkg=//g' -e s/$cmd//`
368 cmd=`echo $cmd | tr [A-Z] [a-z]`
369 case $cmd in
370 install)
371 cmd=get-install opt=--forced ;;
372 esac
373 search_form
374 sidebar
375 LOADING_MSG="${cmd}ing packages..."
376 loading_msg
377 cat << EOT
378 <h2>Tazpkg: $cmd</h2>
379 <form method="get" action="$SCRIPT_NAME">
380 <div id="actions">
381 <div class="float-left">
382 <p>
383 `gettext "Performing tasks on packages"`
384 </p>
385 </div>
386 <div class="float-right">
387 <p>
388 <a class="button" href='$SCRIPT_NAME?list'>
389 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
390 </p>
391 </div>
392 </div>
393 EOT
394 echo '<div class="box">'
395 gettext "Executing $cmd for:$pkgs"
396 echo '</div>'
397 for pkg in $pkgs
398 do
399 echo '<pre>'
400 echo 'y' | tazpkg $cmd $pkg $opt 2>/dev/null | filter_tazpkg_msgs
401 echo '</pre>'
402 done ;;
403 *\ info\ *)
404 #
405 # Packages info
406 #
407 pkg=$(GET info)
408 search_form
409 sidebar
410 if [ -d $INSTALLED/$pkg ]; then
411 . $INSTALLED/$pkg/receipt
412 files=`cat $INSTALLED/$pkg/files.list | wc -l`
413 action=$(gettext "Remove")
414 else
415 cd $LOCALSTATE
416 LOADING_MSG=$(gettext "Getting package info...")
417 loading_msg
418 IFS='|'
419 set -- $(grep "^$pkg |" packages.desc)
420 unset IFS
421 PACKAGE=$1
422 VERSION="$(echo $2)"
423 SHORT_DESC="$(echo $3)"
424 CATEGORY="$(echo $4)"
425 WEB_SITE="$(echo $5)"
426 action=$(gettext "Install")
427 fi
428 cat << EOT
429 <h2>`gettext "Package"` $PACKAGE</h2>
430 <div id="actions">
431 <div class="float-left">
432 <p>
433 <a class="button" href='$SCRIPT_NAME?do=$action&$pkg'>$action</a>
434 EOT
435 if [ -d $INSTALLED/$pkg ]; then
436 if grep -qs "^$pkg$" $LOCALSTATE/blocked-packages.list; then
437 block=$(gettext "Unblock")
438 else
439 block=$(gettext "Block")
440 fi
441 cat << EOT
442 <a class="button" href='$SCRIPT_NAME?do=$block&$pkg'>$block</a>
443 <a class="button" href='$SCRIPT_NAME?do=Repack&$pkg'>Repack</a>
444 EOT
445 fi
446 cat << EOT
447 </p>
448 </div>
449 <div class="float-right">
450 <p>
451 <a class="button" href='$SCRIPT_NAME?list'>
452 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
453 </p>
454 </div>
455 </div>
456 <pre>
457 Name : $PACKAGE
458 Version : $VERSION
459 Description : $SHORT_DESC
460 Category : $CATEGORY
461 EOT
462 if [ -d $INSTALLED/$pkg ]; then
463 cat << EOT
464 Maintainer : $MAINTAINER
465 Website : <a href="$WEB_SITE">$WEB_SITE</a>
466 Sizes : $PACKED_SIZE/$UNPACKED_SIZE
467 EOT
468 if [ -n "$DEPENDS" ]; then
469 echo -n "Depends : "
470 for i in $DEPENDS; do
471 echo -n "<a href="$SCRIPT_NAME?info=$i">$i</a> "
472 done
473 echo ""
474 fi
475 if [ -n "$SUGGESTED" ]; then
476 echo -n "Suggested : "
477 for i in $SUGGESTED; do
478 echo -n "<a href="$SCRIPT_NAME?info=$i">$i</a> "
479 done
480 echo ""
481 fi
482 [ -n "$TAGS" ] && echo "Tags : $TAGS"
483 cat << EOT
484 </pre>
486 <p>`gettext "Installed files:"` `cat $INSTALLED/$pkg/files.list | wc -l`</p>
487 <pre>
488 `cat $INSTALLED/$pkg/files.list`
489 </pre>
490 EOT
491 else
492 cat << EOT
493 Website : <a href="$WEB_SITE">$WEB_SITE</a>
494 Sizes : `grep -A 3 ^$pkg$ packages.txt | tail -n 1 | sed 's/ *//'`
495 </pre>
497 <p>`gettext "Installed files:"`</p>
498 <pre>
499 `unlzma -c files.list.lzma | sed "/^$pkg: /!d;s/^$pkg: //"`
500 </pre>
501 EOT
502 fi
503 ;;
504 *\ config\ *)
505 #
506 # Tazpkg configuration page
507 #
508 cmd=$(GET config)
509 case "$cmd" in
510 clean)
511 rm -rf /var/cache/tazpkg/* ;;
512 add-mirror)
513 # Decode url
514 mirror=$(GET mirror)
515 case "$mirror" in
516 http://*|ftp://*)
517 echo "$mirror" >> $LOCALSTATE/mirrors ;;
518 esac ;;
519 rm-mirror=http://*|rm-mirror=ftp://*)
520 mirror=${cmd#rm-mirror=}
521 sed -i -e "s@$mirror@@" -e '/^$/d' $LOCALSTATE/mirrors ;;
522 esac
523 cache_files=`find /var/cache/tazpkg -name *.tazpkg | wc -l`
524 cache_size=`du -sh /var/cache/tazpkg`
525 sidebar
526 cat << EOT
527 <h2>`gettext "Configuration"`</h2>
528 <div>
529 <p>`gettext "Tazpkg configuration and settings"`</p>
530 </div>
531 <div>
532 <form method="get" action="$SCRIPT_NAME">
533 <p>
534 `gettext "Packages in the cache:"` $cache_files ($cache_size)
535 <input type="hidden" name="config" value="clean" />
536 <input type="submit" value="Clean" />
537 </p>
538 </form>
539 </div>
541 <h3>`gettext "Current mirror list"`</h3>
542 <div class="box">
543 <ul>
544 `list_mirrors`
545 </ul>
546 </div>
547 <form method="get" action="$SCRIPT_NAME">
548 <p>
549 <input type="hidden" name="config" value="add-mirror" />
550 <input type="text" name="mirror" size="60">
551 <input type="submit" value="Add mirror" />
552 </p>
553 </form>
554 EOT
555 ;;
556 *)
557 #
558 # Default to summary
559 #
560 search_form
561 sidebar
562 PAPY
563 [ -n "$(GET block)" ] && tazpkg block $(GET block)
564 [ -n "$(GET unblock)" ] && tazpkg unblock $(GET unblock)
565 cat << EOT
566 <h2>`gettext "Summary"`</h2>
567 <div id="actions">
568 <a class="button" href='$SCRIPT_NAME?list'>
569 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
570 <a class="button" href='$SCRIPT_NAME?recharge'>
571 <img src="$IMAGES/recharge.png" />`gettext "Recharge list"`</a>
572 <a class="button" href='$SCRIPT_NAME?up'>
573 <img src="$IMAGES/update.png" />`gettext "Check upgrade"`</a>
574 <a class="button" href='$SCRIPT_NAME?config'>
575 <img src="$IMAGES/edit.png" />`gettext "Configuration"`</a>
576 </div>
577 <pre class="pre-main">
578 `packages_summary`
579 </pre>
581 <h3>`gettext "Latest log entries"`</h3>
582 <pre>
583 `tail -n 5 /var/log/tazpkg.log | fgrep "-" | \
584 awk '{print $1, $2, $3, $4, $5, $6, $7}'`
585 </pre>
587 <a name="administration"></a>
588 <h3>`gettext "Administration"`</h3>
589 <div id="actions">
590 <a class="button" href='$SCRIPT_NAME?action=saveconf#administration'>
591 <img src="$IMAGES/tazpkg.png" />`gettext "Save configuration"`</a>
592 <a class="button" href='$SCRIPT_NAME?action=listconf#administration'>
593 <img src="$IMAGES/edit.png" />`gettext "List configuration files"`</a>
594 <a class="button" href='$SCRIPT_NAME?action=quickcheck#administration'>
595 <img src="$IMAGES/recharge.png" />`gettext "Quick check"`</a>
596 <a class="button" href='$SCRIPT_NAME?action=fullcheck#administration'>
597 <img src="$IMAGES/recharge.png" />`gettext "Full check"`</a>
598 </div>
600 EOT
601 case "$(GET action)" in
602 saveconf)
603 echo "<pre>"
604 cd $HOME
605 tazpkg repack-config | sed 's/.\[[^mG]*.//g'
606 ls -l $HOME/config-*.tazpkg
607 echo "</pre>" ;;
608 listconf)
609 echo "<h4>`gettext "Configuration files"`</h4>"
610 echo "<ul>"
611 tazpkg list-config | sed \
612 '/^\//!d;s/.*/<li><a href="index.cgi?file=&">&<\/a><\/li>/'
613 echo "</ul>"
614 echo "</pre>" ;;
615 quickcheck)
616 echo "<pre>"
617 tazpkg check
618 echo "</pre>" ;;
619 fullcheck)
620 echo "<pre>"
621 tazpkg check --full
622 echo "</pre>" ;;
623 esac
624 ;;
625 esac
627 # xHTML 5 footer
628 xhtml_footer
629 exit 0