Index: pykota/trunk/CREDITS
===================================================================
--- pykota/trunk/CREDITS (revision 3275)
+++ pykota/trunk/CREDITS (revision 3336)
@@ -93,4 +93,5 @@
   - Jan Christoph Nordholz - T.U. Berlin - Explained the cause of a strange
     problem with MySQL connections to 'localhost:3306'.
+  - Darin Perusich - Cognigen Corp. - Ported the LDAP schema to Sun DS
 
 ==============================================================
Index: pykota/trunk/initscripts/ldap/README.ldap
===================================================================
--- pykota/trunk/initscripts/ldap/README.ldap (revision 3279)
+++ pykota/trunk/initscripts/ldap/README.ldap (revision 3336)
@@ -20,11 +20,12 @@
 
 Documentation :
----------------
+===============
 
-pykota.schema :
+OpenLDAP : 
+----------
 
-    This file can be used to modify an existing LDAP directory
-    to add the necessary object classes and attributes for use 
-    with PyKota.
+    The pykota.schema file can be used to modify an existing OpenLDAP 
+    directory to add the necessary object classes and attributes for 
+    use with PyKota.
     
     Include it in your LDAP server's configuration.
@@ -112,9 +113,19 @@
     NB: On Red Hat-based distros, use '/sbin/service ldap stop' and 
         '/sbin/service ldap start' instead.
+        
+Sun Directory Server :        
+----------------------
+
+    Use the pykota-schema-sunds.ldif file to make PyKota's LDAP schema known
+    to your Sun Directory Server :
     
-pykota-sample.ldif :
-
-    You can use this file to initialize an LDAP tree for PyKota, if
-    you want.
+    % ldapmodify -h sunds.domain.com -D "cn=Directory Manager" -f pykota-schema-sunds.ldif
+    
+    
+Initial datas :   
+===============
+    
+    You can use the pykota-sample.ldif file to initialize an LDAP tree 
+    for PyKota, if you want.
     
     The structure used in this file is NOT mandatory !
@@ -123,7 +134,7 @@
     
 To use an LDAP directory as the Quota Storage, just modify  
-/etc/pykota/pykota.conf to make it contain lines similar to the LDAP
+~pykota/pykota.conf to make it contain lines similar to the LDAP
 related ones in conf/pykota.conf.sample, but adapted to your
 own configuration. Also de-activate the PostgreSQL-related lines.
-    
+Don't forget to adapt ~pykota/pykotadmin.conf as well.    
 ============================================================
