#!/bin/bash

#pobranie numeru konsoli na ktorej aktualnie jestesmy zalogowani(np. /dev/pts/8)
currentShell=`tty`

#Pobranie daty, kiedy ostatni raz byl zalogowany dany uzytkownik (np. Fri 22 Mar)
lastLoginDate=`last|grep $USER|head -n 2|tail -n 1|awk '{print $4 " " $6 " " $5}'`

#Pobranie czasu, kiedy ostatni raz byl zalogowany dany uzytkownik. W sytuacji, gdy dany uzytkownik wciaz jest zalogowany,
#to obok godziny zalogowania, wyswietla sie napis "still logged in" (np. 19:25   still logged in).
#Gdy uzytkownik nie jest juz zalogowany, to sie wyswietli godzina zalogowania,
#wylogowania i czas trwania sesji (np. 21:22 - 21:23  (00:00)). Czas trwania sesji nie jest zbyt dokladny,
#gdyz nie uwzglednia sekund
lastLoginTime=`last|grep $USER|head -n 2|tail -n 1|cut -c 51-`

#Pobranie numeru konsoli, na ktorej byl zalogowany dany uzytkownik podczas ostatniego zalogowania (np. pts/8)
lastLoginTty=`last|grep $USER|head -n 2|tail -n 1|awk '{print $2}'`

#Pobranie adresu IP, spod ktorego dany uzytkownik logowal sie podczas ostaniego zalogowania (np. 192.168.22.33).
#W sytuacji, gdy logowanie nastapilo z lokalnej konsoli, to zamiast adresu sieciowego, wyswietli sie napis ":0"
lastLoginAddress=`last|grep $USER|head -n 1|tail -n 1|awk '{print $3}'`


#UPTIME-sekcja odpowiedzialna za pobranie informacji odnosnie czasu, jaki uplynal od ostatniego uruchomienia
#pobranie daty i godziny o ktorej zostal uruchomiony komputer (np. 2013-03-22 17:49)
lastRestartTime=`who -b | awk '{print $3 " " $4}'`

#Pobranie z pliku /proc/uptime informacji o ilosci sekund jakie uplynely od uruchomienia systemu (np. 15445.60)
uptimeSeconds=`cat /proc/uptime | awk '{print $1}'`
#Ilosc sekund pobrana z pliku /proc/uptime (np. 15445.60) musi zostac zamieniona na wartosc calkowita (np. 15445),
#gdyz wiekszosc programow konsolowych nie lubi liczb zmiennoprzecinkowych i moga pojawic sie problemy.
#Wartosc "15445.60" jest dzielona na dwie czesci oddzielone kropka i zapisywana do tablicy "seconds"
IFS=. read -r -a seconds <<< "$uptimeSeconds"
#Przypisanie do zmiennej secondsInt pierwszego elementu z tablicy "seconds".
#Jest to czesc calkowita (np. 15445) liczby zmiennoprzecinkowej pobranej z pliku /proc/uptime (np. 15445.60)
secondsInt=${seconds[0]}

#Zamiana sekund(np. 15445) na dni, godziny, minuty i sekundy.
#Szczegoly w dokumentacji: http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html (funkcja strftime)
#sekundy->sekundy(0-59)
uptimeSec=`echo | awk '{print strftime("%S", '$secondsInt' , 1)}'`
#sekundy->minuty(0-59)
uptimeMin=`echo | awk '{print strftime("%M", '$secondsInt' , 1)}'`
#sekundy->godziny(0-23)
uptimeHour=`echo | awk '{print strftime("%H", '$secondsInt' , 1)}'`

#sekundy->dni(1-365)
uptimeDayTmp=`expr echo | awk '{print strftime("%j", '$secondsInt' , 1)}'`
#Zmniejszenie o 1 zmiennej "uptimeDayTmp", zeby wskazywala wlasciwa ilosc dni
uptimeDay=`expr $uptimeDayTmp - 1`

