Imported Debian version 0.42
Javier Fernandez-Sanguino
12 years ago
0 | 0 | #!/usr/bin/python |
1 | 1 | |
2 | 2 | # Copyright (C) 2001 Matt Zimmerman <mdz@debian.org> |
3 | # | |
4 | # Further updated by Javier Fernandez-Sanguino <jfs@debian.org> | |
3 | # Copyright (C) 2007,2008 Javier Fernandez-Sanguino <jfs@debian.org> | |
5 | 4 | # - included patch from Justin Pryzby <justinpryzby_AT_users.sourceforge.net> |
6 | 5 | # to work with the latest Lsof - modify to reduce false positives by not |
7 | 6 | # complaining about deleted inodes/files under /tmp/, /var/log/, |
8 | 7 | # /var/run or named /SYSV. |
8 | # - introduced a verbose option | |
9 | 9 | |
10 | 10 | # PENDING: |
11 | 11 | # - included code from 'psdel' contributed by Sam Morris <sam_AT_robots.org.uk> to |
40 | 40 | import sys |
41 | 41 | import string |
42 | 42 | import subprocess |
43 | import getopt | |
43 | 44 | from stat import * |
44 | 45 | |
45 | 46 | if os.getuid() != 0: |
57 | 58 | return location |
58 | 59 | return 0 |
59 | 60 | |
61 | def usage(): | |
62 | sys.stderr.write('usage: checkrestart [-v]\n') | |
60 | 63 | |
61 | 64 | def main(): |
62 | 65 | process = None |
63 | 66 | toRestart = {} |
64 | 67 | |
68 | # Process options | |
69 | try: | |
70 | opts, args = getopt.getopt(sys.argv[1:], "hv", ["help", "verbose"]) | |
71 | except getopt.GetoptError, err: | |
72 | # print help information and exit: | |
73 | print str(err) # will print something like "option -a not recognized" | |
74 | usage() | |
75 | sys.exit(2) | |
76 | verbose = False | |
77 | for o, a in opts: | |
78 | if o == "-v": | |
79 | verbose = True | |
80 | elif o in ("-h", "--help"): | |
81 | usage() | |
82 | sys.exit() | |
83 | else: | |
84 | assert False, "unhandled option" | |
85 | ||
86 | # Start checking | |
65 | 87 | toRestart = lsofcheck() |
66 | 88 | # Check if we have lsof, if not, use psdel |
67 | 89 | # if find_cmd('lsof'): |
85 | 107 | else: |
86 | 108 | print "(%d distinct programs)" % len(programs) |
87 | 109 | |
110 | # Verbose information | |
111 | if verbose: | |
112 | for process in toRestart: | |
113 | print "Process %s (PID: %d) " % (process.program, process.pid) | |
114 | process.listDeleted() | |
115 | ||
116 | ||
88 | 117 | packages = {} |
89 | 118 | diverted = None |
90 | 119 | dpkgQuery = ["dpkg", "--search"] + programs.keys() |
91 | dpkgProc = subprocess.Popen(dpkgQuery, stdout=subprocess.PIPE) | |
120 | dpkgProc = subprocess.Popen(dpkgQuery, stdout=subprocess.PIPE, stderr=None) | |
92 | 121 | for line in dpkgProc.stdout.readlines(): |
93 | 122 | if line.startswith('local diversion'): |
94 | 123 | continue |
117 | 146 | for package in packages.values(): |
118 | 147 | if package == 'util-linux': |
119 | 148 | continue |
120 | #dpkgQuery = 'dpkg-query --listfiles ' + package.name | |
121 | dpkgQuery = 'dpkg --listfiles ' + package.name | |
122 | for line in os.popen(dpkgQuery).readlines(): | |
149 | dpkgQuery = ["dpkg", "--listfiles ", + package.name] | |
150 | dpkgProc = subprocess.Popen(dpkgQuery, stdout=subprocess.PIPE, stderr=None) | |
151 | for line in dpkgProc.stdout.readlines(): | |
123 | 152 | path = line[:-1] |
124 | 153 | if path.startswith('/etc/init.d/'): |
125 | 154 | if path.endswith('.sh'): |
180 | 209 | elif field == 'k': |
181 | 210 | process.links.append(data) |
182 | 211 | elif field == 'n': |
183 | # Remove the previous entry to check if this is something we should do | |
212 | # Remove the previous entry to check if this is something we should use | |
184 | 213 | if data.startswith('/SYSV'): |
214 | # If we find SYSV we discard the previous descriptor | |
185 | 215 | last = process.descriptors.pop() |
186 | if not re.compile("DEL").search(last): | |
187 | process.files.append(data) | |
188 | elif data.startswith('/dev/zero') or data.startswith('/dev/pts/'): | |
216 | elif data.startswith('/'): | |
189 | 217 | last = process.descriptors.pop() |
190 | if not re.compile("DEL").search(last): | |
218 | # Add it to the list of deleted files if the previous descriptor | |
219 | # was DEL or lsof marks it as deleted | |
220 | if re.compile("DEL").search(last) or re.compile("deleted").search(data): | |
191 | 221 | process.files.append(data) |
192 | 222 | else: |
193 | process.files.append(data) | |
223 | # We discard the previous descriptors and drop it | |
224 | last = process.descriptors.pop() | |
194 | 225 | elif field == 'f': |
226 | # Save the descriptor for later comparison | |
195 | 227 | process.descriptors.append(data) |
196 | 228 | |
197 | 229 | toRestart = filter(lambda process: process.needsRestart(), |
198 | 230 | processes.values()) |
199 | 231 | return toRestart |
232 | ||
233 | # Tells if a file has to be considered a deleted file | |
234 | # Returns: | |
235 | # - 0 (NO) for known locations of files which might be delted | |
236 | # - 1 (YES) for valid deleted files we are interested in | |
237 | def isdeletedFile (f): | |
238 | # We don't care about log files | |
239 | if f.startswith('/var/log/'): | |
240 | return 0 | |
241 | # Or about files under temporary locations | |
242 | if f.startswith('/var/run/'): | |
243 | return 0 | |
244 | # Or about files under /tmp | |
245 | if f.startswith('/tmp/'): | |
246 | return 0 | |
247 | # Or /dev/zero | |
248 | if f.startswith('/dev/zero'): | |
249 | return 0 | |
250 | # Or /dev/pts (used by gpm) | |
251 | if f.startswith('/dev/pts/'): | |
252 | return 0 | |
253 | # Or /usr/lib/locale | |
254 | if f.startswith('/usr/lib/locale/'): | |
255 | return 0 | |
256 | # Skip automatically generated files | |
257 | if f.endswith('icon-theme.cache'): | |
258 | return 0 | |
259 | # TODO: it should only care about library files (i.e. /lib, /usr/lib and the like) | |
260 | # build that check with a regexp to exclude others | |
261 | if f.endswith(' (deleted)'): | |
262 | return 1 | |
263 | if re.compile("\(path inode=[0-9]+\)$").search(f): | |
264 | return 1 | |
265 | # Default: it is a deleted file we are interested in | |
266 | return 1 | |
200 | 267 | |
201 | 268 | def psdelcheck(): |
202 | 269 | # TODO - Needs to be fixed to work here |
213 | 280 | processes = {} |
214 | 281 | process = processes.setdefault(pid,Process(int(pid))) |
215 | 282 | deleted = re.compile(r'(.*) \(deleted\)$') |
216 | boring = re.compile(r'/(dev/zero|SYSV([\da-f]{8}))') | |
283 | boring = re.compile(r'/(dev/zero|SYSV([\da-f]{8}))|/usr/lib/locale') | |
217 | 284 | |
218 | 285 | mapline = re.compile(r'^[\da-f]{8}-[\da-f]{8} [r-][w-][x-][sp-] ' |
219 | 286 | r'[\da-f]{8} [\da-f]{2}:[\da-f]{2} (\d+) *(.+)( \(deleted\))?\n$') |
298 | 365 | # Support symlinked /usr |
299 | 366 | if f.startswith('/usr'): |
300 | 367 | statinfo = os.lstat('/usr')[ST_MODE] |
368 | # If /usr is a symlink then find where it points to | |
301 | 369 | if S_ISLNK(statinfo): |
302 | 370 | newusr = os.readlink('/usr') |
303 | 371 | if not newusr.startswith('/'): |
304 | newusr = os.path.join(os.path.dirname('/tmp/test'), newusr) | |
372 | # If the symlink is relative, make it absolute | |
373 | newusr = os.path.join(os.path.dirname('/usr'), newusr) | |
305 | 374 | f = re.sub('^/usr',newusr, f) |
306 | print "Changing usr to " + newusr + " result:" +f; | |
375 | # print "Changing usr to " + newusr + " result:" +f; # Debugging | |
307 | 376 | return re.sub('( \(deleted\)|.dpkg-new).*$','',f) |
377 | ||
378 | def listDeleted(self): | |
379 | listfiles = [] | |
380 | listdescriptors = [] | |
381 | for f in self.files: | |
382 | if isdeletedFile(f): | |
383 | listfiles.append(f) | |
384 | if listfiles != []: | |
385 | print "List of deleted files in use:" | |
386 | for file in listfiles: | |
387 | print "\t" + file | |
308 | 388 | |
309 | 389 | # Check if a process needs to be restarted, previously we would |
310 | 390 | # just check if it used libraries named '.dpkg-new' since that's |
311 | 391 | # what dpkg would do. Now we need to be more contrieved. |
392 | # Returns: | |
393 | # - 0 if there is no need to restart the process | |
394 | # - 1 if the process needs to be restarted | |
312 | 395 | def needsRestart(self): |
313 | 396 | for f in self.files: |
314 | # We don't care about log files | |
315 | if f.startswith('/var/log/'): | |
316 | continue | |
317 | # Or about files under temporary locations | |
318 | if f.startswith('/var/run/'): | |
319 | continue | |
320 | # Or about files under /tmp | |
321 | if f.startswith('/tmp/'): | |
322 | continue | |
323 | # Or /dev/zero | |
324 | if f.startswith('/dev/zero'): | |
325 | continue | |
326 | # Or /dev/pts (used by gpm) | |
327 | if f.startswith('/dev/pts/'): | |
328 | continue | |
329 | # TODO: it should only care about library files (i.e. /lib, /usr/lib and the like) | |
330 | # build that check with a regexp to exclude others | |
331 | if f.endswith(' (deleted)'): | |
332 | return 1 | |
333 | if re.compile("\(path inode=[0-9]+\)$").search(f): | |
334 | return 1 | |
335 | for f in self.descriptors: | |
336 | # Notice that if it begins with SYSV or /dev/zero | |
337 | # it is not a deleted file and the descriptor was popped already | |
338 | # (see above) | |
339 | # We don't care about log files | |
340 | if f.startswith('/var/log/'): | |
341 | continue | |
342 | # Or about files under temporary locations | |
343 | if f.startswith('/var/run/'): | |
344 | continue | |
345 | # Or about files under /tmp | |
346 | if f.startswith('/tmp/'): | |
347 | continue | |
348 | # Or /dev/zero | |
349 | if f.startswith('/dev/zero'): | |
350 | continue | |
351 | # We care about any other DEL files | |
352 | if re.compile("DEL").search(f): | |
397 | if isdeletedFile(f): | |
353 | 398 | return 1 |
354 | 399 | for f in self.links: |
355 | 400 | if f == 0: |
5 | 5 | .SH NAME |
6 | 6 | checkrestart \- check which processes need to be restarted after an upgrade |
7 | 7 | .SH SYNOPSIS |
8 | .B checkrestart | |
8 | .B checkrestart [ -hv ] | |
9 | 9 | .SH DESCRIPTION |
10 | 10 | The |
11 | 11 | .B checkrestart |
27 | 27 | .P |
28 | 28 | This script needs to run as root in order to obtain the information it needs |
29 | 29 | for analysis. |
30 | ||
31 | .SH OPTIONS | |
32 | ||
33 | .TP | |
34 | .BI -h, --help | |
35 | Show the program help and exit. | |
36 | ||
37 | .TP | |
38 | .BI -v, --verbose | |
39 | Generate detailed output. This output includes the list of all | |
40 | processes found using deleted files or descriptors as well as the deleted files | |
41 | and descriptors found. | |
30 | 42 | |
31 | 43 | .SH EXIT STATUS |
32 | 44 |
0 | debian-goodies (0.42) unstable; urgency=low | |
1 | ||
2 | * Updated to version 1.3 of debmany provided by Michael Arlt: | |
3 | - add bash_completion example into examples | |
4 | - add less to Depends, as it is the default viewer for other files. | |
5 | - add zenity to Suggests, it is a graphical alternative for dialog. | |
6 | * Fix popbugs to prevent it from removing temporary files before the browser | |
7 | has opened them, thanks to Chris Lamb for the bug report and the fix | |
8 | (Closes: #471752) | |
9 | * checkrestart: | |
10 | - Add /usr/lib/locale/ to the list of exceptions to prevent false | |
11 | positives when locales are reconfigured. | |
12 | - Change os.popen call to a subprocess.Popen call since python 2.5 does | |
13 | not seem to like lists in os.popen and because subprocess is preferable | |
14 | here. | |
15 | - Recode the utility so that the checks for deleted files and descriptors | |
16 | is not duplicated. | |
17 | - Remove the (useless) check for deleted descriptor | |
18 | - Rewrite the handling of lsof results to be more accurate and | |
19 | understandable. | |
20 | - Add a 'verbose' option that makes it list all the (supposedly) deleted | |
21 | files and descriptors used by the processes (Closes: #466811, #475397) - | |
22 | Add icon-theme.cache to the list of deleted files that will be flagged | |
23 | (Closes: #469133) | |
24 | - Fix properly the handling of /usr as a symlink, the code had some stuff | |
25 | that was used as test case and should have been replaced before | |
26 | uploading, oops. (Closes: #405040) | |
27 | * Add myself to author list in debian/copyright, and fixed a lintian | |
28 | warning there too. | |
29 | ||
30 | -- Javier Fernandez-Sanguino Pen~a <jfs@debian.org> Thu, 10 Jul 2008 00:30:39 +0200 | |
31 | ||
32 | debian-goodies (0.41) unstable; urgency=low | |
33 | ||
34 | * Make the dpkg --list query use an array to call the shell so that odd | |
35 | package names will not affect it. | |
36 | ||
37 | -- Javier Fernandez-Sanguino Pen~a <jfs@debian.org> Sat, 29 Mar 2008 21:38:20 +0100 | |
38 | ||
0 | 39 | debian-goodies (0.40) unstable; urgency=low |
1 | 40 | |
2 | 41 | * checkrestart: |
6 | 6 | |
7 | 7 | Package: debian-goodies |
8 | 8 | Architecture: all |
9 | Depends: dctrl-tools | grep-dctrl, curl, python (>= 2.4), lsof, whiptail | dialog | |
10 | Suggests: popularity-contest, xdg-utils | |
9 | Depends: dctrl-tools | grep-dctrl, curl, python (>= 2.4), lsof, whiptail | dialog, less | |
10 | Suggests: popularity-contest, xdg-utils, zenity | |
11 | 11 | Conflicts: debget |
12 | 12 | Replaces: debget |
13 | 13 | Description: Small toolbox-style utilities for Debian systems |
2 | 2 | |
3 | 3 | It has no home other than Debian. |
4 | 4 | |
5 | Upstream Author(s): Matt Zimmerman <mdz@debian.org> | |
5 | Upstream Authors: Matt Zimmerman <mdz@debian.org> | |
6 | Javier Fernandez-Sanguino <jfs@debian.org> | |
6 | 7 | |
7 | 8 | Copyright: |
8 | 9 |
0 | debmany/debmany.bash_completion |
0 | ||
1 | Provide a desktop menu file that uses "debmany.png". When configuring the desktop | |
2 | call follow this table: | |
3 | ||
4 | kde gnome xfce | |
5 | required zenity zenity zenity,xdg-utils | |
6 | parameters -k -z -g -z -x -z | |
7 | ||
8 | It is better to use the -l parameter for ISO 639 two-letter language code and | |
9 | "*" at the end. | |
10 | ||
11 | Example parameters for a german Kde user: -k -z -l "de*" | |
12 | ||
13 | Optionally, Depend: on xdg-utils package, too. Then the desktop file can use the arguments | |
14 | -x instead of -k, -g or -x for all desktops. | |
15 |
0 | # Debian debmany(1) completion. | |
1 | # | |
2 | have debmany && | |
3 | _debmany() | |
4 | { | |
5 | local cur prev | |
6 | ||
7 | COMPREPLY=() | |
8 | cur=${COMP_WORDS[COMP_CWORD]} | |
9 | prev=${COMP_WORDS[COMP_CWORD-1]} | |
10 | ||
11 | case "$prev" in | |
12 | -L) if [[ "$cur" != "" && "${cur//[0-9]/}" == "" ]] | |
13 | then | |
14 | COMPREPLY=( K M G T ) | |
15 | fi | |
16 | # not perfect - 10M<tab> and the cursor sticks on the M but should paste a " " | |
17 | return;; | |
18 | -l) COMPREPLY=( $( ls /usr/share/man 2>/dev/null | cut -f1 -d'.' | grep -v ^man | sort -u ) );; | |
19 | -m) | |
20 | case "${cur:0:1}" in | |
21 | \"|\') local manpageviewer="${cur:1}";; | |
22 | *) local manpageviewer="$cur";; | |
23 | esac | |
24 | COMP_WORDS=(COMP_WORDS[0] $manpageviewer) | |
25 | COMP_CWORD=1 | |
26 | _command | |
27 | # not perfect: '-m "konquer<tab' gets completed to '-m "konqueror"' | |
28 | # and '-m konquer<tab' gets completed to '-m konqueror' | |
29 | # both shall complete to '-m "konqueror man:%s"' ?! | |
30 | # but [ ${#COMPREPLY[@]} -eq 1 ] && [ ${COMPREPLY:0:1} != '"' ] && COMPREPLY[0]='"'$COMPREPLY' man:%s"' | |
31 | # completes to debmany -m \"konqueror\ man\:%s\" | |
32 | # my knowledge is too low concerning completion | |
33 | # whole -m section should be rewritten by someone with knowledge | |
34 | ;; | |
35 | *) | |
36 | if [[ "$cur" == -* ]]; then | |
37 | COMPREPLY=( $( compgen -W '-? -h --help -m -k -g -x -L -l' -- $cur ) ) | |
38 | else | |
39 | COMPREPLY=( $( apt-cache pkgnames $cur 2> /dev/null; ) ) | |
40 | [ ${#COMPREPLY[@]} -eq 0 ] && _filedir deb | |
41 | fi | |
42 | ;; | |
43 | esac | |
44 | ||
45 | return 0 | |
46 | } && | |
47 | complete -F _debmany $filenames debmany |
0 | 0 | #!/bin/bash |
1 | 1 | # script: debmany |
2 | 2 | # author: Michael Arlt |
3 | # description: select the manpages of any [not] installed debian package | |
3 | # description: select manpages+docs of any [not] installed debian package | |
4 | 4 | # comment: debmany is based on the work of debman and debget |
5 | # uses: whiptail (preferred) or dialog as well as curl | |
5 | # gui uses: whiptail (preferred), dialog or zenity as well | |
6 | # other uses: curl, less (can be overwritten: -o) | |
7 | # optional: -k -g -x: kfmexec gnome-open xdg-open (xdg-utils) | |
6 | 8 | # This is free software. You may redistribute copies of it under the terms of |
7 | 9 | # the GNU General Public License <http://www.gnu.org/licenses/gpl.html>. |
8 | 10 | # There is NO WARRANTY, to the extent permitted by law. |
9 | 11 | |
12 | # Tests for new releases: | |
13 | # -L test downloadlimit and correct display of different sizes and units (http) | |
14 | # -l several languages with and without "*" on installed and not installed packages | |
15 | # -m -o test default and using parameters | |
16 | # -z -k -g -x test | |
17 | # open manpage,other file (usr/share/doc/...),manpage,other file | |
18 | # check delivered debmany manpages | |
19 | # check and test bash_completion | |
20 | # check includes of installed (bash: bash-builtins) and uninstalled (ax25-tools:netrom-tools) | |
21 | # test additionally the next operationg system (e.g. lenny) | |
22 | ||
10 | 23 | LC_ALL=C |
11 | 24 | |
12 | # choose the manpageviewer | |
13 | mancmdline="man %s" # default manpageviewer | |
25 | # defaults | |
26 | mancmdline="man %s" # manpageviewer | |
27 | othercmdline="less %s" # viewer for other files | |
14 | 28 | |
15 | 29 | curdir=`pwd` |
16 | 30 | |
18 | 32 | { |
19 | 33 | # show errorcode and quit |
20 | 34 | echo "ERROR: $*" >&2 |
35 | if [ "$cmd" = "zenity" ] | |
36 | then | |
37 | $cmd --error --text="$*" | |
38 | fi | |
21 | 39 | exit 1 |
22 | 40 | } |
23 | 41 | |
42 | debug() | |
43 | { | |
44 | # show debugging | |
45 | test $debug && echo "$*" >&2 | |
46 | } | |
47 | ||
24 | 48 | usage() |
25 | 49 | { |
26 | echo "debmany 1.2 Mon Aug 27 19:06:55 CEST 2007 | |
27 | Description: Display a manpage from a Debian package. | |
28 | The list of manpages is displayed in a dialog. | |
50 | echo "debmany $version Thu May 15 16:56:19 CEST 2008 | |
51 | Description: Display a manpage or documentation files from a Debian package. | |
52 | The list of files is displayed in a dialog. | |
29 | 53 | Supported locations for debian packages are: Local .deb-file, |
30 | 54 | a package in the repository or an installed package. |
55 | The default for manpages is man - less is used for other files. | |
56 | Default can be overwritten with -k|-g|-x and -m -o. | |
31 | 57 | Syntax1 : debmany [-?|-h|--help] |
32 | Syntax2 : debmany [-m viewer|-k|-g|-x] [-L limit] [-l lang1[,...]] package[.deb] | |
58 | Syntax2 : debmany [-v[v]] [-k|-g|-x] [-m manviewer] [-o otherviewer] [-L limit] [-l lang1[,...]] package[.deb] | |
59 | Syntax3 : debmany [-v[v]] [-k|-g|-x] [-m manviewer] [-o otherviewer] [-L limit] [-l lang1[,...]] -z [package[.deb]] | |
33 | 60 | Examples: debmany foo.deb show manpages from a local package file foo.deb |
34 | 61 | debmany foo show manpages from a package, if the package is |
35 | 62 | not installed it is retrieved from the |
36 | 63 | configured repositories. |
37 | debmany -k foo show manpages using your preferred man-viewer (KDE) | |
38 | debmany -g foo show manpages using your preferred man-viewer (GNOME) | |
39 | debmany -x foo show manpages using your preferred man-viewer | |
64 | debmany -k foo show files using your preferred viewer (KDE) | |
65 | man: kfmclient exec man:%s other: kfmclient exec %s | |
66 | debmany -g foo show files using your preferred viewer (GNOME) | |
67 | man: gnome-open man:%s other: gnome-open %s | |
68 | debmany -x foo show files using your preferred viewer | |
69 | man: xdg-open man:%s other: xdg-open %s | |
40 | 70 | using xdg-open from xdg-utils package (Xfce users) |
41 | debmany -m 'konqueror man:%s' -l de,fr -L 5M foo | |
71 | debmany -m 'konqueror man:%s' -l 'de*,fr*' -L 5M foo | |
42 | 72 | show english, german and french manpages using |
43 | 73 | konqueror as man-viewer and ask if download size |
44 | 74 | exceeds 5M |
45 | alias debmany='debmany -l de -L 5M -k'; debmany -m man -l '*' foo | |
75 | debmany -z -k use zenity (as dialog) to select packages and files | |
76 | TMPDIR=~/tmp debmany -k -o 'foo.sh %s' -l de,fr -L 5M foo | |
77 | use ~/tmp as temporary folder | |
78 | use KDE-defaults but overwrite viewer for other files | |
79 | debmany -v foo show some debugging information (-vv show more) | |
80 | alias debmany='debmany -l de -L 5M -k'; debmany -m man -l 'zh*' foo | |
46 | 81 | set an alias with your preferred options and |
47 | 82 | overwrite them if needed" |
48 | 83 | if [ $# -eq 0 ] |
57 | 92 | do |
58 | 93 | case $1 in |
59 | 94 | "-?"|-h|--help) usage ;; |
60 | -m) # override default manpageviewer or environment variable DEBMANY_MAN_VIEWER | |
95 | -k) mancmdline='kfmclient exec man:%s' # set kde viewers | |
96 | othercmdline='kfmclient exec %s';; | |
97 | -g) mancmdline='gnome-open man:%s' # set gnome viewers | |
98 | othercmdline='gnome-open %s';; | |
99 | -x) mancmdline='xdg-open man:%s' # set independant viewers | |
100 | othercmdline='xdg-open %s';; | |
101 | -m) # override default manpageviewer | |
61 | 102 | shift |
62 | mancmd=($1) # get first word from manpageviewer | |
63 | if which $mancmd >/dev/null 2>&1 # is the manpageviewer executeable? | |
64 | then | |
65 | echo $1 | grep -q "%s" && mancmdline="$1" || mancmdline="$1 %s" | |
66 | else | |
67 | usage "Manpageviewer '$mancmd' is not available or executable" | |
68 | fi | |
69 | ;; | |
70 | -k) mancmdline='kfmclient exec man:%s';; # set kde viewer | |
71 | -g) mancmdline='gnome-open man:%s';; # set gnome viewer | |
72 | -x) mancmdline='xdg-open man:%s';; # set independant viewer | |
73 | -l) shift; lang=$1;; # remember language | |
74 | -L) shift; asksize=$1;; # remember asksize | |
103 | mancmdline="$1";; | |
104 | -o) # override default viewer for other data | |
105 | shift | |
106 | othercmdline="$1";; | |
107 | -l) shift; lang=$1;; # remember language | |
108 | -L) shift; asksize=$1;; # remember asksize | |
109 | -v) debug=1;; | |
110 | -vv) debug=2;; | |
111 | -z) cmd="zenity" | |
112 | # is zenity executeable? | |
113 | which $cmd >/dev/null 2>&1 || error "$cmd must be installed if you use parameter -z" | |
114 | ;; | |
75 | 115 | -*) usage "Unknown option '$1'.";; |
76 | 116 | *) package="$1";; |
77 | 117 | esac |
78 | 118 | shift |
79 | 119 | done |
80 | 120 | |
81 | test -z "$package" && usage "You must specify one package or a Debian package file." | |
82 | ||
83 | # determine the size of your terminal | |
84 | declare -i size=(`stty size`) | |
85 | declare -i x=${size[1]} | |
86 | declare -i y=${size[0]} | |
87 | ||
88 | # if it is impossible to determine the size | |
89 | if [ $x -eq 0 ] | |
90 | then | |
91 | x=80 | |
92 | y=25 | |
93 | echo "Unable to determine the size of your terminal - using Console default: $x*$y" >&2 | |
94 | sleep 3 | |
95 | fi | |
96 | ||
97 | # test upon minimum resolution | |
98 | if [ $x -lt 40 -o $y -lt 9 ] | |
99 | then | |
100 | error "Resolution too small ($x*$y). I need a minimum of 40*9 - recommended is more..." | |
101 | fi | |
102 | ||
103 | # set the size of the dialog window and menu | |
104 | x=x-1 # width of the dialog | |
105 | y=y-1 # height of the dialog | |
106 | declare -i h=y-7 # height of the menu | |
107 | ||
108 | if [ "${package##*.}" = "deb" ] | |
109 | then | |
110 | # mode1: you want to see manpages from a .deb-file | |
121 | mancmd=($mancmdline) # get first word !dash | |
122 | if which $mancmd >/dev/null 2>&1 # is the manpageviewer(first word) executeable? | |
123 | then | |
124 | echo "$mancmdline" | grep -q "%s" || mancmdline="$mancmdline %s" | |
125 | else | |
126 | usage "Manpageviewer '$mancmd' is not available or executable" | |
127 | fi | |
128 | othercmd=($othercmdline) # get first word !dash | |
129 | if which $othercmd >/dev/null 2>&1 # is the manpageviewer executeable? | |
130 | then | |
131 | echo "$othercmdline" | grep -q "%s" || othercmdline="$othercmdline %s" | |
132 | else | |
133 | usage "Viewer for other data '$othercmd' is not available or executable" | |
134 | fi | |
135 | ||
136 | # Version of debmany | |
137 | version=1.3 | |
138 | ||
139 | # choose whiptail or dialog | |
140 | whiptail=/usr/bin/whiptail | |
141 | dialog=/usr/bin/dialog | |
142 | ||
143 | if [ "$cmd" ] | |
144 | then | |
145 | # zenity version | |
146 | if [ -z "$package" ] | |
147 | then | |
148 | package=`$cmd --entry --title="Debmany $version" --text="Enter package or package.deb"` || exit 0 | |
149 | fi | |
150 | else | |
151 | test -z "$package" && usage "You must specify one package or a Debian package file." | |
152 | test -x $whiptail && cmd=$whiptail || cmd=$dialog | |
153 | ||
154 | # determine the size of your terminal | |
155 | read y x <<EOF | |
156 | `stty size` | |
157 | EOF | |
158 | ||
159 | # if it is impossible to determine the size | |
160 | if [ "$x" = "" ] | |
161 | then | |
162 | x=80 | |
163 | y=25 | |
164 | echo "Unable to determine the size of your terminal - using Console default: $x*$y" >&2 | |
165 | sleep 3 | |
166 | fi | |
167 | ||
168 | # test upon minimum resolution | |
169 | if [ $x -lt 40 -o $y -lt 9 ] | |
170 | then | |
171 | error "Resolution too small ($x*$y). I need a minimum of 40*9 - recommended is more..." | |
172 | fi | |
173 | ||
174 | debug "Terminalsize: ${x}x$y" # comment | |
175 | ||
176 | # set the size of the dialog window and menu | |
177 | x=$(($x-1)) # width of the dialog | |
178 | y=$(($y-1)) # height of the dialog | |
179 | h=$(($y-7)) # height of the menu | |
180 | fi | |
181 | debug "Using '$cmd' for selection" # comment | |
182 | ||
183 | ||
184 | if [ "${package##*.}" = "deb" ] | |
185 | then | |
186 | debug "Mode1: You want to see manpages from a .deb-file" # comment | |
111 | 187 | if [ -r "$package" ] |
112 | 188 | then |
113 | 189 | file=`readlink -f "$package"` |
116 | 192 | error "The file $package cannot be read." |
117 | 193 | fi |
118 | 194 | else |
119 | # mode 2: test if you have the package already installed | |
195 | debug "Test if the package '$package' is already installed" # comment | |
120 | 196 | if dpkg -l "$package" 2>/dev/null | grep -q ^i |
121 | 197 | then |
198 | debug "Package '$package' is already installed" # comment | |
122 | 199 | status=installed |
200 | # create the list of all mandirs (with -e for grep) (X11R6 is only for sarge - didn't find it in etch anymore) | |
201 | mandirs="-e /usr/share/man/man.*/ -e /usr/share/doc/" | |
202 | # modify lang for grep regular expressions: fr -> fr\.* (-> fr+fr.ISO8859-1+"fr."...) | |
203 | for l in `echo "$lang"|sed -e "s/,/ /" -e "s/*/.*/"` | |
204 | do | |
205 | mandirs="$mandirs -e /usr/share/man/$l/" | |
206 | done | |
207 | debug "Using grep pattern '$mandirs'" # comment | |
208 | # list the manpage dirs | |
123 | 209 | set -f |
124 | # modify lang for grep regular expressions: fr -> fr\.* (-> fr+fr.ISO8859-1+"fr."...) | |
125 | langgrep=`echo $lang|sed -e s/*/.*/g -e 's/\([a-zA-Z_][a-zA-Z_]*\)/\1,\1\\\\\\.*/'` | |
126 | # create the list of all mandirs (with -e for grep) (X11R6 is only for sarge - didn't find it in etch anymore) | |
127 | mandirs="`eval echo \\"-e \\"/usr/\{share,X11R6\}/man/man.*/ \\"-e \\"/usr/\{share,X11R6\}/man/\{$langgrep,XYZZXY\}/`" | |
128 | 210 | for man in `dpkg -L "$package" 2>/dev/null|grep $mandirs|sort` |
129 | 211 | do |
130 | 212 | # mode 2: add the manpages to the list |
131 | 213 | test -f $man && manpages="$manpages $man ${man##*/}" |
132 | 214 | done |
133 | 215 | set +f |
134 | fi | |
135 | fi | |
136 | ||
137 | # choose whiptail or dialog | |
138 | whiptail=/usr/bin/whiptail | |
139 | dialog=/usr/bin/dialog | |
140 | test -x $whiptail && cmd=$whiptail || cmd=$dialog | |
216 | if [ "$debug" = 2 ] | |
217 | then | |
218 | debug "Mode2: Found manpages/docs: $manpages" # comment | |
219 | else | |
220 | debug "Mode2: Found manpages/docs" # comment | |
221 | fi | |
222 | fi | |
223 | fi | |
141 | 224 | |
142 | 225 | if [ "$status" = "installed" ] |
143 | 226 | then |
145 | 228 | cd / |
146 | 229 | else |
147 | 230 | # mode 1 and 3 |
148 | trap 'test -n "$temp" && rm -rf $temp; exit' 0 2 15 # cleanup | |
149 | ||
150 | tmp=/dev/shm # set default tempdir | |
151 | test -d $tmp || tmp=/tmp # if not available use /tmp | |
152 | ||
153 | # make a temporary folder for the manpages - $TMPDIR overrides the path of -p | |
154 | temp=`mktemp -d -p $tmp debmany.XXXXXXXXXX` || error "Unable to create a temporary folder." | |
231 | trap 'test -n "$temp" && rm -rf "$temp"; exit' 0 2 15 # cleanup | |
232 | ||
233 | # find a directory for temporary files (you can use $TMPDIR to specify the destination) | |
234 | for tmp in "$TMPDIR" /dev/shm /tmp /var/tmp | |
235 | do | |
236 | test -d "$tmp" && break | |
237 | done | |
238 | ||
239 | # make a temporary folder for the manpages | |
240 | temp=`mktemp -d -p "$tmp" debmany.XXXXXXXXXX` || error "Unable to create a temporary folder in '$tmp'." | |
241 | debug "Mode1/3: Created temporary folder $temp" # comment | |
155 | 242 | |
156 | 243 | if [ -z "$file" ] |
157 | 244 | then |
158 | # mode 3: find the package.deb | |
245 | debug "Mode3: Determining the path of '$package' (you use file:// in sources.list)" # comment | |
159 | 246 | aptdata=`apt-get -q2 --print-uris --reinstall install "$package" 2>/dev/null | tail -1` |
160 | 247 | if [ -z "$aptdata" ] |
161 | 248 | then |
166 | 253 | url=`echo "$aptdata" | sed -e "s/^'\([^']*\)'.*$/\1/"` |
167 | 254 | test -z "$url" && error "Could not obtain an URL for '$pkgspec'." |
168 | 255 | |
256 | debug "Mode3: Found package '$package' in the repository" # comment | |
169 | 257 | if [ "${url%%:*}" = "file" ] |
170 | 258 | then |
171 | # mode 3: access the local file | |
172 | 259 | file="${url#*:}" |
260 | debug "Mode3: Access the local file '$file'" # comment | |
173 | 261 | if [ ! -r "$file" ] |
174 | 262 | then |
175 | 263 | error "Could not access '$file' from the repository." |
176 | 264 | fi |
177 | 265 | status=repos-file |
178 | 266 | else |
179 | # mode 3: download the local file | |
180 | 267 | file="$temp/tmp.deb" |
268 | debug "Mode3: Preparing download of file '$url' to '$file'" # comment | |
181 | 269 | # if i should ask at a specific size |
182 | 270 | if [ "$asksize" != "" ] |
183 | 271 | then |
272 | debug "Mode3: Determine the size of the file to download" # comment | |
184 | 273 | # determine the size of the file to download (*10 for 10,5M) |
185 | declare -i size=`apt-cache show "$package"|grep ^"Size: "|cut -f2 -d" "|head -1`*10 | |
274 | size=`apt-cache show "$package"|grep ^"Size: "|head -1|cut -f2 -d" "` | |
186 | 275 | # determine the value of ask_size |
187 | templimit=`echo ${asksize//[^0-9]/}` | |
188 | test "$templimit" = "" && error "Parameter -L needs an argument - e.g. '10M'." | |
189 | declare -i limit=`echo ${asksize//[^0-9]/}`*10 | |
276 | limit=`echo $asksize|tr -cd "[0-9]"` | |
277 | test "$limit" = "" && error "Parameter -L needs an argument - e.g. '10M'." | |
190 | 278 | # determine the unit of ask_size |
191 | unit=`echo ${asksize//[0-9]/}` | |
192 | # calculate the limit according to unit from DEBMANY_ASK_SIZE | |
279 | unit=`echo $asksize|tr -d "[0-9]"` | |
280 | debug "Mode3: Determined download limit is '$limit' '$unit'" # comment | |
281 | # calculate the limit !dash integer variables support < 2G | |
193 | 282 | case $unit in |
194 | 283 | B|"") ;; |
195 | K) limit=limit*1024;; | |
196 | M) limit=limit*1024*1024;; | |
197 | G) limit=limit*1024*1024*1024;; | |
198 | T) limit=limit*1024*1024*1024*1024;; | |
199 | *) error "Invalid unit '$unit' in variable DEBMANY_ASK_SIZE." | |
284 | K) limit=$(($limit*1024));; | |
285 | M) limit=$(($limit*1024*1024));; | |
286 | G) limit=$(($limit*1024*1024*1024));; | |
287 | T) limit=$(($limit*1024*1024*1024*1024));; | |
288 | *) error "Invalid unit '$unit' in command line." | |
200 | 289 | esac |
201 | 290 | # calculate the human readable size and ask for download if size exceeds limit |
202 | 291 | if [ $size -ge $limit ] |
203 | 292 | then |
293 | debug "Mode3: Size '$size' exceeds specified limit '$limit'" # comment | |
204 | 294 | unit=B |
295 | size=$(($size*100)) # !dash 2G limit | |
205 | 296 | # reduce the size and correct the unit until it is human readable |
206 | while [ $size -gt 1024 ] | |
297 | while [ $size -ge 10240 ] | |
207 | 298 | do |
208 | size=size/1024 | |
299 | size=$(($size/1024)) | |
300 | # correct the unit every time /1024 | |
209 | 301 | case $unit in |
210 | 302 | G) unit=T;; |
211 | 303 | M) unit=G;; |
213 | 305 | B) unit=K;; |
214 | 306 | esac |
215 | 307 | done |
216 | # set the comma (so if the file has a size of 50M we change 500 to 50,0M | |
217 | commasize=`echo $size|sed "s/\([0-9]*\)\([0-9]\)/\1,\2/"`$unit | |
308 | size=$((($size+5)/10)) # !dash 2G limit | |
309 | # set the comma (so if the file has a size of 5M we change 50 to 5,0M) | |
310 | commasize=`echo $size|sed "s/\(.*\)\(.\)/\1.\2/"` | |
311 | commasize=`printf "%.1f$unit" $commasize` | |
218 | 312 | # ask if the download may start - otherwise debmany exits |
219 | if ! $cmd --yesno "Would you like to download the package with a size of $commasize?" 9 40 | |
313 | if [ "$cmd" = "zenity" ] | |
220 | 314 | then |
221 | echo "Download undesired - $commasize is too big." | |
222 | exit | |
315 | if ! $cmd --question --text="Would you like to download the package with a size of $commasize?" | |
316 | then | |
317 | echo "Download undesired - $commasize is too big." | |
318 | exit | |
319 | fi | |
320 | else | |
321 | if ! $cmd --yesno "Would you like to download the package with a size of $commasize?" 9 40 | |
322 | then | |
323 | echo "Download undesired - $commasize is too big." | |
324 | exit | |
325 | fi | |
223 | 326 | fi |
224 | 327 | fi |
225 | 328 | fi |
226 | curl "$url" >"$file" || error "Could not download '$file' from the repository." | |
329 | # download the package | |
330 | debug "Mode3: Start download using curl" # comment | |
331 | curl "$url" >"$file" || error "Failed to download '$url' to '$file'." | |
227 | 332 | status=repos-curl |
228 | 333 | fi |
229 | 334 | fi |
230 | cd $temp | |
335 | cd "$temp" | |
231 | 336 | # extract the manpages |
232 | set -f | |
233 | # modify lang for pathname expansion: fr -> fr.* (-> fr+fr.ISO8859-1+"fr."...) | |
234 | lang=`echo $lang|sed -e 's/\([a-zA-Z_][a-zA-Z_]*\)/\1,\1*/'` | |
235 | 337 | # create the list of all mandirs (X11R6 is only for sarge - didn't find it in etch anymore) |
236 | mandirs="`eval echo \{./,\}usr/\{share,X11R6\}/man/man*/ \{./,\}usr/\{share,X11R6\}/man/\{$lang,XYZZXY\}/`" | |
338 | # and add language specific manpages: fr -> fr.* (-> fr+fr.ISO8859-1+"fr."...) | |
339 | mandirs="./usr/share/man/man*/ /usr/share/man/man*/ ./usr/share/doc/ /usr/share/doc/" | |
340 | for l in `echo "$lang"|tr "," " "` | |
341 | do | |
342 | mandirs="$mandirs ./usr/share/man/$l/ /usr/share/man/$l/" | |
343 | done | |
344 | debug "Using tar pattern '$mandirs'" # comment | |
345 | debug "Mode1/3: Extract the manpage and doc dirs from '$file'" # comment | |
237 | 346 | dpkg --fsys-tarfile "$file" | tar --wildcards -xf - $mandirs 2>/dev/null |
238 | set +f | |
239 | manpages=`find usr -type f|sort|sed -e 's§\([^/]*\)$§\1 \1§'` | |
347 | # find all manpage files | |
348 | manpages=`find usr -type f 2>/dev/null|sort|sed -e 's§\([^/]*\)$§\1 \1§'` | |
240 | 349 | fi |
241 | 350 | |
242 | 351 | while true |
245 | 354 | test -z "$manpages" && error "No manpage exists for package '$package'." |
246 | 355 | |
247 | 356 | # select your manpages using dialog |
248 | exec 3>&1 | |
249 | return=`$cmd --title "Select a manpage ($status:$package)" --menu '' $y $x $h $manpages 2>&1 1>&3` | |
250 | exec 3>&- | |
357 | if [ "$cmd" = "zenity" ] | |
358 | then | |
359 | return=`$cmd --title="Debmany: $package" --text="Select a file ($status:$package)" --width=800 --height=600 --list --column=Path --column=File $manpages` | |
360 | else | |
361 | exec 3>&1 | |
362 | return=`$cmd --title "Select a file ($status:$package)" --menu '' $y $x $h $manpages 2>&1 1>&3` | |
363 | exec 3>&- | |
364 | fi | |
365 | ||
251 | 366 | if [ -n "$return" ] |
252 | 367 | then |
253 | 368 | # show the manpage |
254 | `printf "$mancmdline" "$PWD/$return"` | |
369 | if echo $return | grep -q usr/share/man | |
370 | then | |
371 | path=$(dirname `dirname "$return"`) | |
372 | file=`echo "$return"|sed "s§^$path/§§"` | |
373 | if [ "${return##/*}" ] # test relative path | |
374 | then | |
375 | # it is a temporary extracted archive | |
376 | debug "Going to manpage directory: $temp/$path" # comment | |
377 | cd "$temp/$path" | |
378 | else | |
379 | # installed manpage | |
380 | debug "Going to manpage directory: $path" # comment | |
381 | cd "$path" | |
382 | fi | |
383 | debug "Opening manpage file: "`printf "$mancmdline" "$PWD/$file"` # comment | |
384 | eval $(printf "$mancmdline" "$PWD/$file") | |
385 | cd - >/dev/null | |
386 | else | |
387 | # other file (usr/share/doc) | |
388 | debug "Opening other file: "`printf "$othercmdline" "$PWD/$return"` # comment | |
389 | eval $(printf "$othercmdline" "$PWD/$return") | |
390 | fi | |
255 | 391 | else |
256 | cd $curdir | |
392 | cd "$curdir" | |
257 | 393 | exit |
258 | 394 | fi |
259 | 395 | done |
260 | 396 | |
261 | # This should not be reached | |
262 | cd $curdir | |
263 | exit 0 |
0 | # debmany(1) completion | |
1 | # | |
2 | # Copy this file to ~/.bash_completion. | |
3 | # To activate bash completion for new logins configure ~/.bashrc | |
4 | # or simply source /etc/bash_completion to test it. | |
5 | # After a new login completion is done for | |
6 | # all parameters, | |
7 | # packages or filenames and folders. | |
8 | # | |
9 | have debmany && | |
10 | _debmany() | |
11 | { | |
12 | local cur prev setf | |
13 | ||
14 | COMPREPLY=() | |
15 | cur=${COMP_WORDS[COMP_CWORD]} | |
16 | prev=${COMP_WORDS[COMP_CWORD-1]} | |
17 | ||
18 | case "$prev" in | |
19 | -L) if echo "$cur" | grep -q ^"[0-9][0-9]*[KMGT]*"; then | |
20 | COMPREPLY=( $( compgen -W '`echo ${cur/[KMGT]/}{K,M,G,T}`' -- "$cur" ) ) | |
21 | else | |
22 | COMPREPLY=("100K" "50M" "5G" "1T") | |
23 | fi | |
24 | ;; | |
25 | -l) # show all possible languages from /usr/share/i18n/SUPPORTED | |
26 | setf=`echo $-` # remember switch f (shell filename completion) | |
27 | set -f | |
28 | COMPREPLY=( $( compgen -W '`sed -e "s/[@_. ].*//g" -e "s/$/*/" /usr/share/i18n/SUPPORTED|sort -u`' -- "$cur" ) ) | |
29 | echo "$setf"|grep -q f || set +f # switch back if needed | |
30 | ;; | |
31 | -m) case "${cur:0:1}" in | |
32 | \"|\') local manpageviewer="${cur:1}";; | |
33 | *) local manpageviewer="$cur";; | |
34 | esac | |
35 | COMP_WORDS=(COMP_WORDS[0] "$manpageviewer") | |
36 | COMP_CWORD=1 | |
37 | _command | |
38 | ;; | |
39 | -o) case "${cur:0:1}" in | |
40 | \"|\') local otherviewer="${cur:1}";; | |
41 | *) local otherviewer="$cur";; | |
42 | esac | |
43 | COMP_WORDS=(COMP_WORDS[0] "$otherviewer") | |
44 | COMP_CWORD=1 | |
45 | _command | |
46 | ;; | |
47 | *) if [[ "$cur" == -* ]]; then | |
48 | COMPREPLY=( $( compgen -W '-? -h --help -k -g -x -m -o -L -l -v -vv -z' -- "$cur" ) ) | |
49 | else | |
50 | COMPREPLY=( $( apt-cache pkgnames "$cur" 2> /dev/null; ) ) | |
51 | if [ ${#COMPREPLY[@]} -eq 0 ] | |
52 | then | |
53 | _filedir | |
54 | fi | |
55 | fi | |
56 | ;; | |
57 | esac | |
58 | ||
59 | return 0 | |
60 | } && | |
61 | complete -F _debmany $filenames debmany |
0 | # Changes for v1.3 | |
1 | ### fixed bugs | |
2 | # includes in manpages (".so") didn't work - example packages: bash: bash-builtins, ax25-tools:netrom-tools | |
3 | # solution: cd to extracted manpages before opening them | |
4 | # fixed detection of tmp-directory /dev/shm | |
5 | # working directory with space -> cd back gave an error | |
6 | # $TMPDIR wasn't implemented (forgotten) | |
7 | # corrected manpage | |
8 | # correct size calculation of file to download | |
9 | ### features | |
10 | # added debugging option (-v and -vv) | |
11 | # added usr/share/doc to view additional files | |
12 | # added option -o to overwrite the viewer for other files (not manpages) | |
13 | # added option -z to use a graphical dialog (zenity) instead of dialog or whiptail | |
14 | # improved bash_completion (maybe it will get in debian-goodies) | |
15 | # added a png-file for debmany (maybe it will get in debian-goodies) | |
16 | # with $TMPDIR you can specify the destination for temporary files | |
17 | # option -l changed: old: -l fr -> fr* new: -l fr -> fr | |
18 | # examples: -l de,fr -l "zh*" | |
19 | # improved manpages | |
20 | # check for parameter -k, -g and -x if kfmclient, gnome-open or xdg-open exists | |
21 | # added rounding for size calculation | |
22 | ### quality | |
23 | # added a checklist (comment in debmany) for new releases of debmany | |
24 | ### technical | |
25 | # removed search in usr/share/X11R6 (last seen in debian sarge) | |
26 | # small parts rewritten for better dash compatibility - remaining is marked "!dash" | |
27 | # less should be a dependency because it is the default viewer for other files | |
28 | # zenity should be a suggested package because it is a graphical alternative for dialog | |
29 | ### remaining but no reason to operate | |
30 | # blanks in filenames do not work - checked in debian etch: no packages found |
Binary diff not shown
0 | .TH "DEBMANY" "1" "1.2" "Michael Arlt" "User Commands" | |
0 | .TH "DEBMANY" "1" "1.3" "Michael Arlt" "User Commands" | |
1 | 1 | .SH "NAME" |
2 | debmany \- select manpages from installed packages, packages from the repository or .deb\-files for viewing using "man" or an alternative viewer. | |
2 | debmany \- select manpages or documentation files from installed packages, packages from the repository or .deb\-files for viewing using "man" resp. "less" or an alternative viewer. | |
3 | 3 | .SH "SYNOPSIS" |
4 | 4 | .B debmany |
5 | 5 | \fI\-\-help |
6 | 6 | .br |
7 | 7 | .B debmany |
8 | \fI[\-m manpageviewer|\-k|\-g|\-x] [\-L limit] [\-l lang1[,...]] [package|package.deb\fR | |
8 | \fI[\-v[v]] [\-k|\-g|\-x] [\-m manpageviewer] [\-o otherviewer] [\-L limit] [\-l lang1[,...]] package|package.deb\fR | |
9 | .br | |
10 | .B debmany | |
11 | \fI[\-v[v]] [\-k|\-g|\-x] [\-m manpageviewer] [\-o otherviewer] [\-L limit] [\-l lang1[,...]] \-z [package|package.deb]\fR | |
9 | 12 | .SH "DESCRIPTION" |
10 | 13 | .\" Add any additional description here |
11 | 14 | .PP |
12 | Select a manpage from a debian package for viewing with man or an alternative viewer. The list of manpages is displayed in a dialog. Supported locations for debian packages are: Local .deb\-file, a package in the repository or a installed package. | |
15 | Select a manpage or files at /usr/share/doc from a debian package for viewing with "man", "less" or an alternative viewer. The list of files is displayed in a dialog. Supported locations for debian packages are: Local .deb\-file, a package in the repository or a installed package. | |
13 | 16 | .TP |
14 | 17 | \fB\-\-help\fR |
15 | 18 | display a small help and exit |
19 | .TP | |
20 | \fB\-k\fR | |
21 | Display the manpage using your preferred viewer (must support .gz files) if you use KDE \- this is the short form of \-m 'kfmclient exec man:%s'. "kfmclient" is a part of the package "konqueror" (at least in Debian Etch). | |
22 | .TP | |
23 | \fB\-g\fR | |
24 | Display the manpage using your preferred viewer (must support .gz files) if you use GNOME \- this is the short form of \-m 'gnome\-open man:%s'. "gnome\-open" is a part of the package "libgnome2\-0" (at least in Debian Etch). | |
25 | .TP | |
26 | \fB\-x\fR | |
27 | Display the manpage using your preferred viewer (must support .gz files) if you use KDE/GNOME/Xfce \- this is the short form of \-m 'xdg\-open man:%s'. "xdg\-open" is a part of the package "xdg\-utils" (at least in Debian Etch). | |
16 | 28 | .TP |
17 | 29 | \fB\-m manpageviewer\fR |
18 | 30 | Optionally set a manpage viewer. The viewer must support .gz files. You must define the complete request. "%s" gets replaced with the path to the manpage. If "%s" is missing " %s" is appended to the manpageviewer. The manpageviewer must be enclosed with "" or '' \- see examples. |
19 | 31 | If you use a graphical viewer you must ensure that you have access to your desktop (if necessary: sux or ssh with x\-forwarding) |
20 | 32 | .TP |
21 | \fB\-k\fR | |
22 | Display the manpage using your preferred viewer (must support .gz files) if you use KDE \- this is the short form of \-m 'kfmclient exec man:%s'. "kfmclient" is a part of the package "konqueror". | |
23 | .TP | |
24 | \fB\-g\fR | |
25 | Display the manpage using your preferred viewer (must support .gz files) if you use GNOME \- this is the short form of \-m 'gnome\-open man:%s'. "gnome\-open" is a part of the package "libgnome2\-0". | |
26 | .TP | |
27 | \fB\-x\fR | |
28 | Display the manpage using your preferred viewer (must support .gz files) if you use KDE/GNOME/Xfce \- this is the short form of \-m 'xdg\-open man:%s'. "xdg\-open" is a part of the package "xdg\-utils". | |
33 | \fB\-o otherviewer\fR | |
34 | Optionally set a viewer for other files (/use/share/doc). | |
29 | 35 | .TP |
30 | 36 | \fB\-L limit\fR |
31 | 37 | If a file which must be downloaded exceeds the limit, you are asked if the download should start. Without unit the value is in bytes. You can append K, M, G or T to the value to change the unit. |
32 | 38 | .TP |
33 | 39 | \fB\-l lang1[,...]\fR |
34 | English manpages are displayed always. If you want more languages you can specify them here. Provide a comma separated list of the folder names in the manpgage folders (/usr/share/man,/usr/X11R6/man) \- e.g. de,fr or "*" if you want to see all languages. Folders with ".xyz" at the end (e.g. fr.ISO8859\-1) are automatically selected together with your choice (fr in this example). | |
40 | English manpages are displayed always. If you want more languages you can specify them here. Provide a comma separated list of the folder names in the manpgage folders (/usr/share/man) \- e.g. de,fr or "zh*" if you want to see all Chinese manpages (Simplified and Traditional Chinese as well). It is safe always to use "*" at the end of your language. | |
41 | During installation automatic generated character set based versions are not available for selection. | |
42 | .TP | |
43 | \fB\-z\fR | |
44 | Zenity (a graphical dialog) is used to select the files and if necessary to enter the package name. You must have the rights to start X\-programs. This option combined with the parameters \-k, \-g, \-x respectively \-m and \-o make it possible to use debmany without console. | |
35 | 45 | .PP |
36 | The manpages are temporarily extracted to /dev/shm (if the directory exists) or /tmp . You can override the path if you set and export the environment variable TMPDIR. | |
46 | The manpages are temporarily extracted to /dev/shm (if the directory exists) or /tmp . You can override the path if you set and export the environment variable TMPDIR or set it as a temporary variable. | |
37 | 47 | .PP |
38 | 48 | You need to have the debian package "whiptail" (preferred) or "dialog" as well as "curl" installed. |
39 | 49 | .SH "EXAMPLES" |
48 | 58 | Show all manpages from the local debian package "./test.deb" using man. |
49 | 59 | .TP |
50 | 60 | debmany \-k sc |
51 | Use your preferred man\-viewer (for KDE user) | |
61 | Use your preferred man\-viewer (for KDE user). | |
52 | 62 | .TP |
53 | 63 | debmany \-g sc |
54 | Use your preferred man\-viewer (for GNOME user) | |
64 | Use your preferred man\-viewer (for GNOME user). | |
55 | 65 | .TP |
56 | 66 | debmany \-x sc |
57 | Use your preferred man\-viewer (for KDE/GNOME/Xfce user) | |
67 | Use your preferred man\-viewer (for KDE/GNOME/Xfce user). | |
58 | 68 | .TP |
59 | debmany \-m 'konqueror man:%s' sc | |
60 | Use Konqueror as viewer | |
69 | debmany \-z \-k | |
70 | Uses "zenity" to select files and to enter the package name. | |
61 | 71 | .TP |
62 | alias debmany='debmany \-l de \-L 5M \-k'; debmany \-m man \-l "*" foo | |
72 | TMPDIR=~/tmp debmany \-m 'konqueror man:%s' sc | |
73 | Use ~/tmp as temporary folder and Konqueror as viewer. | |
74 | .TP | |
75 | alias debmany='debmany \-l de \-L 5M \-k'; debmany \-m man \-l "zh*" foo | |
63 | 76 | Set an alias with your preferred options and overwrite them if needed. |
77 | .TP | |
78 | vi /usr/local/bin/ask # after saving: chmod 755 ask | |
79 | #!/bin/dash | |
80 | .br | |
81 | read \-p "program to use: " pgm | |
82 | .br | |
83 | eval $pgm "$1" | |
84 | .br | |
85 | ||
86 | .br | |
87 | debmany \-o ask | |
88 | .br | |
89 | Every time you select other files from a package you will be asked which program to use. | |
64 | 90 | .SH "AUTHOR" |
65 | 91 | Written by Michael Arlt. |
66 | 92 | .SH "LICENSE" |
0 | .TH "DEBMANY" "1" "1.2" "Michael Arlt" "Dienstprogramme für Benutzer" | |
0 | .TH "DEBMANY" "1" "1.3" "Michael Arlt" "Dienstprogramme für Benutzer" | |
1 | 1 | .SH "NAME" |
2 | debmany \- Wählen von manpages aus installierten Paketen, Paketen des Repositories oder .deb\-Dateien zum Betrachten mit "man" oder einem alternativen Viewer. | |
2 | debmany \- Wählen von Manpages oder Dokumentationen aus installierten Paketen, Paketen des Repositories oder .deb\-Dateien zum Betrachten mit "man" bzw. "less" oder einem alternativen Viewer. | |
3 | 3 | .SH "SYNTAX" |
4 | 4 | .B debmany |
5 | 5 | \fI\-\-help |
6 | 6 | .br |
7 | 7 | .B debmany |
8 | \fI[\-m manpageviewer|\-k|\-g|\-x] [\-L Limit] [\-l Sprache1[,...]] Paket|Paket.deb\fR | |
8 | \fI[\-v[v]] [\-k|\-g|\-x] [\-m manpageviewer] [\-o otherviewer] [\-L Limit] [\-l Sprache1[,...]] Paket|Paket.deb\fR | |
9 | .br | |
10 | .B debmany | |
11 | \fI[\-v[v]] [\-k|\-g|\-x] [\-m manpageviewer] [\-o otherviewer] [\-L Limit] [\-l Sprache1[,...]] \-z [Paket|Paket.deb]\fR | |
9 | 12 | .SH "BESCHREIBUNG" |
10 | 13 | .\" Add any additional description here |
11 | 14 | .PP |
12 | Wählen Sie eine Manpage von einem Debian Paket um sie mit "man" oder einem alternativen Viewer zu betrachten. Die Liste der Manpages wird in einem Dialog dargestellt. Unterstützte Quellen für Debian Pakete sind: Lokale .deb\-Datei, ein Paket aus dem Repository oder ein installiertes Paket. | |
15 | Wählen Sie eine Manpage oder Dateien aus usr/share/doc von einem Debian Paket um sie mit "man" oder "less" bzw. einem alternativen Viewer zu betrachten. Die Liste der Dateien wird in einem Dialog dargestellt. Unterstützte Quellen für Debian Pakete sind: Lokale .deb\-Datei, ein Paket aus dem Repository oder ein installiertes Paket. | |
13 | 16 | .TP |
14 | 17 | \fB\-\-help\fR |
15 | 18 | zeigt eine kurze Hilfe und beendet sich |
16 | 19 | .TP |
20 | \fB\-k\fR | |
21 | Zeigt die Manpage im bevorzugten Viewer (muss .gz Dateien unterstützen) an, falls Sie KDE benutzen \- Kurzform von \-m 'kfmclient exec man:%s' bzw. 'kfmclient exec %s' für andere Dateien. "kfmclient" ist Teil des Paketes "konqueror" (zumindest in Debian Etch). | |
22 | .TP | |
23 | \fB\-g\fR | |
24 | Zeigt die Manpage im bevorzugten Viewer (muss .gz Dateien unterstützen) an, falls Sie GNOME benutzen \- Kurzform von \-m 'gnome\-open man:%s'. "gnome\-open" ist Teil des Paketes "libgnome2\-0" (zumindest in Debian Etch). | |
25 | .TP | |
26 | \fB\-x\fR | |
27 | Zeigt die Manpage im bevorzugten Viewer (muss .gz Dateien unterstützen) an, falls Sie KDE/GNOME/Xfce benutzen \- Kurzform von \-m 'xdg\-open man:%s'. "xdg\-open" ist Teil des Paketes "xdg\-utils" (zumindest in Debian Etch). | |
28 | .TP | |
17 | 29 | \fB\-m manpageviewer\fR |
18 | Setzt optional den Manpageviewer. Der Viewer muss .gz Dateien unterstützen. Es ist zu beachten, dass der komplette Aufruf formuliert werden muss. "%s" wird durch den Pfad zur Manpage ersetzt. Wenn "%s" fehlt wird " %s" an den Manpageviewer angehängt. Der Aufruf muss in "" oder '' gefasst werden \- siehe Beispiele. | |
30 | Überschreibt den Manpageviewer. Der Viewer muss .gz Dateien unterstützen. Es ist zu beachten, dass der komplette Aufruf formuliert werden muss. "%s" wird durch den Pfad zur Manpage ersetzt. Wenn "%s" fehlt wird " %s" an den Manpageviewer angehängt. Der Aufruf muss in "" oder '' gefasst werden \- siehe Beispiele. | |
19 | 31 | Bei der Benutzung eines grafischen Manpageviewers müssen Sie sicherstellen, dass Sie Zugriff auf den Desktop haben (ggf.: sux oder ssh mit x\-forwarding) |
20 | 32 | .TP |
21 | \fB\-k\fR | |
22 | Zeigt die Manpage im bevorzugten Viewer (muss .gz Dateien unterstützen) an, falls Sie KDE benutzen \- Kurzform von \-m 'kfmclient exec man:%s'. "kfmclient" ist Teil des Paketes "konqueror". | |
23 | .TP | |
24 | \fB\-g\fR | |
25 | Zeigt die Manpage im bevorzugten Viewer (muss .gz Dateien unterstützen) an, falls Sie GNOME benutzen \- Kurzform von \-m 'gnome\-open man:%s'. "gnome\-open" ist Teil des Paketes "libgnome2\-0". | |
26 | .TP | |
27 | \fB\-x\fR | |
28 | Zeigt die Manpage im bevorzugten Viewer (muss .gz Dateien unterstützen) an, falls Sie KDE/GNOME/Xfce benutzen \- Kurzform von \-m 'xdg\-open man:%s'. "xdg\-open" ist Teil des Paketes "xdg\-utils". | |
33 | \fB\-o otherviewer\fR | |
34 | Überschreibt den Viewer für sonstige Dateien (/usr/share/doc). | |
29 | 35 | .TP |
30 | 36 | \fB\-L Limit\fR |
31 | Überschreitet ein File, das per Download heruntergeladen werden muss, das Limit so werden Sie gefragt, ob der Download stattfinden soll. Ohne Angabe einer Einheit ist die Angabe in Bytes. Durch Anhängen der Buchstaben K, M, G der T kann die Einheit geändert werden. | |
37 | Überschreitet ein File, das per Download heruntergeladen werden muss, das Limit so werden Sie gefragt, ob der Download stattfinden soll. Ohne Angabe einer Einheit ist die Angabe in Bytes. Durch Anhängen der Buchstaben K, M, G oder T kann die Einheit geändert werden. | |
32 | 38 | .TP |
33 | 39 | \fB\-l Sprache1[,...]\fR |
34 | Englische Manpages werden immer angezeigt. Wenn Sie mehr Sprachen sehen wollen, so können Sie dies hier festlegen. Im Prinzip geben Sie hier eine mit Komma getrennte Liste der Ordner aus den Manpage Ordnern (/usr/share/man,/usr/X11R6/man) an \- z. B. de,fr oder "*" wenn Sie alle Sprachen sehen wollen. Ordner mit ".xyz" am Ende (z. B. fr.ISO8859\-1) werden automatisch durch Ihre Auswahl (fr in diesem Beispiel) selektiert. | |
40 | Englische Manpages werden immer angezeigt. Wenn Sie mehr Sprachen sehen wollen, so können Sie dies hier festlegen. Im Prinzip geben Sie hier eine mit Komma getrennte Liste der Ordner aus den Manpage Ordnern (/usr/share/man) an \- z. B. de,fr oder "zh*" wenn Sie alle chinesischen Manpages (sowohl das einfache "zh_CN" als auch das traditionelle Chinesisch "zh_TW") sehen wollen. Sicherheitshalber kann man auch immer "*" am Ende der Sprache anhängen. | |
41 | Bei der Installation ggf. dynamisch generierte zeichensatzbasierte Abwandlungen stehen nicht zur Auswahl. | |
42 | .TP | |
43 | \fB\-z\fR | |
44 | Zur Auswahl der Dateien und ggf. zur Eingabe des Paketes wird "zenity" (grafischer Dialog) verwendet. Hierzu muss man berechtigt sein, X\-Programme zu starten. Diese Option in Kombination mit den Parametern \-k, \-g, \-x bzw. \-m und \-o ermöglicht es, debmany ohne Console zu verwenden. | |
35 | 45 | .PP |
36 | Die Manpages werden temporär nach /dev/shm (sofern dieses Verzeichnis existiert) oder /tmp extrahiert. Durch das Setzen und Exportieren der Umgebungsvariable TMPDIR kann der Speicherort überschrieben werden. | |
46 | Die Manpages werden temporär nach /dev/shm (sofern dieses Verzeichnis existiert), /tmp oder /var/tmp extrahiert. Durch das Setzen und Exportieren der Umgebungsvariable TMPDIR bzw. das Setzen als temporären Variable kann der Speicherort überschrieben werden. | |
37 | 47 | .PP |
38 | 48 | Das Debian Paket "whiptail" (bevorzugt) oder "dialog" sowie "curl" muss installiert sein. |
39 | 49 | .SH "BEISPIELE" |
56 | 66 | debmany \-x sc |
57 | 67 | Benutzt den bevorzugten Manviewer (für KDE/GNOME/Xfce Anwender) |
58 | 68 | .TP |
59 | debmany \-m 'konqueror man:%s' sc | |
60 | Benutzt Konqueror als Viewer | |
69 | debmany \-z \-k | |
70 | Benutzt "zenity" um Dateien auszuwählen und Paketnamen einzugeben. | |
61 | 71 | .TP |
62 | alias debmany='debmany \-l de \-L 5M \-k'; debmany \-m man \-l "*" foo | |
72 | TMPDIR=~/tmp debmany \-m 'konqueror man:%s' sc | |
73 | Benutzt ~/tmp als temporären Ordner und Konqueror als Viewer | |
74 | .TP | |
75 | alias debmany='debmany \-l de \-L 5M \-k'; debmany \-m man \-l "zh*" foo | |
63 | 76 | Setzte einen Alias um die bevorzugten Optionen festzulegen. Diese können, wie man sieht, jederzeit überschrieben werden. |
77 | .TP | |
78 | vi /usr/local/bin/ask # nach dem Speichern: chmod 755 ask | |
79 | #!/bin/dash | |
80 | .br | |
81 | read \-p "Programm zum Öffnen: " pgm | |
82 | .br | |
83 | eval $pgm "$1" | |
84 | .br | |
85 | ||
86 | .br | |
87 | debmany \-o ask | |
88 | .br | |
89 | Beim Öffnen einer Datei aus usr/share/doc wird man nach dem Programm, mit dem man sie öffnen möchte, gefragt. | |
64 | 90 | .SH "AUTOR" |
65 | 91 | Geschrieben von Michael Arlt. |
66 | 92 | .SH "LIZENZ" |