tazpanel view pkgs.cgi @ rev 98

network.cgi: Start improving it and adding features, also tiny fix to pkgs.cgo for clean-cache
author Christophe Lincoln <pankso@slitaz.org>
date Thu Apr 14 20:39:50 2011 +0200 (2011-04-14)
parents 3f39825387bb
children 1f6667794d15
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 <a class="active_all" href="$SCRIPT_NAME?cat=all">All</a>
141 </div>
142 EOT
143 }
145 #
146 # Commands
147 #
149 case " $(GET) " in
150 *\ list\ *)
151 #
152 # List installed packages. This is the default because parsing
153 # the full packages.desc can be long and take some resources
154 #
155 cd $INSTALLED
156 search_form
157 sidebar
158 LOADING_MSG="Listing packages..."
159 loading_msg
160 cat << EOT
161 <h2>`gettext "My packages"`</h2>
162 <form method='get' action='$SCRIPT_NAME'>
163 <div id="actions">
164 <div class="float-left">
165 `gettext "Selection:"`
166 <input type="submit" name="do" value="Remove" />
167 </div>
168 <div class="float-right">
169 `gettext "List:"`
170 <input type="submit" name="recharge" value="Recharge" />
171 <input type="submit" name="up" value="Upgrade" />
172 </div>
173 </div>
174 EOT
175 table_start
176 table_head
177 for pkg in *
178 do
179 . $pkg/receipt
180 echo '<tr>'
181 # Use default tazpkg icon since all packages displayed are
182 # installed
183 colorpkg=$pkg
184 grep -qs "^$pkg$" $LOCALSTATE/blocked-packages.list &&
185 colorpkg="<span style='color: red;'>$pkg</span>"
186 echo "<td class='pkg'>
187 <input type='checkbox' name='pkg' value=\"$pkg\" />
188 <a href='$SCRIPT_NAME?info=$pkg'><img
189 src='$IMAGES/tazpkg-installed.png'/>$colorpkg</a></td>"
190 echo "<td>$VERSION</td>"
191 echo "<td class='desc'>$SHORT_DESC</td>"
192 echo "<td><a href='$WEB_SITE'>web</a></td>"
193 echo '</tr>'
194 done
195 table_end
196 echo '</form>' ;;
197 *\ cat\ *)
198 #
199 # List all available packages by category on mirror. Listing all
200 # packages is too resource intensive and not useful.
201 #
202 cd $LOCALSTATE
203 category=$(GET cat)
204 [ "$category" == "cat" ] && category="base-system"
205 grep_category=$category
206 [ "$grep_category" == "all" ] && grep_category=".*"
207 search_form
208 sidebar | sed s/"active_${category}"/"active"/
209 LOADING_MSG="Listing packages..."
210 loading_msg
211 cat << EOT
212 <h2>`gettext "Category:"` $category</h2>
213 <form method='get' action='$SCRIPT_NAME'>
214 <div id="actions">
215 <div class="float-left">
216 `gettext "Selection:"`
217 <input type="submit" name="do" value="Install" />
218 <input type="submit" name="do" value="Remove" />
219 </div>
220 <div class="float-right">
221 `gettext "List:"`
222 <input type="submit" name="recharge" value="Recharge" />
223 <input type="submit" name="up" value="Upgrade" />
224 <a class="button" href='$SCRIPT_NAME?list'>
225 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
226 </div>
227 EOT
228 echo '</div>'
229 table_start
230 table_head
231 grep "| $grep_category |" packages.desc | parse_packages_desc
232 table_end
233 echo '</form>' ;;
234 *\ search\ *)
235 #
236 # Search for packages. Here default is to search in packages.desc
237 # and so get result including packages names and descriptions
238 #
239 pkg=$(GET search)
240 cd $LOCALSTATE
241 search_form
242 sidebar
243 LOADING_MSG="Searching packages..."
244 loading_msg
245 cat << EOT
246 <h2>`gettext "Search packages"`</h2>
247 <form method="get" action="$SCRIPT_NAME">
248 <div id="actions">
249 <div class="float-left">
250 `gettext "Selection:"`
251 <input type="submit" name="do" value="Install" />
252 <input type="submit" name="do" value="Remove" />
253 <a href="`cat $PANEL/lib/checkbox.js`">`gettext "Toogle all"`</a>
254 </div>
255 <div class="float-right">
256 `gettext "List:"`
257 <input type="submit" name="recharge" value="Recharge" />
258 <input type="submit" name="up" value="Upgrade" />
259 <a class="button" href='$SCRIPT_NAME?list'>
260 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
261 </div>
262 EOT
263 echo '</div>'
264 table_start
265 if [ "$(GET files)" ]; then
266 cat <<EOT
267 <tr id="thead">
268 <td>`gettext "Package"`</td>
269 <td>`gettext "File"`</td>
270 </tr>
271 $(unlzma -c files.list.lzma | grep -Ei ": .*$(GET search)" | \
272 while read PACKAGE FILE; do
273 PACKAGE=${PACKAGE%:}
274 image=tazpkg-installed.png
275 [ -d $INSTALLED/$PACKAGE ] || image=tazpkg.png
276 echo "<tr>
277 <td><input type='checkbox' name='pkg' value='$PACKAGE'>
278 <a href='$SCRIPT_NAME?info=$PACKAGE'><img src='$IMAGES/$image' />$PACKAGE</a></td>
279 <td>$FILE</td>
280 </tr>"
281 done)
282 EOT
283 else
284 table_head
285 grep -i $pkg packages.desc | parse_packages_desc
286 fi
287 table_end
288 echo '</form>' ;;
289 *\ recharge\ *)
290 #
291 # Let recharge the packages list
292 #
293 search_form
294 sidebar
295 LOADING_MSG="Recharging lists..."
296 loading_msg
297 cat << EOT
298 <h2>`gettext "Recharge"`</h2>
299 <form method='get' action='$SCRIPT_NAME'>
300 <div id="actions">
301 <div class="float-left">
302 <p>
303 `gettext "Recharge checks for new or updated packages"`
304 </p>
305 </div>
306 <div class="float-right">
307 <p>
308 <a class="button" href='$SCRIPT_NAME?up'>
309 `gettext "Check upgrade"`</a>
310 <a class="button" href='$SCRIPT_NAME?list'>
311 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
312 </p>
313 </div>
314 </div>
315 <pre>
316 EOT
317 gettext "Recharging packages list" | log
318 tazpkg recharge | filter_tazpkg_msgs
319 cat << EOT
320 </pre>
321 <p>
322 `gettext "Packages lists are up-to-date. You should check for upgrades now."`
323 </p>
324 EOT
325 ;;
326 *\ up\ *)
327 #
328 # Ugrade packages
329 #
330 cd $LOCALSTATE
331 search_form
332 sidebar
333 LOADING_MSG="Checking for upgrades..."
334 loading_msg
335 cat << EOT
336 <h2>`gettext "Up packages"`</h2>
337 <form method="get" action="$SCRIPT_NAME">
338 <div id="actions">
339 <div class="float-left">
340 `gettext "Selection:"`
341 <input type="submit" name="do" value="Install" />
342 <input type="submit" name="do" value="Remove" />
343 <a href="`cat $PANEL/lib/checkbox.js`">`gettext "Toogle all"`</a>
344 </div>
345 <div class="float-right">
346 `gettext "List:"`
347 <input type="submit" name="recharge" value="Recharge" />
348 <a class="button" href='$SCRIPT_NAME?list'>
349 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
350 </div>
351 </div>
352 EOT
353 tazpkg up --check >/dev/null
354 table_start
355 table_head
356 for pkg in `cat packages.up`
357 do
358 grep "^$pkg |" $LOCALSTATE/packages.desc | parse_packages_desc
359 done
360 table_end
361 echo '</form>' ;;
362 *\ do\ *)
363 #
364 # Do an action on one or some packages
365 #
366 opt=""
367 pkgs=""
368 cmdline=`echo ${QUERY_STRING#do=} | sed s'/&/ /g'`
369 cmd=`echo ${cmdline} | awk '{print $1}'`
370 pkgs=`echo $cmdline | sed -e s'/+/ /g' -e s'/pkg=//g' -e s/$cmd//`
371 cmd=`echo $cmd | tr [A-Z] [a-z]`
372 case $cmd in
373 install)
374 cmd=get-install opt=--forced ;;
375 esac
376 search_form
377 sidebar
378 LOADING_MSG="${cmd}ing packages..."
379 loading_msg
380 cat << EOT
381 <h2>Tazpkg: $cmd</h2>
382 <form method="get" action="$SCRIPT_NAME">
383 <div id="actions">
384 <div class="float-left">
385 <p>
386 `gettext "Performing tasks on packages"`
387 </p>
388 </div>
389 <div class="float-right">
390 <p>
391 <a class="button" href='$SCRIPT_NAME?list'>
392 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
393 </p>
394 </div>
395 </div>
396 EOT
397 echo '<div class="box">'
398 gettext "Executing $cmd for:$pkgs"
399 echo '</div>'
400 for pkg in $pkgs
401 do
402 echo '<pre>'
403 echo 'y' | tazpkg $cmd $pkg $opt 2>/dev/null | filter_tazpkg_msgs
404 echo '</pre>'
405 done ;;
406 *\ info\ *)
407 #
408 # Packages info
409 #
410 pkg=$(GET info)
411 search_form
412 sidebar
413 if [ -d $INSTALLED/$pkg ]; then
414 . $INSTALLED/$pkg/receipt
415 files=`cat $INSTALLED/$pkg/files.list | wc -l`
416 action=$(gettext "Remove")
417 else
418 cd $LOCALSTATE
419 LOADING_MSG=$(gettext "Getting package info...")
420 loading_msg
421 IFS='|'
422 set -- $(grep "^$pkg |" packages.desc)
423 unset IFS
424 PACKAGE=$1
425 VERSION="$(echo $2)"
426 SHORT_DESC="$(echo $3)"
427 CATEGORY="$(echo $4)"
428 WEB_SITE="$(echo $5)"
429 action=$(gettext "Install")
430 fi
431 cat << EOT
432 <h2>`gettext "Package"` $PACKAGE</h2>
433 <div id="actions">
434 <div class="float-left">
435 <p>
436 <a class="button" href='$SCRIPT_NAME?do=$action&$pkg'>$action</a>
437 EOT
438 if [ -d $INSTALLED/$pkg ]; then
439 if grep -qs "^$pkg$" $LOCALSTATE/blocked-packages.list; then
440 block=$(gettext "Unblock")
441 else
442 block=$(gettext "Block")
443 fi
444 cat << EOT
445 <a class="button" href='$SCRIPT_NAME?do=$block&$pkg'>$block</a>
446 <a class="button" href='$SCRIPT_NAME?do=Repack&$pkg'>Repack</a>
447 EOT
448 fi
449 cat << EOT
450 </p>
451 </div>
452 <div class="float-right">
453 <p>
454 <a class="button" href='$SCRIPT_NAME?list'>
455 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
456 </p>
457 </div>
458 </div>
459 <pre>
460 Name : $PACKAGE
461 Version : $VERSION
462 Description : $SHORT_DESC
463 Category : $CATEGORY
464 EOT
465 if [ -d $INSTALLED/$pkg ]; then
466 cat << EOT
467 Maintainer : $MAINTAINER
468 Website : <a href="$WEB_SITE">$WEB_SITE</a>
469 Sizes : $PACKED_SIZE/$UNPACKED_SIZE
470 EOT
471 if [ -n "$DEPENDS" ]; then
472 echo -n "Depends : "
473 for i in $DEPENDS; do
474 echo -n "<a href="$SCRIPT_NAME?info=$i">$i</a> "
475 done
476 echo ""
477 fi
478 if [ -n "$SUGGESTED" ]; then
479 echo -n "Suggested : "
480 for i in $SUGGESTED; do
481 echo -n "<a href="$SCRIPT_NAME?info=$i">$i</a> "
482 done
483 echo ""
484 fi
485 [ -n "$TAGS" ] && echo "Tags : $TAGS"
486 cat << EOT
487 </pre>
489 <p>`gettext "Installed files:"` `cat $INSTALLED/$pkg/files.list | wc -l`</p>
490 <pre>
491 `cat $INSTALLED/$pkg/files.list`
492 </pre>
493 EOT
494 else
495 cat << EOT
496 Website : <a href="$WEB_SITE">$WEB_SITE</a>
497 Sizes : `grep -A 3 ^$pkg$ packages.txt | tail -n 1 | sed 's/ *//'`
498 </pre>
500 <p>`gettext "Installed files:"`</p>
501 <pre>
502 `unlzma -c files.list.lzma | sed "/^$pkg: /!d;s/^$pkg: //"`
503 </pre>
504 EOT
505 fi
506 ;;
507 *\ admin\ * )
508 #
509 # Tazpkg configuration page
510 #
511 cmd=$(GET admin)
512 case "$cmd" in
513 clean)
514 rm -rf /var/cache/tazpkg/* ;;
515 add-mirror)
516 # Decode url
517 mirror=$(GET mirror)
518 case "$mirror" in
519 http://*|ftp://*)
520 echo "$mirror" >> $LOCALSTATE/mirrors ;;
521 esac ;;
522 rm-mirror=http://*|rm-mirror=ftp://*)
523 mirror=${cmd#rm-mirror=}
524 sed -i -e "s@$mirror@@" -e '/^$/d' $LOCALSTATE/mirrors ;;
525 esac
526 cache_files=`find /var/cache/tazpkg -name *.tazpkg | wc -l`
527 cache_size=`du -sh /var/cache/tazpkg`
528 sidebar
529 cat << EOT
530 <h2>$(gettext "Administration")</h2>
531 <div>
532 <p>$(gettext "Tazpkg administration and settings")</p>
533 </div>
534 <div id="actions">
535 <a class="button" href='$SCRIPT_NAME?admin=&action=saveconf'>
536 <img src="$IMAGES/tazpkg.png" />`gettext "Save configuration"`</a>
537 <a class="button" href='$SCRIPT_NAME?admin=&action=listconf'>
538 <img src="$IMAGES/edit.png" />`gettext "List configuration files"`</a>
539 <a class="button" href='$SCRIPT_NAME?admin=&action=quickcheck'>
540 <img src="$IMAGES/recharge.png" />`gettext "Quick check"`</a>
541 <a class="button" href='$SCRIPT_NAME?admin=&action=fullcheck'>
542 <img src="$IMAGES/recharge.png" />`gettext "Full check"`</a>
543 </div>
544 EOT
545 case "$(GET action)" in
546 saveconf)
547 LOADING_MSG=$(gettext "Creating the package...")
548 loading_msg
549 echo "<pre>"
550 cd $HOME
551 tazpkg repack-config | filter_tazpkg_msgs
552 gettext "Path : " && ls $HOME/config-*.tazpkg
553 echo "</pre>" ;;
554 listconf)
555 echo "<h4>`gettext "Configuration files"`</h4>"
556 echo "<ul>"
557 tazpkg list-config | sed \
558 '/^\//!d;s/.*/<li><a href="index.cgi?file=&">&<\/a><\/li>/'
559 echo "</ul>"
560 echo "</pre>" ;;
561 quickcheck)
562 LOADING_MSG=$(gettext "Checking packages consitency...")
563 loading_msg
564 echo "<pre>"
565 tazpkg check
566 echo "</pre>" ;;
567 fullcheck)
568 LOADING_MSG=$(gettext "Full packages check...")
569 loading_msg
570 echo "<pre>"
571 tazpkg check --full
572 echo "</pre>" ;;
573 esac
574 cat << EOT
575 <h3>$(gettext "Packages cache")</h3>
576 <div>
577 <form method="get" action="$SCRIPT_NAME">
578 <p>
579 `gettext "Packages in the cache:"` $cache_files ($cache_size)
580 <input type="hidden" name="admin" value="clean" />
581 <input type="submit" value="Clean" />
582 </p>
583 </form>
584 </div>
586 <h3>`gettext "Current mirror list"`</h3>
587 <div class="box">
588 <ul>
589 `list_mirrors`
590 </ul>
591 </div>
592 <form method="get" action="$SCRIPT_NAME">
593 <p>
594 <input type="hidden" name="config" value="add-mirror" />
595 <input type="text" name="mirror" size="60">
596 <input type="submit" value="Add mirror" />
597 </p>
598 </form>
599 EOT
600 ;;
601 *)
602 #
603 # Default to summary
604 #
605 search_form
606 sidebar
607 PAPY
608 [ -n "$(GET block)" ] && tazpkg block $(GET block)
609 [ -n "$(GET unblock)" ] && tazpkg unblock $(GET unblock)
610 cat << EOT
611 <h2>`gettext "Summary"`</h2>
612 <div id="actions">
613 <a class="button" href='$SCRIPT_NAME?list'>
614 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
615 <a class="button" href='$SCRIPT_NAME?recharge'>
616 <img src="$IMAGES/recharge.png" />`gettext "Recharge list"`</a>
617 <a class="button" href='$SCRIPT_NAME?up'>
618 <img src="$IMAGES/update.png" />`gettext "Check upgrade"`</a>
619 <a class="button" href='$SCRIPT_NAME?admin'>
620 <img src="$IMAGES/edit.png" />`gettext "Administration"`</a>
621 </div>
622 <pre class="pre-main">
623 `packages_summary`
624 </pre>
626 <h3>`gettext "Latest log entries"`</h3>
627 <pre>
628 `tail -n 5 /var/log/tazpkg.log | fgrep "-" | \
629 awk '{print $1, $2, $3, $4, $5, $6, $7}'`
630 </pre>
631 EOT
632 ;;
633 esac
635 # xHTML 5 footer
636 xhtml_footer
637 exit 0