Dorota Sadowska
Maryla Kupczyk
Wrocławskie Centrum Sieciowo-Superkomputerowe

Dorota.Sadowska@pwr.wroc.pl

Temat zadania:

Projekt narzędzi automatyzujących zarządzanie zasobami LDAP, m.in. zmasowane ładowanie danych.

(opracowanie przygotowane w ramach realizacji zadań projektu KBN)

Data opracowania 22.10.2003 r.

Spis treści:

  1. Wstęp.
  2. Założenia.
  3. Tworzenie danych wejściowych.
  4. Zmasowane ładowanie bazy.
  5. Podsumowanie.
1. Wstęp

W ramach realizacji zadań projektu KBN Wrocławskie Centrum Sieciowo-Superkomputerowe założyło bazę adresową pracowników Politechniki Wrocławskiej. Ze względu na ustawę o ochronie danych osobowych, informacje zawarte w bazie LDAP zbierane były po w formie wyrażeniu pisemnej zgody na przetwarzanie danych przez zainteresowanych. Z tego powodu nie można było podjąć się zmasowanego ładowania danych pracowników PWr. Próbę przetwarzania dużej ilości danych podjęto się tworząc jednolity system poczty elektronicznej dla studentów PWr. System ten bazuje na oprogramowaniu SunOne Directory Server.

2. Założenia

Tworząc jednolity system poczty elektronicznej dla studentów założono, że obiekty w bazie identyfikowane będą przez numer albumu studenta. W obiekcie bazy LDAP odpowiada mu atrybut uid. Kolejne atrybuty opisujące obiekt to:
 
 
sn - nazwisko
giveName - imię
cn - imię i nazwisko
departmentNumber - nazwa wydziału
md5 - skrót hash

3. Tworzenie danych wejściowych

Dane wejściowe do bazy LDAP gromadzono w dwóch etapach. W pierwszym etapie konieczne było wygenerowanie z różnych systemów informatycznych, poszczególnych wydziałów, rekordów w określonym formacie. W skład poszczególnych pól rekordu wchodzą numer albumu, imię 1, imię 2, nazwisko, imię ojca, imię matki, pesel, data urodzenia w formacie ddmmrrrr. Poszczególne pola rekordu oddzielone są znakiem dwukropka. Pola takie jak imię 2 oraz imię ojca są opcjonalne i mogą zostać pominięte. W szczególnych przypadkach pominięto pole pesel, dotyczyło to obcokrajowców.

W chwili uruchamiania pilotażowej instalacji systemu nie brano pod uwagę roku studiów, czy też typu studiów. Jest jednak możliwe aby rekord zawierał takie informacje.

Postać rekordu:

nr_albumu:imię1:imię2:nazwisko:imię_ojca:imię_matki:pesel:data_urodzenia

Przykład:

78562:JAN::KOWALSKI:CZESŁAW:MARIA:74123123451:31121974

Założono, że pliki wejściowe z danymi mają być kodowane w ISO-8859-2 lub UTF-8 a poszczególne rekordy mają być oddzielone znakiem nowej linii.

Przygotowany rekord zawiera więcej danych niż znajdzie się w obiekcie wprowadzanym do bazy. Pola od 5 do 8 nie znajdą się bezpośrednio w opisie obiektu. Ich wartości posłużą do wygenerowania skrótu, który jest wartością jednokierunkowej funkcji hashującej (kodującej) MD5. Skrót ten zostanie umieszczony w opisie obiektu jako atrybut md5 i będzie służył do identyfikacji danych o studencie w momencie generowanie hasła do konta pocztowego. Drugi etap przetworzania pliku następuje w środowisku WINDOWS po skorzystaniu ze skryptu napisanego w awku. Jego zadanie polega na przetworzeniu pierwszego pliku z ogólnymi danymi wejściowymi na plik wynikowy zawierający jedynie:

Poszczególne pola rekordu, podobnie jak w poprzednim pliku, oddzielone są znakiem dwukropka. Skrypt generuje także plik z informacją o błędnych rekordach.

4. Zmasowane ładowanie bazy LDAP

Plik przygotowany według wcześniej przygotowanych założeń stanowi plik wejściowy do właściwego skryptu.

Przykładowy plik wejściowy ma postać:

