#!/bin/bash 

# Skrypt changetrack śledzący zmiany na stronie o zadanym adresie
# URL i wysyłający jej zawartość na zadany adres e-mail, jeżeli od
# czasu ostatniego uruchomienia skryptu na stronie zostały
# wprowadzone zmiany.

sendmail=$(which sendmail)
sitearchive="/tmp/changetrack"
tmpchanges="$sitearchive/changes.$$"  # Tymczasowy plik.
fromaddr="nadawca@adresnadawcy.pl"
dirperm=755        # Uprawnienia do odczytu, zapisu i uruchamiania
                   # dla właściciela katalogu.
fileperm=644       # Uprawnienia do odczytu i zapisu dla właściciela pliku,
                   # tylko do odczytu dla innych użytkowników.

trap "$(which rm) -f $tmpchanges" 0 1 15  # Usunięcie pliku tymczasowego
                                          # po zakończeniu skryptu.

if [ $# -ne 2 ] ; then
  echo "Użycie: $(basename $0) adres_url adres_email" >&2
  echo "Wskazówka: aby wyświetlić zmiany na ekranie, wpisz '-' jako adres e-mail." >&2
  exit 1
fi

if [ ! -d $sitearchive ] ; then
  if ! mkdir $sitearchive ; then
    echo "$(basename $0) Błąd: nie można utworzyć archiwum $sitearchive." >&2
    exit 1
  fi
  chmod $dirperm $sitearchive
fi

if [ "$(echo $1 | cut -c1-5)" != "http:" ] ; then
  echo "Podaj pełny adres URL (zaczynający się od 'http://')" >&2
  exit 1
fi

fname="$(echo $1 | sed 's/http:\/\///g' | tr '/?&' '...')"
baseurl="$(echo $1 | cut -d/ -f1-3)/"

# Odczytanie zawartości strony i zapisanie jej w pliku archiwum. Zwróć uwagę,
# że zmiany można śledzić, porównując tylko treść strony (używając argumentu
# -dump, a nie -source), dzięki czemu nie trzeba analizować kodu HTML.

lynx  -dump "$1" | uniq > $sitearchive/${fname}.new

if [ -f "$sitearchive/$fname" ] ; then
  # Tę stronę odwiedziliśmy już wcześniej, więc trzeba porównać jej dwie wersje
  # za pomocą polecenia diff.
  diff $sitearchive/$fname $sitearchive/${fname}.new > $tmpchanges
  if [ -s $tmpchanges ] ; then
    echo "Status: strona $1 zmieniła się od czasu ostatniej wizyty."
  else
    echo "Status: strona $1 nie zmieniła się od czasu ostatniej wizyty."
    rm -f $sitearchive/${fname}.new     # Brak zmian,
    exit 0                              # zakończenie skryptu.
  fi
else
  echo -n "Status: pierwsza wizyta na stronie $1. "
  echo "Zachowaj archiwum do późniejszej analizy."
  mv $sitearchive/${fname}.new $sitearchive/$fname
  chmod $fileperm $sitearchive/$fname
  exit 0
fi

# Strona została zmieniona i trzeba wysłać użytkownikowi zawartość pliku .new.
# Ponadto należy zastąpić poprzedni plik nowym, aby przygotować go do
# następnego uruchomienia skryptu.

if [ "$2" != "-" ] ; then

( echo "Content-type: text/html"
  echo "From: $fromaddr (system śledzenia zmian)"
  echo "Subject: Strona $1 została zmieniona"
  echo "To: $2"
  echo ""

   lynx -s -dump $1 | \
   sed -e "s|src=\"|SRC=\"$baseurl|gi" \
       -e "s|href=\"|HREF=\"$baseurl|gi" \
       -e "s|$baseurl\/http:|http:|g"
) | $sendmail -t

else
  # Wyświetlane samych różnic nie jest dobrym rozwiązaniem. Jakieś pomysły?
  diff $sitearchive/$fname $sitearchive/${fname}.new
fi

# Aktualizacja zapisanej zawartości strony.

mv $sitearchive/${fname}.new $sitearchive/$fname
chmod 755 $sitearchive/$fname
exit 0
