3 # Convert SQL user database to LDIF format (for SourceForge LDAP schema)
4 # by pfalcon@users.sourceforge.net 2000-10-17
6 # ./sql2ldif.pl : Dump only top-level ou map
7 # ./sql2ldif.pl --full : Dump full database (ouch!)
13 #my($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwnam("gforge");
16 #require("base64.pl"); # Include all the predefined functions
17 my $source_path = `forge_get_config source_path`;
20 require ("$source_path/lib/include.pl") ; # Include all the predefined functions
22 $chroot = forge_get_config ('chroot');
25 if ( "$sys_dbname" ne "gforge" || "$sys_dbuser" ne "gforge" ) {
26 $dbh ||= DBI->connect("DBI:Pg:dbname=$sys_dbname","$sys_dbuser","$sys_dbpasswd");
28 $dbh ||= DBI->connect("DBI:Pg:dbname=$sys_dbname","$sys_dbuser","$sys_dbpasswd");
30 die "Cannot connect to database: $!" if ( ! $dbh );
33 # Dump user entries (ou=People)
36 # We give user maximum of privileges assigned to one by groups ;-(
38 SELECT nss_passwd.login,gecos,shell,nss_shadow.passwd,uid,gid,email
39 FROM nss_passwd,nss_shadow,mta_users
40 WHERE nss_passwd.login=mta_users.login AND nss_passwd.login=nss_shadow.login
41 GROUP BY nss_passwd.login,gecos,shell,nss_shadow.passwd,uid,gid,email
43 my $rel = $dbh->prepare($query);
46 print "$sys_ldap_host\n";
47 print "$sys_ldap_base_dn\n";
48 my $sys_ldap_base_dn="dc=fb14srv1,dc=hpi,dc=uni-potsdam,dc=de";
51 while(my ($username, $realname, $shell, $pw, $uid, $gid, $email) = $rel->fetchrow()) {
52 print "dn: uid=$username,ou=People,$sys_ldap_base_dn\n";
53 #CB# To have the same id than generated by new_parse
54 print "uid: $username\n";
55 if (!$realname) { $realname='?'; }
56 $realname=~tr#\x80-\xff#?#; # it should be UTF-8 encoded, we just drop non-ascii chars
59 objectClass: posixAccount
61 objectClass: shadowAccount
62 objectClass: debGforgeAccount
64 print "userPassword: {crypt}$pw
65 shadowLastChange: 10879
71 homeDirectory: $chroot/home/users/$username
73 debGforgeForwardEmail: $email
79 # Dump group entries (ou=Group)
86 my $rel = $dbh->prepare($query);
89 while(my ($gid, $groupname) = $rel->fetchrow()) {
95 my $rel = $dbh->prepare($query);
98 #CB# To have the same id than generated by new_parse
99 print "dn: cn=$groupname,ou=Group,$sys_ldap_base_dn
100 objectClass: posixGroup
103 userPassword: {crypt}x
107 while(my ($username) = $rel->fetchrow()) {
108 print "memberUid: $username\n";
114 # Dump mailing-lists entries (ou=mailingList)
117 $query = "SELECT list_name,
129 $rel = $dbh->prepare($query);
132 while(my ($listname, $post, $owner, $request, $admin, $bounces, $confirm, $join, $leave, $subscribe, $unsubscribe) = $rel->fetchrow()) {
133 print "dn: cn=$listname,ou=mailingList,$sys_ldap_base_dn
134 objectClass: debGforgeMailingListMM21
136 objectClass: organizationalUnit
139 debGforgeListPostAddress: \"$post\"
140 debGforgeListOwnerAddress: \"$owner\"
141 debGforgeListRequestAddress: \"$request\"
142 debGforgeListAdminAddress: \"$admin\"
143 debGforgeListBouncesAddress: \"$bounces\"
144 debGforgeListConfirmAddress: \"$confirm\"
145 debGforgeListJoinAddress: \"$join\"
146 debGforgeListLeaveAddress: \"$leave\"
147 debGforgeListSubscribeAddress: \"$subscribe\"
148 debGforgeListUnsubscribeAddress: \"$unsubscribe\"
159 my $dc=$sys_ldap_base_dn;
162 print "dn: ou=Hosts,$sys_ldap_base_dn
165 objectClass: organizationalUnit
166 objectClass: domainRelatedObject
167 associatedDomain: $sys_default_domain
169 dn: ou=People,$sys_ldap_base_dn
172 objectClass: organizationalUnit
173 objectClass: domainRelatedObject
174 associatedDomain: $sys_default_domain
176 dn: ou=Aliases,$sys_ldap_base_dn
179 objectClass: organizationalUnit
180 objectClass: domainRelatedObject
181 associatedDomain: $sys_default_domain
183 dn: ou=Group,$sys_ldap_base_dn
186 objectClass: organizationalUnit
187 objectClass: domainRelatedObject
188 associatedDomain: $sys_default_domain
190 dn: ou=cvsGroup,$sys_ldap_base_dn
193 objectClass: organizationalUnit
194 objectClass: domainRelatedObject
195 associatedDomain: $sys_default_domain
197 dn: ou=mailingList,$sys_ldap_base_dn
200 objectClass: organizationalUnit
201 objectClass: domainRelatedObject
202 associatedDomain: $sys_lists_host
204 dn: uid=dummy,ou=People,$sys_ldap_base_dn
208 objectClass: posixAccount
210 objectClass: shadowAccount
211 objectClass: debGforgeAccount
212 userPassword: {crypt}x
213 shadowLastChange: 10879
216 loginShell: /bin/false
217 debGforgeCvsShell: /bin/false
218 uidNumber: $dummy_uid
219 gidNumber: $dummy_uid
220 homeDirectory: $chroot/home/users/dummy