Wikiraum

Benutzer-Werkzeuge

Webseiten-Werkzeuge


Skript, um csv-Dateien ins LDIF-Format konvertieren

Es sollte leicht an die eigenen Bedürfnisse anpassbar sein. Die UID besitzt das Format „vorname.nachname“. Das initiale Passwort ist identisch mit der UID.

convert_csv2ldif.php
#!/usr/bin/php -q
 
<?php
 
$DATA_INPUT = '/pfad/zu/datei_im_format.csv';
$LDIF_OUTPUT = '/pfad/zur/Ausgabedatei.ldif';
$BASE_DN = "ou=userkontext, ou=unterbaum, dc=domain, dc=tld";
$uid_start = 1000;
 
$raw_lines = file($DATA_INPUT, FILE_IGNORE_NEW_LINES);
$datei = fopen($LDIF_OUTPUT,"a+");
 
foreach ($raw_lines as $current_line) {
 
        # dies sind die Spalten in der csv-Datei

	list($nachname, $vorname, $schulform, $organisation, $strasse, $plz, $ort, $telefon1, $telefon2, $email, $url, $kreis) = explode(',', $current_line);
 
        # Telefonnummern werden in internationale Format gebracht (nur Deutschland)

	$telefon1 = conv_telephone($telefon1);
	$telefon2 = conv_telephone($telefon2);
 
        # Später darf kein Attribut im LDAP leer sein, deswegen füllen wir in der CSV-Datei nicht vorhandene Felder
        # mit Platzhalterdaten, der Passwortalgorithmus ist überhaupt nicht optimal

	$out_nachname = check_content($nachname);
	$out_vorname = check_content($vorname);
	$out_organisation = check_content($organisation);
	$out_strasse = check_content(base64_encode($strasse));
	$out_plz = check_content($plz);
	$out_ort = check_content($ort);
	$out_telefon = check_content($telefon1);
	$out_telefon_alt = check_content($telefon2);
	$out_mail = check_content($email);
	$out_url = check_content($url);
	$out_kreis = check_content($kreis);
	$out_uid = check_content(conv_umlaute(strtolower($out_vorname).".".strtolower($out_nachname)));
	$out_uidnumber = check_content($uid_start);
	$out_password = check_content("{MD5}".base64_encode(pack("H*",md5($out_uid))));
 
        # das Mailattribut muss eine syntaktisch korrekte Mailadresse enthalten 

	if ($out_mail == "NULL") {
 
		$out_mail = "nomail".$uid_start."@xyz.zz";
 
	}
 
        # Jetzt kann man sich das Array einfach zusammenbauen

	$zeile = array(
			"dn: cn=".$out_vorname." ".$out_nachname.",".$BASE_DN."\n",
			"cn: ".$out_vorname." ".$out_nachname."\n",
			"dialupaccess: access_attr"."\n",
			"gidnumber: ".$uid_start."\n",
			"givenname: ".$out_vorname."\n",
			"homedirectory: /home/".$out_uid."\n",
		 	"mail: ".$out_mail."\n",
			"mailalternateaddress: ".$out_mail."\n",
			"mobile: ".$out_telefon_alt."\n",
			"objectclass: organizationalPerson"."\n",
			"objectclass: person"."\n",
			"objectclass: top"."\n",
			"objectclass: inetOrgPerson"."\n",
			"objectclass: posixAccount"."\n",
			"objectclass: shadowAccount"."\n",
			"objectclass: radiusprofile"."\n",
			"objectclass: qmailUser"."\n",
			"postaladdress: ".$out_strasse."\n",
			"preferredlanguage: de"."\n",
			"sn: ".$out_nachname."\n",
			"telephonenumber: ".$out_telefon."\n",
			"uid: ".$out_uid."\n",
			"uidnumber: ".$uid_start."\n",
			"userpassword: ".$out_password."\n",
			"\n"
		      );
 
	foreach ($zeile as $current_ldif) {
 
        	fwrite($datei, $current_ldif);
 
	}
 
	$uid_start++;
}
 
function conv_umlaute($string) {
 
	# remove german special chars

	$upas = Array("ß" => "ss", "ä" => "ae", "ü" => "ue", "ö" => "oe", "Ä" => "Ae", "Ü" => "Ue", "Ö" => "Oe"); 
        return str_replace(" ", "", strtr($string, $upas));
 
}
 
function check_content($string) {
 
	# just to make sure that every attribute gets a value

	if ($string) {
		return $string;
	} else {
		return "Not set";
	}
 
}
 
function conv_telephone($number) {
 
	# remove everything exept digits
	# then replace leading zero by international code for germany

        $out = preg_replace('![^0-9]!', '', $number);
        $out = preg_replace("/^0/",  "+49", $out);
 
	return $out;
 
}
 
?>