Index: pykota/trunk/initscripts/ldap/pykota-schema-sunds.ldif
===================================================================
--- pykota/trunk/initscripts/ldap/pykota-schema-sunds.ldif (revision 3336)
+++ pykota/trunk/initscripts/ldap/pykota-schema-sunds.ldif (revision 3336)
@@ -0,0 +1,308 @@
+# $Id: pykota.schema 1938 2006-01-26 15:25:44Z jerome $
+#
+# pykota-schema-sunds.ldif
+#
+# LDAP Schema for Pykota Quota System
+#
+# Written 2003-05-28 by Wayne Godoy and John Flynn <wgodoy =AT= ub -DOT- edu -DOT- bz>
+#
+# Modified by Jerome Alet 2003-06-01
+#
+# Adapted for Sun Directory Server by Darin Perusich
+#
+#       Implementaion Details:
+#
+#       % ldapmodify -h sunds.domain.com -D "cn=Directory Manager" -f pykota-schema-sunds.ldif
+#
+# 16868.x       => Conseil Internet & Logiciels Libres
+# 16868.1.x     => Pykota
+# 16868.1.1.x   => attributes
+# 16868.1.2.x   => classes
+#
+# Contributors : Leif Johansson - Stockholm University 
+#
+dn: cn=schema
+changetype: modify
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.1 NAME 'pykotaLimitBy'
+        DESC 'How to limit the user/group : quota or balance'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.2 NAME 'pykotaBalance'
+        DESC 'Current account balance for the user, float'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.3 NAME 'pykotaLifeTimePaid'
+        DESC 'Total money paid by the user to fill his account balance, float'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.4 NAME 'pykotaPricePerPage'
+        DESC 'Price per page for a printer, float'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.5 NAME 'pykotaPricePerJob'
+        DESC 'Price per job for a printer, float'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.6 NAME 'pykotaSoftLimit'
+        DESC 'Soft limit in maximal number of pages'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.7 NAME 'pykotaHardLimit'
+        DESC 'Hard limit in maximal number of pages'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.8 NAME 'pykotaDateLimit'
+        DESC 'Date at which the soft limit becomes a hard one'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.9 NAME 'pykotaPageCounter'
+        DESC 'Current page counter for the user on a particular printer'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.10 NAME 'pykotaLifePageCounter'
+        DESC 'Total page counter for the user on a particular printer'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.11 NAME 'pykotaJobId'
+        DESC 'Id of a job in a printer history of jobs'
+        EQUALITY caseExactIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.12 NAME 'pykotaPrinterPageCounter'
+        DESC 'Life time page counter of a printer when the job began'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.13 NAME 'pykotaJobSize'
+        DESC 'Current job size in number of pages in the history'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.14 NAME 'pykotaAction'
+        DESC 'Was the job allowed, denied, warned, cancelled or failed : ( "ALLOW" |  "DENY" | "WARN" | "CANCEL" | "PROBLEM" )'
+        EQUALITY caseExactIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.15 NAME 'pykotaPrinterName'
+        DESC 'PyKota printer name as received from the printing subsystem'
+        EQUALITY caseExactIA5Match
+        SUBSTR caseExactIA5SubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.16 NAME 'pykotaUserName'
+        DESC 'PyKota user name'
+        EQUALITY caseExactIA5Match
+        SUBSTR caseExactIA5SubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.17 NAME 'pykotaGroupName'
+        DESC 'PyKota group name'
+        EQUALITY caseExactIA5Match
+        SUBSTR caseExactIA5SubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.18 NAME 'pykotaLastJobIdent'
+        DESC 'Identifies the last job in the history'
+        EQUALITY caseExactIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.19 NAME 'pykotaFileName'
+        DESC 'Print job filename'
+        EQUALITY caseExactMatch
+        SUBSTR caseExactSubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.20 NAME 'pykotaTitle'
+        DESC 'Print job title'
+        EQUALITY caseIgnoreMatch
+        SUBSTR caseIgnoreSubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.21 NAME 'pykotaCopies'
+        DESC 'Number of copies of the current print job'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.22 NAME 'pykotaOptions'
+        DESC 'Print job options'
+        EQUALITY caseIgnoreMatch
+        SUBSTR caseIgnoreSubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.23 NAME 'pykotaJobPrice'
+        DESC 'Price of a particular job in the history, float'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.24 NAME 'pykotaHostName'
+        DESC 'The host the job is coming from'
+        EQUALITY caseIgnoreMatch
+        SUBSTR caseIgnoreSubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.25 NAME 'pykotaJobSizeBytes'
+        DESC 'Current job size in number of bytes in the history'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.26 NAME 'pykotaPayments'
+        DESC 'Stores all payments made by an user, encoded to store both date and amount, separated by a # between two spaces'
+        EQUALITY caseExactIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.27 NAME 'pykotaOverCharge'
+        DESC 'OverCharging factor for a particular user, float'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.28 NAME 'pykotaWarnCount'
+        DESC 'Number of times the user was warned because a banner was denied'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.29 NAME 'pykotaMD5Sum'
+        DESC 'MD5 Sum of the job datas'
+        EQUALITY caseExactIA5Match
+        SUBSTR caseExactIA5SubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.30 NAME 'pykotaPages'
+        DESC 'Descriptor for each page settings in the history'
+        EQUALITY caseExactIA5Match
+        SUBSTR caseExactIA5SubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.31 NAME 'pykotaPrinterCoefficient'
+        DESC 'Coefficient for a particular page format. Contains label # coeff, e.g. A3 # 2.0'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.32 NAME 'pykotaBillingCode'
+        DESC 'Optional billing code for the print job'
+        EQUALITY caseIgnoreMatch
+        SUBSTR caseIgnoreSubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.33 NAME 'pykotaPrecomputedJobSize'
+        DESC 'Precomputed job size in number of pages in the history'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.34 NAME 'pykotaPrecomputedJobPrice'
+        DESC 'Precomputed Price of a particular job in the history, float'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.35 NAME 'pykotaMaxJobSize'
+        DESC 'Maximum size allowed for a job'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+-
+add: attributeTypes
+attributeTypes: ( 1.3.6.1.4.1.16868.1.1.36 NAME 'pykotaPassThrough'
+        DESC 'Indicates if the printer is in pass through mode'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+-
+add: objectClasses
+objectClasses: ( 1.3.6.1.4.1.16868.1.2.1 NAME 'pykotaAccount' SUP top AUXILIARY
+        DESC 'PyKota Auxiliary User Account'
+        MUST ( uid )
+        MAY  ( pykotaUserName $ pykotaLimitBy $ mail $ description ) )
+-
+add: objectClasses
+objectClasses: ( 1.3.6.1.4.1.16868.1.2.2 NAME 'pykotaGroup' SUP top AUXILIARY
+        DESC 'PyKota Auxiliary Group'
+        MUST ( cn )
+        MAY  ( pykotaGroupName $ pykotaLimitBy $ memberUid $ uniqueMember $ member $ description ) )
+-
+add: objectClasses
+objectClasses: ( 1.3.6.1.4.1.16868.1.2.3 NAME 'pykotaPrinter' SUP top AUXILIARY
+        DESC 'PyKota Printer'
+        MUST ( cn )
+        MAY  ( pykotaMaxJobSize $ pykotaPassThrough $ description $ pykotaPrinterName $ pykotaPricePerPage $ pykotaPricePerJob $ pykotaPrinterCoefficient $ uniqueMember ) )
+-
+add: objectClasses
+objectClasses: ( 1.3.6.1.4.1.16868.1.2.4 NAME 'pykotaUserPQuota' SUP top AUXILIARY
+        DESC 'PyKota User Quota on a Printer'
+        MUST ( cn $ pykotaUserName $ pykotaPrinterName )
+        MAY  ( pykotaMaxJobSize $ pykotaPageCounter $ pykotaLifePageCounter $ pykotaSoftLimit $ pykotaHardLimit $ pykotaDateLimit $ pykotaWarnCount ) )
+-
+add: objectClasses
+objectClasses: ( 1.3.6.1.4.1.16868.1.2.5 NAME 'pykotaGroupPQuota' SUP top AUXILIARY
+        DESC 'PyKota Group Quota on a Printer'
+        MUST ( cn $ pykotaGroupName $ pykotaPrinterName )
+        MAY  ( pykotaMaxJobSize $ pykotaSoftLimit $ pykotaHardLimit $ pykotaDateLimit ) )
+-
+add: objectClasses
+objectClasses: ( 1.3.6.1.4.1.16868.1.2.6 NAME 'pykotaJob' SUP top AUXILIARY
+        DESC 'An entry in the job history for a printer'
+        MUST ( cn $ pykotaUserName $ pykotaPrinterName $ pykotaJobId )
+        MAY  ( pykotaPrecomputedJobPrice $ pykotaPrecomputedJobSize $ pykotaBillingCode $ pykotaPrinterPageCounter $ pykotaJobSize $ pykotaAction $ pykotaJobPrice $ pykotaFileName $ pykotaTitle $ pykotaCopies $ pykotaOptions $ pykotaHostName $ pykotaJobSizeBytes $ pykotaMD5Sum $ pykotaPages ) )
+-
+add: objectClasses
+objectClasses: ( 1.3.6.1.4.1.16868.1.2.7 NAME 'pykotaAccountBalance' SUP top AUXILIARY
+        DESC 'PyKota User account balance'
+        MAY  ( pykotaUserName $ pykotaBalance $ pykotaLifeTimePaid $ pykotaOverCharge $ pykotaPayments ) )
+-
+add: objectClasses
+objectClasses: ( 1.3.6.1.4.1.16868.1.2.8 NAME 'pykotaLastJob' SUP top AUXILIARY
+        DESC 'Last job information for a printer'
+        MUST ( pykotaLastJobIdent )
+        MAY ( pykotaPrinterName ) ) 
+-
+add: objectClasses
+objectClasses: ( 1.3.6.1.4.1.16868.1.2.10 NAME 'pykotaBilling' SUP top AUXILIARY
+        DESC 'Allowed billing codes'
+        MUST ( cn $ pykotaBillingCode )
+        MAY ( pykotaPageCounter $ pykotaBalance $ description ) )
+-
+add: objectClasses
+objectClasses: ( 1.3.6.1.4.1.16868.1.2.9 NAME 'pykotaObject' SUP top STRUCTURAL
+        DESC 'PyKota Object'
+        MUST ( cn ) )
