tazpanel view pkgs.cgi @ rev 80

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