Laboratorium nr 9: Przetwarzanie pliku systemowego passwd
Transkrypt
Laboratorium nr 9: Przetwarzanie pliku systemowego passwd
Laboratorium nr 9: Przetwarzanie pliku systemowego passwd 1 Cel ćwiczenia Wykształcenie umiej˛etności posługiwania si˛e klasa˛ std::string oraz szablonem std::list<>. Przyswojenia sobie poj˛ecia iteratora. Wykształcenie umiej˛etności formatowania strumienia wyjściowego (posługiwanie si˛e manipulatorami). Przećwiczenie konstrukcji diagramu przypadków użycia. Utrwalenie umiej˛etości tworzenia diagramów czynności oraz diagramu klas za pomoca˛ j˛ezyka UML. 2 Program zaj˛eć • Ocena realizacji zadania z poprzedniego laboratorium – ocenie podlega poprawność programu, kompilacja (kompilacja musi przebiegać bez ostrzeżeń), styl pisania programu oraz dokumentacja zrealizowana w systemie doxygen. • Realizacja wst˛epnej fazy prac nad nowym zadaniem – w ramach wst˛epnej realizacji zadania należy doprowadzić do poprawnej kompilacji i konsolidacji zala˛żka. Nast˛epnie należy stworzyć diagram przypadków użycia oraz diagram czynności dla wybranego przypadku. O ile to tylko możliwe należy ten diagram uogólnić na pozostałe przypadki. Należy też spróbować zdefiniować klas˛e DaneUzytkownika i przecia˛żyć odpowiednie operatory. Diagram można wykonać wykorzystujac ˛ jeden z programów: bouml, dia lub umbrello. Wymienione programy dost˛epne sa˛ na panamincie. Na podstawie stworzonych diagramów należy wygenerować lub napisać definicje klas w j˛ezyku C++. • Ocena realizacji wst˛epnej fazy zadania 3 Opis zadania programowego Należy napisać odpowiedni moduł do dostarczonego modułu głównego z funkcja˛ main. Wspomniany moduł został dostarczony w postaci biblioteki statycznej. Zawiera on funkcj˛e main i pozwala na parsowanie opcji wywołania programu. Wi˛ecej informacji na jego temat znajduje si˛e w nast˛epnym podrodziale. Moduł, który należy napisać, ma umożliwić odpowiednie filtrowanie i reprezentacj˛e danych z pliku passwd. Plik ten zawiera dane dotyczace ˛ użytkowników. Każdy z użytkowników ma przydzielony unikalny login i identyfikator liczbowy. Użytkowników można zasadniczo podzielić na dwie grupy. Pierwsza to użytkownicy systemowi tacy jak root, daemon, lp itp. Nie sa˛ oni zwiazani ˛ z żadna˛ konkretna˛ osoba.˛ Służa˛ oni do uruchamia programów i usług z odpowiednimi prawami dost˛epu. Ich identyfikatory mieszcza˛ si˛e w poczatkowym ˛ zakresie dost˛epnych wartości i zwyczajowo sa˛ mniejsze niż 200. Druga grupa to normalni użytkownicy systemu b˛edacy ˛ konkretnymi osobami. Ich identyfikatory sa˛ zazwyczaj wi˛eksze od 1000. Na podstawie wpisów w pliku passwd program ma wyświetlać list˛e zwykłych użytkowników. Lista ta powinna zawierać login użytkownika, jego imi˛e i nazwisko, Wyświetlana lista ma być posortowana wg zadanego klucza. Domyślnie jest nim nazwisko użytkownika, jego imi˛e oraz login. Tak wi˛ec kolejność w liście wyznacza alfabetyczny 1 układ nazwisk. Jeśli dwóch użytkowników ma takie same nazwisko, o porzadku ˛ decyduje alfabetyczna kolejność imion. jeśli imiona sa˛ również takie same, to o kolejności rozstrzyga alfabetyczny porzadek ˛ loginów (loginy sa˛ unikalne). Po zakończeniu wyświetlania całej listy, kilka linii poniżej powinny zostać wyświetlone dane dotyczace ˛ użytkownika, który ma najwi˛eksza˛ wartość identyfikatora. Zmieniajac ˛ parametry wywołania programu powinno być możliwe wyświetlenie użytkownika o zadanym identyfikatorze lub loginie zaczynajacym ˛ si˛e od zadanej sekwencji znaków. Oprócz wyżej opisanego sposobu sortowania, program powinien pozwalać (po wywołaniu go z odpowiednimi parametrami) na sortowanie alfabetycznego wg loginów lub wartości identyfikatorów użytkowników. 3.1 Wymagania szczegółowe 1. Zakłada si˛e, że plik passwd znajduja˛ si˛e w katalogu bieżacym. ˛ Plik passwd zawiera zestawienie zarówno użytkowników systemowych, jak też zwykłych użytkowników. Ci ostatni zazwyczaj maja˛ identyfikatory wi˛eksze niż 1000. Program musi brać pod uwag˛e tylko zwykłych użytkowników. Składnia wywołania programu ./uzytkownicy [-s [login|id]] [-z [login_uzytkownika|id_uzytkownika]] Przykład wywołania: ./uzytkownicy -s login -z jkowalsk Opis działania: Wyświetla list˛e użytkowników posortowana˛ wg loginów, a na końcu wyświetlony zostaje wpis pierwszego użytkownika o loginie rozpoczynajacym ˛ si˛e od zadanej sekwencji znaków. W tym przypadku od jkowalsk. Przykład wywołania: ./uzytkownicy -z 4014 Opis działania: Wyświetla list˛e użytkowników posortowana˛ wg nazwisk, a na końcu wyświetlony zostaje wpis użytkownika o zadanym identyfikatorze. Uwaga: Nie trzeba samodzielnie robić parsowania parametrów wywołania programu. To jest już zrobione w dostarczonym module głównym w postaci biblioteki libmain.a 2. Moduł główny programu został skompilowany i jest dostarczony w postaci biblioteki. Jego lokalizacja to dla diablo: ∼bk/edu/kpo/zad/z9/zasoby/lib/diablo/libmain.a dla panaminta: ∼bk/edu/kpo/zad/z9/zasoby/lib/panamint/libmain.a Finalny program musi korzystać z tego modułu i utworzony przez użytkownika moduł musi konsolidować si˛e z tym plikiem. 3. W dostarczonym module głównym znajduje si˛e odpowiedni parser opcji, z którymi wywołany zostaje program. W module tym po przeanalizowaniu opcji wywołany zostaje funkcja o prototypie void PrzetworzListe_Uzytkownikow_i_Grupy(const OpcjeWywolania& ); Definicja klasy OpcjeWywolania dostarczona jest wraz z zala˛żkiem programu. Należy stworzyć własny moduł z definicja˛ tej funkcji. 2 4. Należy zdefiniować klas˛e DaneUzytkownika. W obiektach tej klasy maja˛ być przechowywane informacje takie jak: login użytkownika, jego identyfikator liczbowy, imi˛e oraz nazwisko. 5. Należy zdefiniować klas˛e ListaUzytkownikow, do której zostanie wpisana odpowiednia lista użytkowników wraz z właściwymi informacjami. W klasie tej należy zdefiniować metod˛e Znajdz i odpowiednio ja˛ przecia˛żyć. Metody te nie powinny wyświetlać danych jedynie je znajdować. Kolejne wersje tej metody to: bool Znajdz( DaneUzytkownika& ) const – znajduje użytkownika o najwi˛ekszej wartości Id. Zwraca true jeśli operacja powiodła si˛e. W przeciwnym przypadku false. W tym przypadku operacja może si˛e niepowieść tylko wtedy gdy lista jest pusta. bool Znajdz( const char* sPoczatekLoginu, DaneUzytkownika& ) const – znajduje pierwszego użytkownika w liście, którego login zaczyna si˛e od zadanego napisu. Uwaga: Należy zwrócić uwag˛e, że dla różnych typów sortowania wynik może być inny. Zwracane wartości podobnie jak wyżej. bool Znajdz( int Id, DaneUzytkownika& ) const – znajduje użytkownika o zadanym identyfikatorze. Zwracane wartości podobnie jak wyżej. 3.2 Przykład działania Sposób formatowania w danych w przedstawionym przykładzie jest traktowany jako wzorcowy i obowiazuj ˛ acy ˛ w realizowanym zadaniu. jk@diablo> ./uzytkownicy Czyta plik passwd ... operacja zakonczona powodzeniem. aabacki jcedula jkarolak jkowalsk 4044 1024 10398 4011 Adam Zbigniew Jan Jan Abacki Cedula Karolak Kowalski --------------------------------------------------------------------amaczar 4666 Antoni Maczar jk@diablo> ./uzytkownicy -s login -z jk Czyta plik passwd ... operacja zakonczona powodzeniem. aabacki amaczar jcedula jkarolak 4044 1666 1024 10398 Adam Antoni Zbigniew Jan Abacki Maczar Cedula Karolak 3 jkowalsk 4011 Jan Kowalski --------------------------------------------------------------------jkarolak 10398 Jan Karolak jk@diablo> ./uzytkownicy -s id -z 1023 Czyta plik passwd ... operacja zakonczona powodzeniem. jcedula 1024 jkowals 4011 aabacki 4044 amaczar 4666 jkarolak 10398 Zbigniew Jan Adam Antoni Jan Cedula Kowalski Abacki Maczar Karolak --------------------------------------------------------------------Brak uzytkownika o identyfikatorze 1023 jk@diablo> _ 3.3 Organizacja pliku passwd Przykład zawartości pliku root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync man:x:6:12:man:/var/cache/man:/bin/sh jkowals:x:1001:1001:Jan Kowalski,,,:/home0/bk:/bin/bash Każda linia pliku stanowi osobny wpis z informacja˛ o użytkowniku. Linia ta podzielona jest na pola. Separatorem jest znak ’:’. W kolejnych polach znajduje si˛e: login użytkownika, znak ’x’ (kiedyś umieszczane było tu zaszyfrowane hasło, obecnie znajduje si˛e ono w pliku shadow), identyfikator użytkownika, identyfikator grupy, dane dotyczace ˛ użytkownika rozdzielone przecinkami (przyj˛eło si˛e, że pierwszym elementem tego wpisu jest imi˛e i nazwisko użytkownika), kartotek domowa, wywołanie interpretera poleceń. Niniejszy plik umieszczany jest w katalogu /etc Wi˛ecej informacji na temat tego pliku można znaleźć na stronie: http://en.wikipedia.org/wiki/Passwd 3.4 Udogodnienia – zalażek ˛ Jako pomoc dostarczony został zala˛żek programu. Znajduje si˛e on w katalogu: ∼bk/edu/kpo/zad/z9/zalazek Uwaga: Dostarczony zala˛żek nie kosoliduje si˛e. W pliku modul.cpp brakuje definicji funkcji 4 PrzetworzListe_Uzytkownikow_i_Grupy. Należy dostarczony zaczatek ˛ modułu odpowiednio uzupełnić. Funkcja PrzetworzListe_Uzytkownikow_i_Grupy wykorzystuje obiekt klasy OpcjeWywolania. Dokumentacja tej klasy oraz przykład wykorzystania jej obiektu znajduje si˛e w ∼bk/edu/kpo/zad/z9/zasoby/html 3.5 Uproszenia 3.5.1 Ocena nie wyższa niż 4,0 Można zrezygnować z obsługi opcji wyszukiwania. 3.5.2 Ocena nie wyższa niż 3,5 Dodatkowo można zrezygnować z obsługi opcji sortowania i dokonywać jedynie sortowania domyślnego. 3.5.3 Ocena nie wyższa niż 3,0 W ogóle można zrezygnować z opcji sortowania. 3.6 Rozszerzenia – nieobowiazkowe ˛ 3.6.1 Nieznaczne Dane o użytkownikach nie moga˛ być wyświetlane tylko raz. Tak wi˛ec jeśli dane o użytkowniku wyświetlane sa˛ na końcu, to nie powinny być wyświetlone we wcześniejszej liście. 3.6.2 Bardziej ambitne Dodatkowo program powinien przeanalizować plik group (znajduje si˛e w katalogu: ∼bk/edu/kpo/zad/z9/dodatki) i wyświetlić grup˛e domyślna˛ oraz zestaw grup, do których należy dany użytkownik. Informacj˛e zwiazan ˛ a˛ z nazwami grup można otrzymać na podstawie wpisów w pliku group. Ponadto zamiast wyświetlania danych o użytkowniku, który ma najwi˛ekszy identyfikator powinna być wyświetlana informacja, o użytkowniku, który należy do najwi˛ekszej liczby grup. Jeśli jest kilku takich użytkowników, to wyświetlany wpis powinien dotyczyć użytkownika, który wyst˛epuje na liście jako pierwszy spośród tej grupy wzgl˛edem zadanego sposobu sortowania listy. Przykład działania programu w wersji rozszerzonej. jk@diablo> ./uzytkownicy Czyta plik passwd ... operacja zakonczona powodzeniem. Czyta plik group ... operacja zakonczona powodzeniem. aabacki jbarski jcedula jkowalsk 4044 10398 1024 4011 Adam Jan Zbigniew Jan Abacki Barski Cedula Kowalski students students teachers students 5 cdrom video,dialout,tty dialout,tty,cdrom video,cdrom --------------------------------------------------------------------amaczar 1666 Antoni Maczar spec jk@diablo> _ 6 video,dialout,tty,mytht,voice,audio