#!/usr/bin/env python

import os
import shutil
import subprocess
import sys

key_types = ('dsa', 'ecdsa', 'ed25519', 'rsa')

def main(output_dir):
  # make sure the output directory exists
  if not os.path.exists(output_dir):
    os.makedirs(output_dir)

  for key_type in key_types:
    key_file = os.path.join(output_dir, 'ssh_host_%s_key' % key_type)
    if not os.path.exists(key_file):
      # generate new host key
      subprocess.check_call(['ssh-keygen', '-q', '-t', key_type, '-f', key_file, '-N', '', '-C', ''])

  authorized_keys = os.path.join(output_dir, 'authorized_keys')
  if not os.path.exists(authorized_keys):
    # pick the most recent ~/.ssh/*.pub that isn't ~/.ssh/*-cert.pub
    # this is what ssh-copy-id does
    dot_ssh = os.path.join(os.environ['HOME'], '.ssh')
    files = [os.path.join(dot_ssh, f) for f in os.listdir(dot_ssh) if f.endswith('.pub') and not f.endswith('-cert.pub')]
    if len(files) == 0:
      raise Exception('No SSH public keys found in ~/.ssh')
    if len(files) > 1:
      files.sort(key=lambda f: os.path.getmtime(f))
    shutil.copyfile(files[-1], os.path.join(authorized_keys))


if __name__ == '__main__':
  assert len(sys.argv) == 2
  main(sys.argv[1])
