#!/usr/bin/python

## ssh-known-hosts-sort : v0.1

## http://devsec.org/software/misc/

## ssh-known-hosts-sort can sort/group your ssh2 known_hosts pubkeys
##
## I use it like this:
##
##   ./ssh-known-hosts-sort < ~/.ssh/known_hosts > ~/.ssh/known_hosts.tmp \
##     && mv -f ~/.ssh/known_hosts.tmp ~/.ssh/known_hosts
##
## - Thor Kooda
##   2007-01-30


import sys

pubkeys = {}

for line in sys.stdin:
    line = line.strip()
    if line[0] == "#" or line == "\n":
        continue
    try:
        hostnames, bits, exponent = line.split(" ",3)
    except ValueError:
        print >> sys.stderr, "warning: invalid line:", line ,
        continue
    if not exponent in pubkeys:
        pubkeys[exponent] = {}
        pubkeys[exponent]["hostnames"] = hostnames.lower().split(",")
        pubkeys[exponent]["bits"] = bits
    else:
        for hostname in hostnames.split(","):
            if hostname not in pubkeys[exponent]["hostnames"]:
                pubkeys[exponent]["hostnames"].append( hostname )

publist = []
for exponent in pubkeys:
    # sort hostnames for each pubkey
    pubkeys[exponent]["hostnames"].sort()
    publist.append( ( ",".join( pubkeys[exponent]["hostnames"] ),
                      pubkeys[exponent]["bits"],
                      exponent ) )

# sort pubkeys by previously sorted hostnames
publist.sort()

# print pubkeys
for pubkey in publist:
    print " ".join( pubkey )

