5 ### (c) 2011 Mark Wooding
8 ###----- Licensing notice ---------------------------------------------------
10 ### This file is part of the distorted.org.uk key management suite.
12 ### distorted-keys is free software; you can redistribute it and/or modify
13 ### it under the terms of the GNU General Public License as published by
14 ### the Free Software Foundation; either version 2 of the License, or
15 ### (at your option) any later version.
17 ### distorted-keys is distributed in the hope that it will be useful,
18 ### but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 ### GNU General Public License for more details.
22 ### You should have received a copy of the GNU General Public License
23 ### along with distorted-keys; if not, write to the Free Software Foundation,
24 ### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 case "${KEYSLIB+t}" in t
) ;; *) echo >&2 "$0: KEYSLIB unset"; exit 1 ;; esac
28 .
"$KEYSLIB"/keyfunc.sh
31 [-Ha] [-C COLUMN,...] [-u USER] [PATTERN ...]
32 List stored keys. If PATTERNs are given, only list keys whose labels match
36 -H Don't show the column headings (useful for scripts).
37 -C COLUMN,... Select the columns to show.
38 -a Show keys owned by all users.
39 -u USER Show keys owned by USER.
41 A COLUMN spec consists of a column name and an optional column width,
42 separated by a colon. The widths of omitted columns are computed
46 flags Various flags for the key. (Unset flags are shown as \`.')
47 R key has recovery information
48 ! key nub needs recovery
49 label The key's label (relative to its owner).
50 profile The key's profile name.
51 recov Recovery key labels, comma-separated.
54 ###--------------------------------------------------------------------------
58 defcol
() { ALLCOLS
=${ALLCOLS:+$ALLCOLS,}$1; }
66 for i
in recov
/*/current
/$label.recov
; do
67 if [ -f
"$i" ]; then rflag
=R
; break; fi
72 if [ -f nub
/$label ]; then bangflag
=.
; fi
83 nil
,$USERV_USER*) plabel
=${label#*/} ;;
84 t
,*) plabel
=${label%%/*}:${label#*/} ;;
103 if [ -f
"$i/current/$label.recov" ]; then
104 recov
=${recov:+$recov,}${i#recov/}
110 ###--------------------------------------------------------------------------
113 ## Parse the command-line options. Remaining arguments are glob patterns.
118 while getopts "HaC:u:" opt
; do
127 shift $
(( $OPTIND - 1 ))
128 case $# in 0) set "*" ;; esac
131 ## First pass: validate the column specifications. Translate all bare column
132 ## names into explicit `NAME+0' forms. Decide whether we need a width-
139 ## Pick off the next column name. If none are left, leave the loop.
141 *,*) col=${cc%%,*} cc
=${cc#*,} ;;
146 ## Extract the column name for later.
149 ## If we have a minimum width or no width, we need a measuring pass.
150 case "$col" in *[:=]*) ;; *) calcwd
=t
;; esac
152 ## Check the column width is valid. Build the new column list with
157 wdcols
=${wdcols:+$wdcols,}$col
158 checknumber
"column width" "$wd"
161 wdcols
=${wdcols:+$wdcols,}$col+0
165 ## Check the column name.
168 *) echo >&2 "$quis: unknown column \`$name'"; exit 1 ;;
172 ## Second and third pass: find the keys, compute their properties and either
173 ## measure column widths or display the results.
176 ## Decide whether we need to display a header. (We need this on both
177 ## passes, because it may contribute to width.)
180 ## Find the metadata files. This tells us where the keys are.
183 nil
) dir
=store
/$user ;;
185 metas
=$
(find store
-type f
-name meta
)
187 ## Work through the keys we found.
190 ## If we're not doing a header line, read the next metadata file name.
191 ## Check that it matches at least one pattern.
194 if ! read meta
; then break; fi
195 label
=${meta#store/}; label
=${label%/meta}
198 case "$label" in $pat) matchp
=t
; break ;; esac
200 case $matchp in nil
) continue ;; esac
204 ## Now iterate over the columns. If we're calculating widths, use the
205 ## ones we worked out last time, and clear the list so we can build a new
207 case $calcwd in t
) cols
=$wdcols ;; esac
208 cc
=$cols wdcols
="" sep
=""
211 ## Pick off the next column spec.
213 *,*) col=${cc%%,*} cc
=${cc#*,} ;;
218 ## Work out the column name.
219 name
=${col%[:=+]*} wd
=${col#*[:=+]}
221 ## Work out the value. If this is a header line, then it's just the
222 ## column name in upper case; otherwise we have work to do.
224 t
) value
=$
(echo $name |
tr a-z A-Z
) ;;
225 nil
) value
=$
(col_
$name $label) ;;
228 ## Work out what to do about it. If we're measuring, then update our
229 ## idea of the column width. If we're printing, work out a format.
232 wdcols
=${wdcols:+$wdcols,}$col
235 colwd
=$
(( $
(echo "$value" |
wc -c
) - 1 ))
236 if [ $colwd -gt
$wd ]; then wd
=$colwd; fi
237 wdcols
=${wdcols:+$wdcols,}$name+$wd
247 ## If we're printing, then print something. Leave space between the
249 case $calcwd in nil
) printf "$sep$fmt" "$value"; sep
=" " ;; esac
252 ## The next line will certainly not be a header.
255 ## Start a new line if we're printing.
256 case $calcwd in nil
) printf "\n" ;; esac
261 ## If we were measuring, go round again and print; otherwise we're done.
268 ###----- That's all, folks --------------------------------------------------