#!/usr/bin/perl # # passwd2ldif my $passwd = "/etc/passwd"; my $shadow = "/etc/shadow"; my $basedn = "dc\=gentoo, dc\=org"; my %shadows; # Do not open $shadow if it is not readable if (-r $shadow) { open(SHADOW,"$shadow") or die "ERROR: Cannot open file $shadow\n"; for () { my (@fields); (@fields) = split(/:/,$_); # Figure out potential replacements for /etc/passwd entries $shadows{$fields[0]} = $fields[1] # unless (length($fields[1]) != 13); } close(SHADOW); } open(PASSWD,"$passwd") or die "ERROR: Cannot open file $passwd\n"; # Do it! for () { my (@fields); my (@gecos); chomp(); (@fields) = split(/:/,$_); # Clean the comment field a bit # It is broken into: name, office, office phone, home phone (@gecos) = split(/,/,$fields[4]); # Skip system accounts if ($fields[2] < 500) { next; } # Clean up the name a little bit $gecos[0] =~ s/^\s+//; # Suck in the front! $gecos[0] =~ s/\s*$//; # Suck in the back! $gecos[0] =~ s/\s+/ /g; # Start by printing the DN, pick one # print "dn: cn\=$gecos[0], $basedn\n"; print "dn: uid\=$fields[0], $basedn\n"; "objectclass: person\n", "objectclass: organizationalperson\n", "objectclass: inetorgperson\n", "objectclass: posixAccount\n"; print "uid: $fields[0]\n", "uidNumber: $fields[2]\n", "gidNumber: $fields[3]\n", "homeDirectory: $fields[5]\n"; # Now for the fun part, figuring out what to put in for the password # field if (length($fields[1]) != 13) { # See if we have something useful in %shadows print "userPassword: {md5}$shadows{$fields[0]}\n" if ($shadows{$fields[0]}); } else { print "userPassword: {crypt}$fields[1]\n"; } print "loginShell: $fields[6]\n" if defined($fields[6]); # Some misc info, only works for "enchanced" /etc/passwd # print "cn: $gecos[0]\n" if defined($gecos[0]); # Print the objectclasses to be used print "objectclass: top\n", print "cn: $fields[0]\n"; print "postalAddress: $gecos[1]\n" if defined($gecos[1]); print "telephonenumber: $gecos[2]\n" if defined($gecos[2]); print "sn: $fields[0]\n"; print "\n"; } close(PASSWD); # The End