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

Podobne dokumenty