- # hash userid for cache file name
- userIDHash=$(echo "$userID" | sha1sum | awk '{ print $1 }')
-
- # make sure the cache directory exists
- mkdir -p "$cacheDir"
-
- # touch/clear key cache file
- # (will be left empty if there are noacceptable keys)
- > "$cacheDir"/"$userIDHash"."$pubKeyID"
-
- # for each acceptable key, write an ssh key line to the
- # key cache file
- if [ "$keyOK" -a "$uidOK" -a "${keyIDs[*]}" ] ; then
- for keyID in ${keyIDs[@]} ; do
- log " acceptable key/uid found."
-
- if [ "$MODE" = 'known_hosts' ] ; then
- # export the key
- gpg2known_hosts "$keyID" "$userID" >> \
- "$cacheDir"/"$userIDHash"."$pubKeyID"
- # hash the cache file if specified
- if [ "$HASH_KNOWN_HOSTS" ] ; then
- ssh-keygen -H -f "$cacheDir"/"$userIDHash"."$pubKeyID" > /dev/null 2>&1
- rm "$cacheDir"/"$userIDHash"."$pubKeyID".old
+# process hosts in the known_host file
+process_hosts_known_hosts() {
+ local host
+ local userID
+ local ok
+ local keyid
+ local tmpfile
+
+ # create a lockfile on known_hosts
+ lockfile-create "$KNOWN_HOSTS"
+
+ for host ; do
+ log "processing host: $host"
+
+ userID="ssh://${host}"
+
+ process_user_id "ssh://${host}" | \
+ while read -r ok keyid ; do
+ sshKey=$(gpg2ssh "$keyid")
+ # remove the old host key line
+ remove_line "$KNOWN_HOSTS" "$sshKey"
+ # if key OK, add new host line
+ if [ "$ok" -eq '0' ] ; then
+ # hash if specified
+ if [ "$HASH_KNOWN_HOSTS" = 'true' ] ; then
+ # FIXME: this is really hackish cause ssh-keygen won't
+ # hash from stdin to stdout
+ tmpfile=$(mktemp)
+ ssh2known_hosts "$host" "$sshKey" > "$tmpfile"
+ ssh-keygen -H -f "$tmpfile" 2> /dev/null
+ cat "$tmpfile" >> "$KNOWN_HOSTS"
+ rm -f "$tmpfile" "${tmpfile}.old"
+ else
+ ssh2known_hosts "$host" "$sshKey" >> "$KNOWN_HOSTS"