Zadanie zaliczeniowe 2015 ========================= Wprowadzenie ------------ Celem zadania jest utworzenie oprogramowania symulującego działanie szpitala, w którym rejestracja dokonywana jest zdalnie (niby) przez klientów w szpitalnym serwerze. Każda studentka i każdy student utworzy program serwera i klienta. Serwer i klient porozumiewać się mają za pomocą samodzielnie opracowanego protokołu. Protokół powinien zostać dopracowany w ciągu 2 tygodni, oraz jego wersja, w postaci pliku .pdf lub .rst powinna zostać przesłana do prowadzącego zajęcia. Istnieje możliwość, że na podstawie opisu protokołu prowadzący napisze klient i serwera - w przypadku niejasności w opisie, prowadzący będzie interpretował je w sposób możliwie złośliwy. Studenci i studentki podzielone będą na grupy kilkuosobowe, z których każda realizuje ten sam protokół. Dany klient (resp. serwer) musi być w stanie połączyć się z każdym serwerem z danej grupy, oraz - być może - z serwerem (resp. klientem) napisanym przez prowadzącego. ---- Technologia i wymagania wobec kodu ---------------------------------- Do wyboru są dwie technologie komunikacji między klientami a serwerami: pamięć współdzielona+semafory (System V,POSIXowe) oraz kolejki komunikatów (System V, POSIXowe). Kod napisany ma być w czystym C. Kod musi być udokumentowany: dla każdej funkcji, jej parametry muszą być opisane w komentarzu. Dodatkowo komentarz ma zawierać opis działania funkcji. Zmienne i funkcje powinny posiadać nazwy coś mówiące (tzn. jeżeli funkcja służy do łączenia z serwerem, to powinna się nazywać **connect** lub podobnie, a nie **wesola_funkcja_o_fajnej_nazwie**.) Protokół powinien być opisany w formie pliku napisanego w formacie RST (restructured text) lub .pdf. Jeżeli są potrzebne diagramy, należy użyć ditaa albo aafigure. ---- Funkcjonalność serwera ------------------------- Każdy serwer udostępnia polecenia **authenticate**, **register**, **details**, **delete**, **stats**, **update**, **list**, **role**, **whoami**, **help**, **passwd**, **adduser**, **deluser**, **appdate** . Szczegóły tych poleceń mogą się różnić w zależności od studenta. Użytkownicy posiadają przypisane trzy role: *pacjent*, *rejestracja*, *lekarz*. Pacjent ma jedynie dostęp read-only do informacji o sobie. Rejestracja może jedynie dodawać nowych pacjentów oraz dawać informacje o pacjencie, przy czym przed podaniem informacji rejestracja musi podać dodatkowe hasło pacjenta. Lekarz może wszystko oprócz rejestracji nowych pacjentów. Każde polecenie po stronie serwera wprowadza opóźnienie, symulowane przez sleepa. Ile sekund ma trwać opóźnienie, ma być podawane jako argument przy uruchomieniu serwera. Każdy serwer udostępnia polecenie **help** zwracające komendy zawierające dodatkową funkcjonalność serwera. Serwer w reakcji na nieobsługiwaną komendę powinien zwrócić komunikat o błędzie i listę wspieranych poleceń. ---- Funkcjonalność poleceń (1) -------------------------- Następujące polecenia są dostępne do wyboru do implementacji: * **authenticate**: polecenie zawsze dostępne. Podaje nazwę użytkownika i hasło. * **role**: polecenie dodatkowe. Zmienia rolę z mniej/bardziej uprzywilejowanej na inną. * **whoami**: zawsze dostępne. Podaje nazwę użytkownika i jego rolę. * **register**: zawsze dostępne. Podaje nazwę pacjenta, opcjonalnie jego hasło, wiek, wstępne rozpoznanie. Serwer przydziela pacjentowi datę przyjęcia do szpitala. * **details**: zawsze dostępne. Argument: nazwa pacjenta. Podaje informacje o tym pacjencie (być może dodatkowo wymagając hasła, niedostępne dla wszystkich ról) * **delete**: zawsze dostępne. Kasuje pacjenta. * **stats** polecenie dodatkowe. Podaje ilu jest pacjentów, ilu o danym wieku, młodszych lub starszych, ilu o nazwisku zaczynającym się od ciągu. ---- Funkcjonalność poleceń (2) -------------------------- * **update**: polecenie dodatkowe. Aktualizuje dane o podanym pacjencie. * **list**: polecenie zawsze dostępne (ale patrz dalej). Wypisuje wszystkich zarejestrowanych użytkowników (nie pacjentów!). Dodatkowe opcje: wypisuje wszystkich o danej roli, o nazwie zaczynających się od stringu, iluś ostatnio używających serwer. * **passwd**: polecenie dodatkowe. Zmienia hasło pacjentowi. Dostępne dla wszystkich ról, wymaga podania poprzedniego hasła, może także opcjonalnie wyzerować hasła dla wszystkich podanych argumentów. * **adduser**, **deluser**: polecenie dodatkowe. Dodaje wzgl. usuwa użytkownika, podając jego rolę i hasło. * **appdate**, **enroll**: polecenia dodatkowe. Zmiana terminu przyjęcia do szpitala, przyjęcie pacjenta (jeżeli pacjent nie jest przyjęty, lekarz nie może modyfikować jego danych). ---- Dane o prezentacji ------------------ Prezentacja została wykonana w ReStructured Text za pomocą narzędzia landslide. Źródło prezentacji znajduje się tutaj_ .. _tutaj:: http://www.cs.put.poznan.pl/adanilecki/pliki/szpital.rst