tazpanel view pkgs.cgi @ rev 76

Show Panel activity and log a few more things to test (we need date in log() and reverse output on main page)
author Christophe Lincoln <pankso@slitaz.org>
date Tue Apr 12 04:24:35 2011 +0200 (2011-04-12)
parents 95dc2475f4ae
children da62992292be
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"/'
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. Here default is to search in packages.desc
230 # and so get result including packages names and descriptions
231 #
232 pkg=${QUERY_STRING#*=}
233 cd $LOCALSTATE
234 search_form
235 sidebar
236 LOADING_MSG="Searching packages..."
237 loading_msg
238 cat << EOT
239 <h2>`gettext "Search packages"`</h2>
240 <form method="get" action="$SCRIPT_NAME">
241 <div id="actions">
242 <div class="float-left">
243 `gettext "Selection:"`
244 <input type="submit" name="do" value="Install" />
245 <input type="submit" name="do" value="Remove" />
246 <a href="`cat $PANEL/lib/checkbox.js`">`gettext "Toogle all"`</a>
247 </div>
248 <div class="float-right">
249 `gettext "List:"`
250 <input type="submit" name="recharge" value="Recharge" />
251 <input type="submit" name="up" value="Upgrade" />
252 <a class="button" href='$SCRIPT_NAME?list'>
253 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
254 </div>
255 EOT
256 echo '</div>'
257 table_start
258 table_head
259 grep -i $pkg packages.desc | parse_packages_desc
260 table_end
261 echo '</form>' ;;
262 recharge*)
263 #
264 # Let recharge the packages list
265 #
266 search_form
267 sidebar
268 LOADING_MSG="Recharging lists..."
269 loading_msg
270 cat << EOT
271 <h2>`gettext "Recharge"`</h2>
272 <form method='get' action='$SCRIPT_NAME'>
273 <div id="actions">
274 <div class="float-left">
275 <p>
276 `gettext "Recharge checks for new or updated packages"`
277 </p>
278 </div>
279 <div class="float-right">
280 <p>
281 <a class="button" href='$SCRIPT_NAME?up'>
282 `gettext "Check upgrade"`</a>
283 <a class="button" href='$SCRIPT_NAME?list'>
284 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
285 </p>
286 </div>
287 </div>
288 <pre>
289 EOT
290 echo "$(date +%Y%M%d-%H:%M) Recharging packages list" | log
291 tazpkg recharge | filter_tazpkg_msgs
292 cat << EOT
293 </pre>
294 <p>
295 `gettext "Packages lists are up-to-date. You should check for upgrades now."`
296 </p>
297 EOT
298 ;;
299 up*)
300 #
301 # Ugrade packages
302 #
303 cd $LOCALSTATE
304 search_form
305 sidebar
306 LOADING_MSG="Checking for upgrades..."
307 loading_msg
308 cat << EOT
309 <h2>`gettext "Up packages"`</h2>
310 <form method="get" action="$SCRIPT_NAME">
311 <div id="actions">
312 <div class="float-left">
313 `gettext "Selection:"`
314 <input type="submit" name="do" value="Install" />
315 <input type="submit" name="do" value="Remove" />
316 <a href="`cat $PANEL/lib/checkbox.js`">`gettext "Toogle all"`</a>
317 </div>
318 <div class="float-right">
319 `gettext "List:"`
320 <input type="submit" name="recharge" value="Recharge" />
321 <a class="button" href='$SCRIPT_NAME?list'>
322 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
323 </div>
324 </div>
325 EOT
326 tazpkg up --check >/dev/null
327 table_start
328 table_head
329 for pkg in `cat packages.up`
330 do
331 grep "^$pkg |" $LOCALSTATE/packages.desc | parse_packages_desc
332 done
333 table_end
334 echo '</form>' ;;
335 do=*)
336 #
337 # Do an action on one or some packages
338 #
339 cmdline=`echo ${QUERY_STRING#do=} | sed s'/&/ /g'`
340 cmd=`echo ${cmdline} | awk '{print $1}'`
341 pkgs=`echo $cmdline | sed -e s'/+/ /g' -e s'/pkg=//g' -e s/$cmd//`
342 case $cmd in
343 install|Install)
344 cmd=get-install opt=--forced ;;
345 remove|Remove)
346 cmd=remove ;;
347 esac
348 search_form
349 sidebar
350 LOADING_MSG="${cmd}ing packages..."
351 loading_msg
352 cat << EOT
353 <h2>Tazpkg: $cmd</h2>
354 <form method="get" action="$SCRIPT_NAME">
355 <div id="actions">
356 <div class="float-left">
357 <p>
358 `gettext "Performing tasks on packages"`
359 </p>
360 </div>
361 <div class="float-right">
362 <p>
363 <a class="button" href='$SCRIPT_NAME?list'>
364 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
365 </p>
366 </div>
367 </div>
368 EOT
369 echo '<div class="box">'
370 gettext "Executing $cmd for:$pkgs"
371 echo '</div>'
372 for pkg in $pkgs
373 do
374 echo '<pre>'
375 echo 'o' | tazpkg $cmd $pkg $opt 2>/dev/null | filter_tazpkg_msgs
376 echo '</pre>'
377 done ;;
378 info=*)
379 #
380 # Packages info
381 #
382 pkg=${QUERY_STRING#*=}
383 search_form
384 sidebar
385 if [ -d $INSTALLED/$pkg ]; then
386 . $INSTALLED/$pkg/receipt
387 files=`cat $INSTALLED/$pkg/files.list | wc -l`
388 action=$(gettext "Remove")
389 else
390 cd $LOCALSTATE
391 LOADING_MSG=$(gettext "Getting package info...")
392 loading_msg
393 IFS='|'
394 set -- $(grep "^$pkg |" packages.desc)
395 unset IFS
396 PACKAGE=$1
397 VERSION="$(echo $2)"
398 SHORT_DESC="$(echo $3)"
399 CATEGORY="$(echo $4)"
400 WEB_SITE="$(echo $5)"
401 action=$(gettext "Install")
402 fi
403 cat << EOT
404 <h2>`gettext "Package"` $PACKAGE</h2>
405 <div id="actions">
406 <div class="float-left">
407 <p>
408 <a class="button" href='$SCRIPT_NAME?do=$action&$pkg'>$action</a>
409 </p>
410 </div>
411 <div class="float-right">
412 <p>
413 <a class="button" href='$SCRIPT_NAME?list'>
414 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
415 </p>
416 </div>
417 </div>
418 <pre>
419 Name : $PACKAGE
420 Version : $VERSION
421 Description : $SHORT_DESC
422 Category : $CATEGORY
423 EOT
424 if [ -d $INSTALLED/$pkg ]; then
425 cat << EOT
426 Maintainer : $MAINTAINER
427 Depends : `for i in $DEPENDS; do echo -n \
428 "<a href="$SCRIPT_NAME?info=$i">$i</a> "; done`
429 Website : <a href="$WEB_SITE">$WEB_SITE</a>
430 Sizes : $PACKED_SIZE/$UNPACKED_SIZE
431 </pre>
433 <p>`gettext "Installed files:"` `cat $INSTALLED/$pkg/files.list | wc -l`</p>
434 <pre>
435 `cat $INSTALLED/$pkg/files.list`
436 </pre>
437 EOT
438 else
439 cat << EOT
440 Website : <a href="$WEB_SITE">$WEB_SITE</a>
441 Sizes : `grep -A 3 ^$pkg$ packages.txt | tail -n 1 | sed 's/ *//'`
442 </pre>
444 <p>`gettext "Installed files:"`</p>
445 <pre>
446 `unlzma -c files.list.lzma | sed "/^$pkg: /!d;s/^$pkg: //"`
447 </pre>
448 EOT
449 fi
450 ;;
451 config*)
452 #
453 # Tazpkg configuration page
454 #
455 cmd=${QUERY_STRING#*=}
456 case "$cmd" in
457 clean)
458 rm -rf /var/cache/tazpkg/* ;;
459 add-mirror*=http*|add-mirror*=ftp*)
460 # Decode url
461 mirror=`httpd -d ${cmd#*=}`
462 echo "$mirror" >> $LOCALSTATE/mirrors ;;
463 rm-mirror=http://*|rm-mirror=ftp://*)
464 mirror=${QUERY_STRING#*=rm-mirror=}
465 sed -i -e "s@$mirror@@" -e '/^$/d' $LOCALSTATE/mirrors ;;
466 esac
467 cache_files=`find /var/cache/tazpkg -name *.tazpkg | wc -l`
468 cache_size=`du -sh /var/cache/tazpkg`
469 sidebar
470 cat << EOT
471 <h2>`gettext "Configuration"`</h2>
472 <div>
473 <p>`gettext "Tazpkg configuration and settings"`</p>
474 </div>
475 <div>
476 <form method="get" action="$SCRIPT_NAME">
477 <p>
478 `gettext "Packages in the cache:"` $cache_files ($cache_size)
479 <input type="hidden" name="config" value="clean" />
480 <input type="submit" value="Clean" />
481 </p>
482 </form>
483 </div>
485 <h3>`gettext "Current mirror list"`</h3>
486 <div class="box">
487 <ul>
488 `list_mirrors`
489 </ul>
490 </div>
491 <form method="get" action="$SCRIPT_NAME">
492 <p>
493 <input type="hidden" name="config" value="add-mirror" />
494 <input type="text" name="mirror" size="60">
495 <input type="submit" value="Add mirror" />
496 </p>
497 </form>
498 EOT
499 ;;
500 *)
501 #
502 # Default to summary
503 #
504 search_form
505 sidebar
506 cat << EOT
507 <h2>`gettext "Summary"`</h2>
508 <div id="actions">
509 <a class="button" href='$SCRIPT_NAME?list'>
510 <img src="$IMAGES/tazpkg.png" />`gettext "My packages"`</a>
511 <a class="button" href='$SCRIPT_NAME?recharge'>
512 <img src="$IMAGES/recharge.png" />`gettext "Recharge list"`</a>
513 <a class="button" href='$SCRIPT_NAME?up'>
514 <img src="$IMAGES/update.png" />`gettext "Check upgrade"`</a>
515 <a class="button" href='$SCRIPT_NAME?config'>
516 <img src="$IMAGES/edit.png" />`gettext "Configuration"`</a>
517 </div>
518 <pre class="pre-main">
519 `packages_summary`
520 </pre>
522 <h3>`gettext "Latest log entries"`</h3>
523 <pre>
524 `tail -n 5 /var/log/tazpkg.log | fgrep "-" | \
525 awk '{print $1, $2, $3, $4, $5, $6, $7}'`
526 </pre>
528 EOT
529 ;;
530 esac
532 # xHTML 5 footer
533 xhtml_footer
534 exit 0