]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - contrib/kh2reg.py
Make kh2reg.py compatible with modern Python.
[PuTTY.git] / contrib / kh2reg.py
index c6752eb3fee47e7159cba9b079b65239cbf6315b..7904d65eb702ec4d934712289e2375641da3e5d8 100755 (executable)
@@ -1,15 +1,15 @@
 #! /usr/bin/env python
 
-# $Id: kh2reg.py,v 1.2 2003/10/14 23:23:28 jacob Exp $
 # Convert OpenSSH known_hosts and known_hosts2 files to "new format" PuTTY
 # host keys.
 #   usage:
-#     kh2reg.py [ -win ] known_hosts1 2 3 4 ... > hosts.reg
+#     kh2reg.py [ --win ] known_hosts1 2 3 4 ... > hosts.reg
 #       Creates a Windows .REG file (double-click to install).
-#     kh2reg.py -unix    known_hosts1 2 3 4 ... > sshhostkeys
+#     kh2reg.py --unix    known_hosts1 2 3 4 ... > sshhostkeys
 #       Creates data suitable for storing in ~/.putty/sshhostkeys (Unix).
 # Line endings are someone else's problem as is traditional.
-# Developed for Python 1.5.2.
+# Originally developed for Python 1.5.2, but probably won't run on that
+# any more.
 
 import fileinput
 import base64
@@ -64,6 +64,13 @@ if output_type == 'windows':
 [HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys]
 """)
 
+class BlankInputLine(Exception):
+    pass
+
+class UnknownKeyType(Exception):
+   def __init__(self, keytype):
+       self.keytype = keytype
+
 # Now process all known_hosts input.
 for line in fileinput.input(args):
 
@@ -73,7 +80,7 @@ for line in fileinput.input(args):
 
         # Skip blanks and comments
         if line == '' or line[0] == '#':
-            raise "Skipping input line"
+            raise BlankInputLine
 
         # Split line on spaces.
         fields = string.split (line, ' ')
@@ -87,7 +94,7 @@ for line in fileinput.input(args):
         # is second field entirely decimal digits?
         if re.match (r"\d*$", fields[1]):
 
-            # Treat as SSH1-type host key.
+            # Treat as SSH-1-type host key.
             # Format: hostpat bits10 exp10 mod10 comment...
             # (PuTTY doesn't store the number of bits.)
             magicnumbers = map (long, fields[2:4])
@@ -95,7 +102,7 @@ for line in fileinput.input(args):
 
         else:
 
-            # Treat as SSH2-type host key.
+            # Treat as SSH-2-type host key.
             # Format: hostpat keytype keyblob64 comment...
             sshkeytype, blob = fields[1], base64.decodestring (fields[2])
 
@@ -120,7 +127,7 @@ for line in fileinput.input(args):
             if   sshkeytype == "ssh-rsa":   keytype = "rsa2"
             elif sshkeytype == "ssh-dss":   keytype = "dss"
             else:
-                raise "Unknown SSH key type", sshkeytype
+                raise UnknownKeyType(sshkeytype)
 
         # Now print out one line per host pattern, discarding wildcards.
         for host in string.split (hostpat, ','):
@@ -128,10 +135,17 @@ for line in fileinput.input(args):
                 sys.stderr.write("Skipping wildcard host pattern '%s'\n"
                                  % host)
                 continue
+            elif re.match (r"\|", host):
+                sys.stderr.write("Skipping hashed hostname '%s'\n" % host)
+                continue
             else:
-                # Slightly bizarre key format: 'type@port:hostname'
-                # As far as I know, the input never specifies a port.
-                port = 22
+                m = re.match (r"\[([^]]*)\]:(\d*)$", host)
+                if m:
+                    (host, port) = m.group(1,2)
+                    port = int(port)
+                else:
+                    port = 22
+                # Slightly bizarre output key format: 'type@port:hostname'
                 # XXX: does PuTTY do anything useful with literal IP[v4]s?
                 key = keytype + ("@%d:%s" % (port, host))
                 value = string.join (map (longtohex, magicnumbers), ',')
@@ -144,7 +158,7 @@ for line in fileinput.input(args):
                     sys.stdout.write("\"%s\"=\"%s\"\n"
                                      % (winmungestr(key), value))
 
-    except "Unknown SSH key type", k:
-        sys.stderr.write("Unknown SSH key type '%s', skipping\n" % k)
-    except "Skipping input line":
+    except UnknownKeyType, k:
+        sys.stderr.write("Unknown SSH key type '%s', skipping\n" % k.keytype)
+    except BlankInputLine:
         pass