656263:Jerzy::Barszcz:7346530e4ce7faf8296aee071d80c964
284261:Maria::Barszczowa:99c7f9dc0cbd9059ee9bf530d7da4728
284264:Tomasz::Bartosz:14403b8603355cb100b6e49a2140dde1
314268:Krzysztof:Tomasz:Biakok:277b4e38b0cfc2288aec104e00eef10d
324269:Janusz:Marian:Biter:1b282863cd75702857b2c6510a56fc9d
344261:Krzysztof:Jerzy:Wakiewicz:1e5b5771a4915e6ef173a7442b48ba2d
344273:Marek:Jakub:Tomczuk:5b5b06cd5c4757e184af29c7e97006dd
354276:Janusz::Brzun:380a41f5a805e83c3efe0325acd4cda5
354277:Maciej:Tomasz:Bunko:89c37602407a496819681e6a94aed5d

Rolą skryptu jest przetworzenie danych do pliku LDIF, który zostanie dołączony do bazy. Poszczególne pola rekordu wejściowego zamieniane są na konkretne pola opisujące obiekt (studenta).
 
 

#!/usr/local/bin/awk -f
BEGIN {FS=":"; wydzial=ARGV[2] ; delete ARGV[2];czas=systime()}
{printf "dn: uid=%s,ou=People, o=student.pwr.wroc.pl, o=studenci\n",$1
printf "mailHost: student.pwr.wroc.pl\n"
printf "mailUserStatus: active\n"
printf "objectClass: top\n"
printf "objectClass: person\n"
printf "objectClass: organizationalPerson\n"
printf "objectClass: inetorgperson\n"
printf "objectClass: inetUser\n"
printf "objectClass: inetSubscriber\n"
printf "objectClass: ipUser\n"
printf "objectClass: nsManagedPerson\n"
printf "objectClass: inetmailuser\n"
printf "objectClass: inetlocalmailrecipient\n"
printf "objectClass: userpresenceprofile\n"
printf "objectClass: student\n"
printf "inetUserStatus: active\n"
printf "cn: %s %s\n",$2,$4
printf "uid: %s\n",$1
printf "dataSource: generator z danych dziekanatu %s\n",wydzial
printf "departmentNumber: %s\n",wydzial
printf "givenName: %s\n",$2
printf "sn: %s\n",$4
printf "mail: %s@student.pwr.wroc.pl\n",$1
printf "mailDeliveryOption: mailbox\n"
printf "preferredLanguage: pl\n"
printf "userPassword: {SHA}98a3f9a9b93c09013d459eb45bc52678ac555c4f\n"
printf "md5: %s\n",$5
printf "creationTime: %s\n",czas
print "\n"

}

Plik wyjściowy po przetworzeniu przez skrypt ma postać:

dn: uid=656263,ou=People, o=student.pwr.wroc.pl, o=studenci
mailHost: student.pwr.wroc.pl
mailUserStatus: active
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetorgperson
objectClass: inetUser
objectClass: inetSub9scriber
objectClass: ipUser
objectClass: nsManagedPerson
objectClass: inetmailuser
objectClass: inetlocalmailrecipient
objectClass: userpresenceprofile
objectClass: student
inetUserStatus: active
cn: Jerzy Barszcz
uid: 656263
dataSource: generator z danych dziekanatu JGora
departmentNumber: JGora
givenName: Maciej
sn: Barszczewski
mail: 656263@student.pwr.wroc.pl
mailDeliveryOption: mailbox
preferredLanguage: pl
md5: 7346530e4ce7faf8296aee071d80c964
creationTime: 1065788981
userPassword: {SHA}98a3f9a9b93c09013d459eb45bc52678ac555c4f

Podczas transformacji pliku wejściowego na plik typu LDIF należało podać nazwę (symbol) wydziału. Informacja ta została dopisana do atrybutu departmentNumber. W dniu inicjowania bazy nie można było określić przydatności tego wpisu. Założono jednak, że przy wyszukiwaniu, identyfikacji danych łatwiej będzie zlokalizować studenta.

Tak przygotowany plik typu LDIF można było bez problemu wczytać za pomocą komendy ldapadd.

5. Podsumowanie

Dane wejściowe przygotowane w formacie podobnym do omówionego powyżej, a wygenerowane przez dziekanaty mogą służyć jako przykład tworzenia rekordów z różnymi polami danych. Istotną sprawą jest kodowanie pliku wejściowego.