tazpanel view pkgs.cgi @ rev 62

pkgs.cgi: display uninstalled packages too
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Apr 12 00:03:22 2011 +0200 (2011-04-12)
parents 730f8bcacabc
children 42998f0d7365
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 #
11 echo "Content-Type: text/html"
12 echo ""
14 . lib/libtazpanel
15 get_config
17 # Include gettext helper script.
18 . /usr/bin/gettext.sh
20 # Export package name for gettext.
21 TEXTDOMAIN='tazpanel'
22 export TEXTDOMAIN
24 # xHTML 5 header with special side bar fo categories.
25 TITLE="- Packages"
26 xhtml_header | sed 's/id="content"/id="content-sidebar"/'
27 debug_info
29 # We need packages information for list and search
30 parse_packages_desc() {
31 IFS="|"
32 cut -f 1,2,3,5 -d "|" | while read PACKAGE VERSION SHORT_DESC WEB_SITE
33 do
34 echo '<tr>'
35 if [ -d $INSTALLED/${PACKAGE% } ]; then
36 echo -e "<td><input type='checkbox' name='pkg' value='$PACKAGE'>\n
37 <a href='$SCRIPT_NAME?info=$PACKAGE'>
38 <img src='$IMAGES/tazpkg-installed.png'/>$PACKAGE</a></td>"
39 else
40 echo -e "<td><input type='checkbox' name='pkg' value='$PACKAGE'>\n
41 <a href='$SCRIPT_NAME?info=$PACKAGE'>
42 <img src='$IMAGES/tazpkg.png'/>$PACKAGE</a></td>"
43 fi
44 echo "<td>$VERSION</td>"
45 echo "<td class='desc'>$SHORT_DESC</td>"
46 echo "<td><a href='$WEB_SITE'>web</a></td>"
47 echo '</tr>'
48 done
49 unset IFS
50 }
52 # Remove status and ESC char from tazpkg commands output
53 filter_tazpkg_msgs() {
54 grep ^[a-zA-Z0-9] | sed s'/\.*\]//'
55 }
57 # Display a full summary of packages stats
58 packages_summary() {
59 gettext "Last recharge : "
60 stat=`stat -c %y $LOCALSTATE/packages.list | \
61 sed 's/\(:..\):.*/\1/' | awk '{print $1}'`
62 mtime=`find /var/lib/tazpkg/packages.list -mtime +10`
63 echo -n "$stat "
64 if [ "$mtime" ]; then
65 echo "(Older than 10 days)"
66 else
67 echo "(Not older than 10 days)"
68 fi
69 gettext "Installed packages : "
70 ls $INSTALLED | wc -l
71 gettext "Mirrored packages : "
72 cat $LOCALSTATE/packages.list | wc -l
73 gettext "Upgradeable packages : "
74 cat $LOCALSTATE/packages.up | wc -l
75 #gettext "Installed files : "
76 #cat $INSTALLED/*/files.list | wc -l
77 gettext "Blocked packages : "
78 cat $LOCALSTATE/blocked-packages.list | wc -l
79 }
81 # Parse mirrors list to be able to have an icon an remove link
82 list_mirrors() {
83 cat $LOCALSTATE/mirrors | while read line
84 do
85 cat << EOT
86 <li><a href="$SCRIPT_NAME?config=rm-mirror=$line"><img
87 src="$IMAGES/clear.png" /></a><a href="$line">$line</a></li>
88 EOT
89 done
90 }
92 #
93 # xHTML functions
94 #
96 # ENTER will search but user may search for a button, so put one.
97 search_form() {
98 cat << EOT
99 <div class="search">
100 <form method="get" action="$SCRIPT_NAME">
101 <p>
102 <input type="text" name="search" size="20">
103 <input type="submit" value="`gettext "Search"`">
104 </p>
105 </form>
106 </div>
107 EOT
108 }
110 table_head() {
111 cat << EOT
112 <tr id="thead">
113 <td>`gettext "Name"`</td>
114 <td>`gettext "Version"`</td>
115 <td>`gettext "Description"`</td>
116 <td>`gettext "Web"`</td>
117 </tr>
118 EOT
119 }
121 sidebar() {
122 cat << EOT
123 <div id="sidebar">
124 <h4>Categories</h4>
125 <a class="active_base-system" href="$SCRIPT_NAME?cat=base-system">Base-system</a>
126 <a class="active_x-window" href="$SCRIPT_NAME?cat=x-window">X window</a>
127 <a class="active_utilities" href="$SCRIPT_NAME?cat=utilities">Utilities</a>
128 <a class="active_network" href="$SCRIPT_NAME?cat=network">Network</a>
129 <a class="active_games" href="$SCRIPT_NAME?cat=games">Games</a>
130 <a class="active_graphics" href="$SCRIPT_NAME?cat=graphics">Graphics</a>
131 <a class="active_office" href="$SCRIPT_NAME?cat=office">Office</a>
132 <a class="active_multimedia" href="$SCRIPT_NAME?cat=multimedia">Multimedia</a>
133 <a class="active_developement" href="$SCRIPT_NAME?cat=development">Development</a>
134 <a class="active_system-tools" href="$SCRIPT_NAME?cat=system-tools">System tools</a>
135 <a class="active_security" href="$SCRIPT_NAME?cat=security">Security</a>
136 <a class="active_misc" href="$SCRIPT_NAME?cat=misc">Misc</a>
137 <a class="active_meta" href="$SCRIPT_NAME?cat=meta">Meta</a>
138 <a class="active_non-free" href="$SCRIPT_NAME?cat=non-free">Non free</a>
139 </div>
140 EOT
141 }
143 #
144 # Commands
145 #
147 case "$QUERY_STRING" in
148 list*)
149 #
150 # List installed packages. This is the default because parsing
151 # the full packages.desc can be long and take some resources
152 #
153 cd $INSTALLED
154 search_form
155 sidebar
156 LOADING_MSG="Listing packages..."
157 loading_msg
158 cat << EOT
159 <h2>`gettext "My packages"`</h2>
160 <form method='get' action='$SCRIPT_NAME'>
161 <div id="actions">
162 <div class="float-left">
163 `gettext "Selection:"`
164 <input type="submit" name="do" value="Remove" />
165 </div>
166 <div class="float-right">
167 `gettext "List:"`
168 <input type="submit" name="recharge" value="Recharge" />
169 <input type="submit" name="up" value="Upgrade" />
170 </div>
171 </div>
172 EOT
173 table_start
174 table_head
175 for pkg in *
176 do
177 . $pkg/receipt
178 echo '<tr>'
179 # Use default tazpkg icon since all packages displayed are
180 # installed
181 echo "<td class='pkg'>
182 <input type='checkbox' name='pkg' value=\"$pkg\" />
183 <a href='$SCRIPT_NAME?info=$pkg'><img
184 src='$IMAGES/tazpkg-installed.png'/>$pkg</a></td>"
185 echo "<td>$VERSION</td>"
186 echo "<td class='desc'>$SHORT_DESC</td>"
187 echo "<td><a href='$WEB_SITE'>web</a></td>"
188 echo '</tr>'
189 done
190 table_end
191 echo '</form>' ;;
192 cat*)
193 #
194 # List all available packages by category on mirror. Listing all
195 # packages is too resource intensive and not useful.
196 #
197 cd $LOCALSTATE
198 category=${QUERY_STRING#cat=}
199 [ "${QUERY_STRING}" == "cat" ] && category="base-system"
200 search_form
201 sidebar | sed s/"active_${category}"/"active"/
202 LOADING_MSG="Listing packages..."
203 loading_msg
204 cat << EOT
205 <h2>`gettext "Category:"` $category</h2>
206 <form method='get' action='$SCRIPT_NAME'>
207 <div id="actions">
208 <div class="float-left">
209 `gettext "Selection:"`
210 <input type="submit" name="do" value="Install" />
211 <input type="submit" name="do" value="Remove" />
212 </div>
213 <div class="float-right">
214 `gettext "List:"`
215 <input type="submit" name="recharge" value="Recharge" />
216 <input type="submit" name="up" value="Upgrade" />
217 <a class="button" href='$SCRIPT_NAME?list'>
218 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
219 </div>
220 EOT
221 echo '</div>'
222 table_start
223 table_head
224 grep "| $category |" packages.desc | parse_packages_desc
225 table_end
226 echo '</form>' ;;
227 search=*)
228 #
229 # Search for packages
230 #
231 pkg=${QUERY_STRING#*=}
232 cd $LOCALSTATE
233 search_form
234 sidebar
235 LOADING_MSG="Searching packages..."
236 loading_msg
237 cat << EOT
238 <h2>`gettext "Search packages"`</h2>
239 <form method="get" action="$SCRIPT_NAME">
240 <div id="actions">
241 <div class="float-left">
242 `gettext "Selection:"`
243 <input type="submit" name="do" value="Install" />
244 <input type="submit" name="do" value="Remove" />
245 <a href="`cat $PANEL/lib/checkbox.js`">`gettext "Toogle all"`</a>
246 </div>
247 <div class="float-right">
248 `gettext "List:"`
249 <input type="submit" name="recharge" value="Recharge" />
250 <input type="submit" name="up" value="Upgrade" />
251 <a class="button" href='$SCRIPT_NAME?list'>
252 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
253 </div>
254 EOT
255 echo '</div>'
256 table_start
257 table_head
258 grep $pkg packages.desc | parse_packages_desc
259 table_end
260 echo '</form>' ;;
261 recharge*)
262 #
263 # Let recharge the packages list
264 #
265 search_form
266 sidebar
267 LOADING_MSG="Recharging lists..."
268 loading_msg
269 cat << EOT
270 <h2>`gettext "Recharge"`</h2>
271 <form method='get' action='$SCRIPT_NAME'>
272 <div id="actions">
273 <div class="float-left">
274 <p>
275 `gettext "Recharge checks for new or updated packages"`
276 </p>
277 </div>
278 <div class="float-right">
279 <p>
280 <a class="button" href='$SCRIPT_NAME?up'>
281 `gettext "Check upgrade"`</a>
282 <a class="button" href='$SCRIPT_NAME?list'>
283 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
284 </p>
285 </div>
286 </div>
287 <pre>
288 EOT
289 tazpkg recharge | filter_tazpkg_msgs
290 cat << EOT
291 </pre>
292 <p>
293 `gettext "Packages lists are up-to-date. You should check for upgrades now."`
294 </p>
295 EOT
296 ;;
297 up*)
298 #
299 # Ugrade packages
300 #
301 cd $LOCALSTATE
302 search_form
303 sidebar
304 LOADING_MSG="Checking for upgrades..."
305 loading_msg
306 cat << EOT
307 <h2>`gettext "Up packages"`</h2>
308 <form method="get" action="$SCRIPT_NAME">
309 <div id="actions">
310 <div class="float-left">
311 `gettext "Selection:"`
312 <input type="submit" name="do" value="Install" />
313 <input type="submit" name="do" value="Remove" />
314 <a href="`cat $PANEL/lib/checkbox.js`">`gettext "Toogle all"`</a>
315 </div>
316 <div class="float-right">
317 `gettext "List:"`
318 <input type="submit" name="recharge" value="Recharge" />
319 <a class="button" href='$SCRIPT_NAME?list'>
320 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
321 </div>
322 </div>
323 EOT
324 tazpkg up --check >/dev/null
325 table_start
326 table_head
327 for pkg in `cat packages.up`
328 do
329 grep "^$pkg |" $LOCALSTATE/packages.desc | parse_packages_desc
330 done
331 table_end
332 echo '</form>' ;;
333 do=*)
334 #
335 # Do an action on one or some packages
336 #
337 cmdline=`echo ${QUERY_STRING#do=} | sed s'/&/ /g'`
338 cmd=`echo ${cmdline} | awk '{print $1}'`
339 pkgs=`echo $cmdline | sed -e s'/+/ /g' -e s'/pkg=//g' -e s/$cmd//`
340 case $cmd in
341 install|Install)
342 cmd=get-install opt=--forced ;;
343 remove|Remove)
344 cmd=remove ;;
345 esac
346 search_form
347 sidebar
348 LOADING_MSG="${cmd}ing packages..."
349 loading_msg
350 cat << EOT
351 <h2>Tazpkg: $cmd</h2>
352 <form method="get" action="$SCRIPT_NAME">
353 <div id="actions">
354 <div class="float-left">
355 <p>
356 `gettext "Performing tasks on packages"`
357 </p>
358 </div>
359 <div class="float-right">
360 <p>
361 <a class="button" href='$SCRIPT_NAME?list'>
362 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
363 </p>
364 </div>
365 </div>
366 EOT
367 echo '<div class="box">'
368 gettext "Executing $cmd for:$pkgs"
369 echo '</div>'
370 for pkg in $pkgs
371 do
372 echo '<pre>'
373 echo 'o' | tazpkg $cmd $pkg $opt 2>/dev/null | filter_tazpkg_msgs
374 echo '</pre>'
375 done ;;
376 info=*)
377 #
378 # Packages info
379 #
380 pkg=${QUERY_STRING#*=}
381 search_form
382 sidebar
383 if [ -d $INSTALLED/$pkg ]; then
384 . $INSTALLED/$pkg/receipt
385 files=`cat $INSTALLED/$pkg/files.list | wc -l`
386 action=Remove
387 else
388 cd $LOCALSTATE
389 IFS='|'
390 set -- $(grep "^$pkg |" packages.desc)
391 unset IFS
392 PACKAGE=$1
393 VERSION="$(echo $2)"
394 SHORT_DESC="$(echo $3)"
395 CATEGORY="$(echo $4)"
396 WEB_SITE="$(echo $5)"
397 action=Install
398 fi
399 cat << EOT
400 <h2>`gettext "Package"` $PACKAGE</h2>
401 <div id="actions">
402 <div class="float-left">
403 <p>
404 <a class="button" href='$SCRIPT_NAME?do=$action&$pkg'>`gettext "$action"`</a>
405 </p>
406 </div>
407 <div class="float-right">
408 <p>
409 <a class="button" href='$SCRIPT_NAME?list'>
410 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
411 </p>
412 </div>
413 </div>
414 <pre>
415 Name : $PACKAGE
416 Version : $VERSION
417 Description : $SHORT_DESC
418 Category : $CATEGORY
419 EOT
420 if [ -d $INSTALLED/$pkg ]; then
421 cat << EOT
422 Maintainer : $MAINTAINER
423 Depends : `for i in $DEPENDS; do echo -n \
424 "<a href="$SCRIPT_NAME?info=$i">$i</a> "; done`
425 Website : <a href="$WEB_SITE">$WEB_SITE</a>
426 Sizes : $PACKED_SIZE/$UNPACKED_SIZE
427 </pre>
429 <p>`gettext "Installed files:"` `cat $INSTALLED/$pkg/files.list | wc -l`</p>
430 <pre>
431 `cat $INSTALLED/$pkg/files.list`
432 </pre>
433 EOT
434 else
435 cat << EOT
436 Website : <a href="$WEB_SITE">$WEB_SITE</a>
437 Sizes : `grep -A 3 ^$pkg$ packages.txt | tail -n 1 | sed 's/ *//'`
438 </pre>
440 <p>`gettext "Installed files:"`</p>
441 <pre>
442 `unlzma -c files.list.lzma | sed "/^$pkg: /!d;s/^$pkg: //"`
443 </pre>
444 EOT
445 fi
446 ;;
447 config*)
448 #
449 # Tazpkg configuration page
450 #
451 cmd=${QUERY_STRING#*=}
452 case "$cmd" in
453 clean)
454 rm -rf /var/cache/tazpkg/* ;;
455 add-mirror*=http*|add-mirror*=ftp*)
456 # Decode url
457 mirror=`httpd -d ${cmd#*=}`
458 echo "$mirror" >> $LOCALSTATE/mirrors ;;
459 rm-mirror=http://*|rm-mirror=ftp://*)
460 mirror=${QUERY_STRING#*=rm-mirror=}
461 sed -i -e "s@$mirror@@" -e '/^$/d' $LOCALSTATE/mirrors ;;
462 esac
463 cache_files=`find /var/cache/tazpkg -name *.tazpkg | wc -l`
464 cache_size=`du -sh /var/cache/tazpkg`
465 sidebar
466 cat << EOT
467 <h2>`gettext "Configuration"`</h2>
468 <div>
469 <p>`gettext "Tazpkg configuration and settings"`</p>
470 </div>
471 <div>
472 <form method="get" action="$SCRIPT_NAME">
473 <p>
474 `gettext "Packages in the cache:"` $cache_files ($cache_size)
475 <input type="hidden" name="config" value="clean" />
476 <input type="submit" value="Clean" />
477 </p>
478 </form>
479 </div>
481 <h3>`gettext "Current mirror list"`</h3>
482 <div class="box">
483 <ul>
484 `list_mirrors`
485 </ul>
486 </div>
487 <form method="get" action="$SCRIPT_NAME">
488 <p>
489 <input type="hidden" name="config" value="add-mirror" />
490 <input type="text" name="mirror" size="60">
491 <input type="submit" value="Add mirror" />
492 </p>
493 </form>
494 EOT
495 ;;
496 *)
497 #
498 # Default to summary
499 #
500 search_form
501 sidebar
502 cat << EOT
503 <h2>`gettext "Summary"`</h2>
504 <div id="actions">
505 <a class="button" href='$SCRIPT_NAME?list'>
506 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
507 <a class="button" href='$SCRIPT_NAME?recharge'>
508 <img src="$IMAGES/recharge.png" />`gettext "Recharge list"`</a>
509 <a class="button" href='$SCRIPT_NAME?up'>
510 <img src="$IMAGES/update.png" />`gettext "Check upgrade"`</a>
511 <a class="button" href='$SCRIPT_NAME?config'>
512 <img src="$IMAGES/edit.png" />`gettext "Configuration"`</a>
513 </div>
514 <pre class="pre-main">
515 `packages_summary`
516 </pre>
518 <h3>`gettext "Latest log entries"`</h3>
519 <pre>
520 `tail -n 5 /var/log/tazpkg.log | fgrep "-" | \
521 awk '{print $1, $2, $3, $4, $5, $6, $7}'`
522 </pre>
524 EOT
525 ;;
526 esac
528 # xHTML 5 footer
529 xhtml_footer
530 exit 0