Celem zadania jest napisanie programu, który będzie przetwarzał dane o ostatnich logowaniach w systemie oraz wyświetlał statystyki logowań uporządkowane względem adresów, z których logowali się użytkownicy, oraz względem nazwy użytkownika.
Tworzenie i operacje na drzewach binarnych, polecenie last
Program uruchomi polecenie last z odpowiednimi parametrami, głównie -a, patrz man last. (Do testowania programu warto użyć zmniejszonej ilości danych, patrz niżej.) Na podstawie uzyskanych informacji program utworzy rekord zawierający: adres komputera, z którego nastąpiło logowanie, nazwę użytkownika oraz liczbę logowań dla tej kombinacji nazwy użytkownika i adresu komputera, lub, jeśli taki rekord istnieje, program zwiększy licznik logowań. Poszczególne rekordy umieszczane zostaną na drzewie binarnym uporządkowanym według nazwy użytkownika (podstawowy klucz sortowania) i adresu logowania (klucz pomocniczy). Jednocześnie rekord zostanie wprowadzony na drugie drzewo binarne uporządkowane według tych samych dwóch kluczy, ale w odwrotnej kolejności. Dzięki temu oba drzewa stanowić będą niezależne indeksy przeszukiwania utworzonej bazy danych. (W rzeczywistości, na obu drzewach powinny być umieszczane tylko wskaźniki definiujące strukturę drzewa, natomiast rzeczywiste rekordy informacyjne powinny znajdować się poza drzewami. Może to być jakaś prosta struktura danych, np. lista lub tablica, albo mogą być po prostu pojedynczymi danymi w pamięci dynamicznej, do których dostęp będzie wyłącznie z obu drzew.)
Następnie program powinien wejść w tryb analizy danych. W tym trybie program wyświetli na ekranie zawartość korzenia drzewa (jednego z dwóch drzew), i pozwoli na poruszanie się w górę lub w dół (lewy lub prawy) drzewa, po przejściu automatycznie wyświetlając zawartość aktualnie wizytowanego węzła drzewa, głębokość tego węzła względem korzenia, oraz wysokości lewego i prawego poddrzewa. Dostępne będą również następujące operacje:
adres: (sumaryczna liczba logowań) użytkownik1: (ile logowań) użytkownik2: (ile logowań) ...
użytkownik: (sumaryczna liczba logowań) adres1: (ile logowań) adres2: (ile logowań) ...
Testowanie programu należy przeprowadzić najpierw na małym zbiorze danych, a po osiągnięciu poprawnego działania programu na większym zbiorze danych.
Dostępne zbiory danych:
komputer | plik domyślny | większy plik archiwalny |
diablo | /var/adm/wtmpx | /var/adm/wtmpx.0 |
panamint | /var/log/wtmp | /var/log/wtmp.1 |
Przy testowaniu wykonanego programu, do porównawczego ręcznego podsumowania danych, przydatne mogą być polecenia:
last -a | egrep -v still | cut -c1-9,60- | sort | uniq -c | less