#!/usr/bin/env python
# -*- mode: python -*-
# Generate an xearth database from the LDAP entries
# LDAP entires for lat/long can be in one of 3 different formats
#    1) Decimal Degrees
#        +-DDD.DDDDDDDDDDDDDDD
#    2) Degrees Minutes (DGM), common output from GPS units
#        +-DDDMM.MMMMMMMMMMMMM
#    3) Degrees Minutes Seconds (DGMS)
#        +-DDDMMSS.SSSSSSSSSSS
# Decimal Degrees is the most basic format, but to have good accuracy it
# needs a large number of decimals. The other formats are all derived from it:
#  DGM -> DD   DDD + (MM.MMMMMMMM)/60
#  DGMS -> DD  DDD + (MM + (SS.SSSSSS)/60)/60
# For Latitude + is North, for Longitude + is East

import re, time, ldap, getopt, sys, pwd, os, posix;
from userdir_ldap import *;

Anon = 0;

# Main program starts here
User = pwd.getpwuid(posix.getuid())[0];
BindUser = User;
(options, arguments) = getopt.getopt(sys.argv[1:], "au:")
for (switch, val) in options:
   if (switch == '-u'):
      User = val;
   if (switch == '-a'):
      Anon = 1;

# Connect to the ldap server
l = passwdAccessLDAP(BaseDn, User)

Attrs = l.search_s(BaseDn,ldap.SCOPE_ONELEVEL,"latitude=*",\
         ["uid","cn","mn","sn","latitude","longitude"]);

Attrs.sort();

print "Markers file will be written to markers.dat,",
sys.stdout.flush();
F = open("markers.dat","w");
Count = 0;
Failed = 0;
for x in Attrs:
   if x[1].has_key("latitude") == 0 or x[1].has_key("longitude") == 0:
      continue;
   Count = Count + 1;
   try:
      if Anon != 0:
         F.write("%8s %8s \"\"\n"%(DecDegree(GetAttr(x,"latitude"),Anon),DecDegree(GetAttr(x,"longitude"),Anon)));
      else:
         F.write("%16s %16s \"%s\" \t# %s\n"%(DecDegree(GetAttr(x,"latitude"),Anon),DecDegree(GetAttr(x,"longitude"),Anon),GetAttr(x,"uid"),EmailAddress(x)));
   except:
      Failed = Failed + 1;
      if Anon == 0:
         F.write("# Failed %s => %s: %s\n" %(x[0],sys.exc_type,sys.exc_value));
      else:
         F.write("# Failed => %s: %s\n" %(sys.exc_type,sys.exc_value));
F.close();
print Count,"entries,",Failed,"failures.";