#przypisanie do zmiennej "uptime" czasu jaki uplynal od uruchomienia systemu i daty kiedy system zostal uruchomiony.
#Tekst w zmiennej jest odpowiednio sformatowany. Minusem rozwiazania ktore zastosowalem, jest to, ze po przekroczeniu roku,
#licznik sie przekreci i bedzie pokazywal od 0, czyli po roku czasu, bedzie pokazywalo, ze uptime wynosi 0 dni, godzin, minut i sekund
uptime=`echo $uptimeDay"d "$uptimeHour":"$uptimeMin":"$uptimeSec `" ( last boot: "$lastRestartTime" )"
#UPTIME

#Ilosc otwartych konsol na ktorych jest zalogowany aktualny uzytkownik (np. 7)
numberOfUsers=`last| grep -P "^$USER[\S\s]{1,}still logged in{1}\s{1,}$"|wc -l`
#Numery konsol na ktorych jest zalogowany aktualny uzytkownik (np. pts/9 pts/7 pts/4 pts/3 pts/2 pts/1 pts/0)
tty=`last| grep -P "^$USER[\S\s]{1,}still logged in{1}\s{1,}$"|awk '{print $2}'|tr '\n' ' '`

#urzadzenia ktore chcemy monitorowac pod wzgledem ilosci wolnego miejsca.
firstDevice="/dev/sda5"	#partycja root
secondDevice="/dev/sda6"	#partycja home

#Pobranie ilosci wolnego miejsca dla pierwszego i drugiego urzadzenia. Ta wartosc bedzie wyswietlona bezposrednio,
#w formacie ulatwiajacym szybkie zrozumienie, bez koniecznosci konwersji. Bedzie pokazylo ilosc wolnego miejsca w GB,
#jak jest wolne conajmniej 1 GB dysku, natomiast jak jest mniej niz GB, to bedzie pokazywalo w MB i td
freeSpaceFirst=`df -h|grep $firstDevice|awk '{print $4}'`
freeSpaceSecond=`df -h|grep $secondDevice|awk '{print $4}'`

#Pobranie ilosci wolnego miejsca dla pierwszego i drugiego urzadzenia. Wartosc bedzie pokazana w bajtach.
#Uzyte to jest podczas rysowania paska postepu (program dbar). Pokazuje on ile jest wolnego miejsca w postaci znakow ASCII.
#Zrobione to jest tak, gdyz dane ze zmiennych "freeSpaceFirst" i "freeSpaceSecond" pokazuja dane mniej precyzyjnie,
#a co za tym idzie, pasek postepu by nie pokazywal zmian, gdyby zmiany byly zbyt male.
freeSpaceFirstByte=`df|grep $firstDevice|awk '{print $4}'`
freeSpaceSecondByte=`df|grep $secondDevice|awk '{print $4}'`


#Pobranie ilosci zajetego miejsca dla pierwszego i drugiego urzadzenia. Wartosc w bajtach. ZMIENNE OBECNIE NIE UZYWANE
usedSpaceFirstByte=`df|grep $firstDevice|awk '{print $3}'`
usedSpaceSecondByte=`df|grep $secondDevice|awk '{print $3}'`

####################################################################
#Obliczenie jaka sumaryczna pojemnosc ma dana partycja. Wersja dla nowszych i starszych wersji basha. ZMIENNE OBECNIE NIE UZYWANE

#Dodawanie/mnozenie itp liczb (dziala tylko na nowszych wersjach basha). w nawiasach mozna takze inkrementowac liczby(Sekcja "Wyrażenia") -> http://wazniak.mimuw.edu.pl/index.php?title=%C5%9Arodowisko_programisty/Bash_-_pisanie_skrypt%C3%B3w
#Jest to rozwiazanie szybsze i mniej pamieciozerne, gdyz jest interpretowane bezposrednio przez Basha, a nie jest uruchamiane osobne polecenie expr
#((totalSpaceFirstByte=$freeSpaceFirstByte\+$usedSpaceFirstByte))
#((totalSpaceSecondByte=$freeSpaceSecondByte \+ $usedSpaceSecondByte))


#Dodawanie/mnozenie itp liczb (wersja dla starszych wersji basha)
totalSpaceFirstByte=`expr $freeSpaceFirstByte + $usedSpaceFirstByte`
totalSpaceSecondByte=`expr $freeSpaceSecondByte + $usedSpaceSecondByte`
####################################################################

