#!/bin/bash
# Skrypt validator sprawdzający, czy zmienna PATH zawiera wyłącznie
# nazwy istniejących katalogów, a następnie sprawdzający, czy wszystkie
# zmienne środowiskowe zawierają poprawne wartości. Sprawdzane są
# zmienne SHELL, HOME, PATH, EDITOR, MAIL i PAGER.

errors=0

source ../1/library.sh # Biblioteka zawierająca skrypt nr 1, funkcję in_path().

validate()
{
  varname=$1    
  varvalue=$2
  
  if [ ! -z $varvalue ] ; then
    if [ "${varvalue%${varvalue#?}}" = "/" ] ; then
      if [ ! -x $varvalue ] ; then
        echo "** Zmienna $varname ma wartość $varvalue, " \
                 "lecz program ten nie istnieje."
        (( errors++ ))
      fi
    else
      if in_path $varvalue $PATH ; then 
        echo "** Zmienna $varname ma wartość $varvalue, " \
             "lecz pliku tego nie ma w zmiennej PATH."
        errors=$(( $errors + 1 ))
      fi
    fi 
  fi
}

# POCZĄTEK GŁÓWNEJ CZĘŚCI
# =======================

if [ ! -x ${SHELL:?"Nie można kontynuować bez zdefiniowanej zmiennej SHELL."} ] ; then
  echo "** Zmienna SHELL ma wartość $SHELL, lecz program ten nie istnieje."
  errors=$(( $errors + 1 ))
fi

if [ ! -d ${HOME:?"Zmienna HOME musi wskazywać katalog domowy."} ]
then
  echo "** Zmienna HOME zawiera wartość $HOME, " \
       "lecz nie jest to nazwa katalogu domowego."
  errors=$(( $errors + 1 ))
fi

# Pierwszy test: czy wszystkie katalogi zmiennej PATH są poprawne?

oldIFS=$IFS; IFS=":"     # Zmienna zawiera IFS separator pól. Zmieniamy go na ':'.

for directory in $PATH
do
  if [ ! -d $directory ] ; then
      echo "** Zmienna PATH zawiera błędną nazwę katalogu $directory."
      errors=$(( $errors + 1 ))
  fi
done

IFS=$oldIFS  # Odtworzenie wartości zmiennej na potrzeby pozostałej części skryptu.

# Poniższe zmienne powinny zawierać pełne nazwy plików
# albo nazwy programów lub mogą być niezdefiniowane. Możesz
# umieścić tu inne zmienne, charakterystyczne dla twojego
# systemu i społeczności użytkowników. 

validate "EDITOR" $EDITOR
validate "MAILER" $MAILER
validate "PAGER"  $PAGER

# Wyświetlenie końcowego komunikatu, w zależności od tego, czy zmienna errors > 0.

if [ $errors -gt 0 ] ; then
  echo "Środowisko zawiera błędy. Powiadom administratora."
else
  echo "Środowisko jest poprawnie skonfigurowane."
fi

exit 0
