#!/usr/bin/env python # -*- mode: python -*- # Copyright (c) 1999-2000 Jason Gunthorpe # Copyright (c) 2004 Joey Schulze # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # 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 string, 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(LDAPServer, 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.";