#Obliczenie  Ile jest zajetego miejsca na danej partycji i zamiana tej wartosci na wartosc procentowa. ZMIENNE OBECNIE NIE UZYWANE
#Wykonywanie operacji artmetycznych na liczbach zmiennoprzecinkowych
usedSpaceFirstBytePercent=`echo "($usedSpaceFirstByte/$totalSpaceFirstByte)*100" | bc -l`
usedSpaceSecondBytePercent=`echo "($usedSpaceSecondByte/$totalSpaceSecondByte)*100" | bc -l`

#Obliczenie  Ile jest wolnego miejsca na danej partycji i zamiana tej wartosci na wartosc procentowa.
#Wykonywanie operacji artmetycznych na liczbach zmiennoprzecinkowych
freeSpaceFirstBytePercent=`echo "($freeSpaceFirstByte/$totalSpaceFirstByte)*100" | bc -l`
freeSpaceSecondBytePercent=`echo "($freeSpaceSecondByte/$totalSpaceSecondByte)*100" | bc -l`


#######################
#Wyswietlenie zawartosci zmiennych poustawianych we wczesniejszych liniach.
#######################
#Linia DATE/TIME/WEEK - formatowanie daty zaczyna sie od znaku + (plusa) i dalej sie wpisuje zadane informacje jakie chce sie pobrac (godzina, minuta, sekunda, rok itp).
#Jak jakas zmienna moze miec wartosc dwu, lub trzycyfrowa, to wpisujac znak - (minus) pomiedzy znakiem % (procent), a zmienna (np zmienna "W" wyswietlajaca numer tygodnia moze miec dwie cyfry),
#nakazujemy programowani date wyswietlenie samej liczby, bez zer napoczatku, czyli jak jest np 7 tydzien, to wpisujac "%-W", wyswietli sie sama wartosc "7", a wpisujac %W, wyswietli sie "07"
#wiecej informacji na temat formatowania mozna uzyskac w manualu, wpisujac w konsoli "man date".

#echo -ne - parametr "-e" nakazuje poleceniu echo interpretacje znakow spcjalnych pomiedzy podwojnymi cudzyslowamia np. znak tabulacji (\t), znak powrotu karetki (\r).
#parametr "-n" nakazuje poleceniu echo usuniecie znaku nowej linii po wyswietleniu tekstu. Normalnie, echo po wyswietleniu tekstu przenosi kursor do nastepnej linii, a uzywajac "-n",
#kursor jest ustawiany po ostatnim wyswietlonym znaku, a co za tym idzie, uzywajac nastepnym razem polecenia echo, tekst wyswietli sie zaraz po poprzednim tekscie w tej samej linii

#Linia FREE SPACE - wyswietlenie ilosci wolnego miejsca na danej partycji pod postacia B/KB/MB/GB itd, a takze w postaci procentowej na pasku postepu.
#Pasek postepu wyswietla sie przy uzyciu programu dbar. Program dbar musi otrzymac dane z programu echo przez potok (znak | ). Wiecej informacji o programie dbar,
#mozna uzyskac w manualu, wpisujac w konsoli "man dbar"
echo " -------------------------------------------------------"
echo "    USER:			$USER ($currentShell)"
echo "    LAST LOGIN:			$lastLoginTty ( $lastLoginAddress ), $lastLoginDate, $lastLoginTime"
echo "    STILL LOGGED IN ($USER):	$numberOfUsers shells ( $tty)"
echo " --"
echo "    DATE:			`date '+%A %-d %B %Y'`"
echo "    TIME:			`date '+%k:%M:%S'`"
echo "    WEEK:			`date '+%-W'` tydzien `date '+%Y'` roku"
echo " --"
echo "    UPTIME:			$uptime"
echo " --"
echo -ne "    FREE SPACE(root):		$freeSpaceFirst \t| "; echo "$freeSpaceFirstBytePercent 0 100" | dbar -w 40 -s "="
echo -ne "    FREE SPACE(backup):		$freeSpaceSecond \t| "; echo "$freeSpaceSecondBytePercent 0 100" | dbar -w 40 -s "="
echo " -------------------------------------------------------"
echo
