#!/usr/bin/env python
# -*- mode: python -*-

from __future__ import print_function

import re, time, ldap, getopt, sys, pwd, os
from userdir_gpg import *
Output = "extrakeys.gpg"

# Process options
AdminUser = pwd.getpwuid(os.getuid())[0]
(options, arguments) = getopt.getopt(sys.argv[1:], "o:")
for (switch, val) in options:
   if (switch == '-o'):
      Output = val

if len(arguments) == 0:
   print("Give some keyrings to probe")
   os.exit(0)

# Popen GPG with the correct magic special options
Args = [GPGPath] + GPGBasicOptions
for x in arguments:
   Args.append("--keyring")
   if x.find("/") == -1:
      Args.append("./"+x)
   else:
      Args.append(x)
Args.append("--fast-list-mode")
Args.append("--list-sigs")
Args = Args + GPGSearchOptions + [" 2> /dev/null"]
Keys = os.popen(" ".join(Args),"r")

# Loop over the GPG key file
HaveKeys = {}
NeedKeys = {}
print("Reading keys+sigs from keyring")
while(1):
   Line = Keys.readline()
   if Line == "":
      break

   Split = Line.split(":")
   if len(Split) >= 8 and Split[0] == "pub":
      HaveKeys[Split[4]] = ""
      continue

   if len(Split) >= 5 and Split[0] == "sig":
      NeedKeys[Split[4]] = ""
      continue
Keys.close()

# Popen GPG with the correct magic special options
Args = [GPGPath] + GPGBasicOptions
for x in [Output]:
   Args.append("--keyring")
   if x.find("/") == -1:
      Args.append("./"+x)
   else:
      Args.append(x)
OldArgs = Args
Args = Args + GPGSearchOptions + [" 2> /dev/null"]
Keys = os.popen(" ".join(Args),"r")

print("Reading keys from output ring")
while(1):
   Line = Keys.readline()
   if Line == "":
      break

   Split = Line.split(":")
   if len(Split) >= 8 and Split[0] == "pub":
      HaveKeys[Split[4]] = ""
      continue
Keys.close()

KeysToFetch = []
for x in NeedKeys.keys():
   if not HaveKeys.has_key(x):
      KeysToFetch.append("0x"+x)

print("Have %u keys and %u sigs, need %u keys" % (len(HaveKeys), len(NeedKeys), len(KeysToFetch)))

Args = OldArgs
Args.append("--keyserver 18.43.0.48")
Args.append("--recv-keys")
I = len(KeysToFetch)
while (I > 0):
   OldI = I
   I = I - 20
   if I < 0: I = 0
   print(" ".join(Args + KeysToFetch[I:OldI]))
   Fetcher = os.popen(" ".join(Args+KeysToFetch[I:OldI]),"r")
   while(1):
      Line = Fetcher.readline()
      if Line == "":
         break
      print(Line)
   Fetcher.close()
