tazpanel view pkgs.cgi @ rev 82

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