#!/bin/bash
#
# Skrypt jest nakladka semigraficzna na program find(1), w zalozeniu
# upraszczajaca uzywanie tegoz (a to sie w ogole da?).
# 
# Skrypt bedzie dzialac poprawnie tylko w srodowisku GNU (znaczy pod
# Linuksem), gdyz wykorzystuje rozszerzenie GNU programu date, jak i program
# dialog(1), nie wystepujacy w standardzie uniksa (np. w Solarisie)
#
# Skrypt jest na licencji GNU GPL (dowolnej wersji). Po tresc licencji udaj
# sie na www.gnu.org

# wspolne opcje dla wszystkich okienek
DIALOG_OPTS='--cancel-label Anuluj --ok-label OK'

# gdzie szukamy?
KATALOG=`dialog $DIALOG_OPTS \
         --inputbox 'Gdzie mam zaczac szukac?' 8 70 / \
         2>&1` || exit 0

# opcje szukania
OPCJE=`dialog $DIALOG_OPTS \
       --checklist 'Wedlug czego chcesz szukac pliku?' 11 50 4 \
         fname 'Nazwa pliku'      on  \
         owner 'Wlasciciel'       off \
         perms 'Uprawnienia'      off \
         date  'Czas modyfikacji' off \
       2>&1` || exit 0

# jesli szukamy po nazwie, to okienko dialogowe na maske
if echo "$OPCJE" | grep fname > /dev/null 2>&1; then
  NAZWA_PLIKU=`dialog $DIALOG_OPTS \
              --inputbox 'Podaj maske' 8 70 "*" \
              2>&1` || exit 0
fi

# jesli szukamy po wlascicielu, to okienko dialogowe na wlasciciela
if echo "$OPCJE" | grep owner > /dev/null 2>&1; then
  WLASCICIEL=`dialog $DIALOG_OPTS \
              --inputbox 'Kto ma byc wlascicielem?' 8 70 "$USER" \
              2>&1` || exit 0
fi

# jesli szukamy po prawach dostepu, to okienko dialogowe na te prawa
if echo "$OPCJE" | grep perms > /dev/null 2>&1; then
  UPRAWNIENIA=`dialog $DIALOG_OPTS \
               --checklist 'Jakie uprawnienia ma miec plik?' 16 50 9 \
                 0400 'Wlasciciel ma prawo odczytu'     no \
                 0200 'Wlasciciel ma prawo zapisu'      no \
                 0100 'Wlasciciel ma prawo wykonywania' no \
                 0040 'Grupa ma prawo odczytu'          no \
                 0020 'Grupa ma prawo zapisu'           no \
                 0010 'Grupa ma prawo wykonywania'      no \
                 0004 'Reszta ma prawo odczytu'         no \
                 0002 'Reszta ma prawo zapisu'          no \
                 0001 'Reszta ma prawo wykonywania'     no \
               2>&1` || exit 0
  # dodajemy do siebie uprawnienia
  UPRAWNIENIA=$((`echo "$UPRAWNIENIA" | sed 's/" "0*/+/g' | sed 's/"0*//g'`))
  # zamieniamy na czterocyfrowa postac osemkowa
  UPRAWNIENIA=`printf '%04d' "$UPRAWNIENIA"`
fi

# jesli szukamy po dacie modyfikacji, to okienko dialogowe na czas
if echo "$OPCJE" | grep date > /dev/null 2>&1; then
  DATA=`dialog $DIALOG_OPTS \
        --calendar 'Kiedy plik byl zmieniany?' 5 40 \
        2>&1` || exit 0
  # zmieniamy zapis daty z DD/MM/YY na MM/DD/YY (uzywany przez date(1))
  DATA=`echo $DATA | awk -F/ '{print $2 "/" $1 "/" $3}'`
  # ustalamy, ile dni temu to bylo
  DATA=$(( ( `date +%s` - `date -d $DATA +%s` ) / 86400 ))

  # dowiadujemy sie, czy szukamy starszych plikow
  if dialog $DIALOG_OPTS --yesno "Szukac pliku starszego?" 5 30; then
    DATA="+$DATA"
  else
    DATA="-$DATA"
  fi
fi

# spajamy wszystkie opcje
KOMENDA="find '$KATALOG'"
test -n "$NAZWA_PLIKU" && KOMENDA="$KOMENDA -name  '$NAZWA_PLIKU'"
test -n "$UPRAWNIENIA" && KOMENDA="$KOMENDA -perm  '-$UPRAWNIENIA'"
test -n "$WLASCICIEL"  && KOMENDA="$KOMENDA -user  '$WLASCICIEL'"
test -n "$DATA"        && KOMENDA="$KOMENDA -mtime '$DATA'"

# dowiadujemy sie, gdzie wladowac wyniki
if dialog $DIALOG_OPTS --defaultno --yesno \
	      "Zapisac wyniki do pliku?" 5 30; then
  # jak sie plik ma nazywac?
  PLIK_WYNIKOWY=`dialog $DIALOG_OPTS \
                 --inputbox 'Gdzie zapisac wyniki?' 8 70 "wynik.txt" \
                 2>&1`
fi

if [ -n "$PLIK_WYNIKOWY" ]; then
  KOMENDA="$KOMENDA > '$PLIK_WYNIKOWY'"
else
  KOMENDA="$KOMENDA | less -E"
fi

clear 
# wykonujemy polecenie
eval "$KOMENDA"
