1

Temat: Katalogowanie obrazków z kamerki- skrypt

Niektórzy z Was pewnie stale magazynują obrazki z motion lub bezpośrednio z kamer IP. Pomagałem kumplowi z instalacją i obsługą Gargoyle bo chciał mieć mini monitoring ze swojej kamery IP. Jego kumpel napisał mu skrypt który kataloguje "pliki" które zawierają w nazwie datę i godzinę utworzenia zdjęcia/pliku. Niestety nie mogłem znaleźć u niego jak w cronie uruchamiany był ten skrypt (miało to katalogować co godzinę a usuwać zdjęcia starsze niż chyba 7 dni) ale sam kod wrzucam poniżej. Może ktoś zainteresowany tematem to jakoś wykorzysta lub wręcz zrobi z tego użyteczny pakiet z prostym plikiem konfiguracyjnym:)
Dodam tylko że ani osoba pisząca kod ani mój kumpel nie interesują się tym jak działa OpenWrt, ja sam się w tym kodzie nie łapię, ale może po prostu komuś się to przyda.

#!/bin/ash
# Skrypt do przenoszenia zdjec z katalogu glownego do podkatalogow
# Skrypt inaczej zwanym katalogowaniem zdjec/plikow ;)

# Sciezka podmontowania dodatkowego dysku
ROOT_DIR=$(cat /proc/mounts  | grep usb_mount | awk '{print $2}')
ROOT_DIR="${ROOT_DIR}/"
# katalog ze zdjeciami
IMG_DIR="zdjecia/"
# katalog posegregowany
SORT_CAT="sort/"
# plik z lista plikow/zdjec
TMP_LIST_FILE="tmp_list"
TMP_LIST_ALL_FILE="tmp_list_all"
# aktualny rok
rok=$(date -D %s +"%Y" -d $(($(date +"%s")-1*60*60)))
# aktualny miesiac
miesiac=$(date -D %s +"%m" -d $(($(date +"%s")-1*60*60)))
# aktualny dzien
dzien=$(date -D %s +"%d" -d $(($(date +"%s")-1*60*60)))
# aktualna godzina
godzina=$(date -D %s +"%H" -d $(($(date +"%s")-1*60*60)))
# Aktualny katalog docelowy
ACT_CAT="${ROOT_DIR}${SORT_CAT}${rok}/${miesiac}/${dzien}/${godzina}/"
# tresc komunikatu helpa
USAGE="${0} \n\n -d Usuwanie plikow \n\n -m Przenoszenie plikow \n\n -s Lista plikow \n\n -L Usuwanie starych plikow oraz przenoszenie \n\n -A Przenoszenie wszystkich plikow"


lista_wszystkich_plikow() {
    [ -s "${ROOT_DIR}${TMP_LIST_ALL_FILE}" ] && rm -f "${ROOT_DIR}${TMP_LIST_FILE}"
    if [ -d "${ROOT_DIR}${IMG_DIR}" ]; then
        find "${ROOT_DIR}${IMG_DIR}" -maxdepth 1 -mindepth 1 -iname "snapshot-*.jpg" -type f > "${ROOT_DIR}${TMP_LIST_ALL_FILE}"
        if [ -s "${ROOT_DIR}${TMP_LIST_ALL_FILE}" ]; then
            return 0
        else
            return 1
        fi
    else 
        return 1
    fi
}
lista_plikow() {
    [ -s "${ROOT_DIR}${TMP_LIST_FILE}" ] && rm -f "${ROOT_DIR}${TMP_LIST_FILE}"
    if [ -d "${ROOT_DIR}${IMG_DIR}" ]; then
        find "${ROOT_DIR}${IMG_DIR}" -maxdepth 1 -mindepth 1 -iname "snapshot-${rok}-${miesiac}-${dzien}-${godzina}*.jpg" -type f > "${ROOT_DIR}${TMP_LIST_FILE}"
        if [ -s "${ROOT_DIR}${TMP_LIST_FILE}" ]; then
            return 0
        else
            return 1
        fi
    else 
        return 1
    fi
}
przeniesienie_wszystkich_plikow() {
    if lista_wszystkich_plikow ; then
        [ ! -s "${ROOT_DIR}${TMP_LIST_ALL_FILE}" ] && echo "Brak pliku z lista zdjec/plikow" && return 1
        #[ ! -d "${ROOT_DIR}${SORT_CAT}" ] && mkdir -p "${ROOT_DIR}${SORT_CAT}" && chmod 755 "${ROOT_DIR}${SORT_CAT}"
        for plik in `cat "${ROOT_DIR}${TMP_LIST_ALL_FILE}"`; do
            rok_local=$(basename ${plik}|cut -d '-' -f 2)
            miesiac_local=$(basename ${plik}|cut -d '-' -f 3)
            dzien_local=$(basename ${plik}|cut -d '-' -f 4)
            godzina_local=$(basename ${plik}|cut -d '-' -f 5)
            
            if [[ "${rok_local}" =~ "^[0-9]*" ]] && [[ "${miesiac_local}" =~ "^[0-9]*" ]] && [[ "${dzien_local}" =~ "^[0-9]*" ]] && [[ "${godzina_local}" =~ "^[0-9]*" ]]; then
                ACT_CAT_LOCAL="${ROOT_DIR}${SORT_CAT}${rok_local}/${miesiac_local}/${dzien_local}/${godzina_local}/"
                [ ! -d "${ACT_CAT_LOCAL}" ] && mkdir -p "${ACT_CAT_LOCAL}" && chmod 755 "${ACT_CAT_LOCAL}"
                if [ -d "${ACT_CAT_LOCAL}" ]  ; then
                    tresc=$(mv "${plik}" "${ACT_CAT_LOCAL}" 2>&1)
                    ret="${?}"
                    if [ "${ret}" -ne 0 ];then
                        echo "Problem z przeniesieniem pliku - komunikat ${tresc} - kod bledu ${ret}"
                    fi
                else
                    echo "Brak katalogu docelowego do przeniesienia zdjec"
                    exit 1
                    break
                fi
                unset ACT_CAT_LOCAL
            else
                echo "Plik nie przeniesiony ${plik} - failed substact year,month,day,hour"
            fi
        done
        if [ "${ret}" -ne 0 ];then
            return "${ret}"
        else
            return 0
        fi
    else
        echo "Blad wykonania polecenia lista_plikow"
    fi
}
przeniesienie_plikow() {
    if lista_plikow ; then
        [ ! -s "${ROOT_DIR}${TMP_LIST_FILE}" ] && echo "Brak pliku z lista zdjec/plikow" && return 1
        [ ! -d "${ACT_CAT}" ] && mkdir -p "${ACT_CAT}" && chmod 755 "${ACT_CAT}"
        for plik in `cat "${ROOT_DIR}${TMP_LIST_FILE}"`; do
            if [ -d "${ACT_CAT}" ] ; then
                tresc=$(mv "${plik}" "${ACT_CAT}" 2>&1)
                ret="${?}"
                if [ "${ret}" -ne 0 ];then
                    echo "Problem z przeniesieniem pliku - komunikat ${tresc} - kod bledu ${ret}"
                fi
            else
                echo "Brak katalogu docelowego do przeniesienia zdjec"
                exit 1
                break
            fi
        done
        if [ "${ret}" -ne 0 ];then
            return "${ret}"
        else
            return 0
        fi
    else
        echo "Blad wykonania polecenia lista_plikow"
    fi
}
wyswietlanie_plikow(){
    if [ -d "${ROOT_DIR}${IMG_DIR}" ]; then
        echo "Szukam zdjec snapshot-${rok}-${miesiac}-${dzien}-${godzina}*.jpg"
        find "${ROOT_DIR}${IMG_DIR}" -maxdepth 1 -mindepth 1 -iname "snapshot-${rok}-${miesiac}-${dzien}-${godzina}*.jpg" -type f
        return "${?}"
    else 
        echo "Brak katalogu ze zdjeciami/plikami"
        return 1
    fi
}
usuwanie_starych() {
    #wersja BusyBox
    rok_30=$(date -D %s +"%Y" -d $(($(date +"%s")-25*24*60*60 )))
    miesiac_30=$(date -D %s +"%m" -d $(($(date +"%s")-25*24*60*60 )))
    dzien_30=$(date -D %s +"%d" -d $(($(date +"%s")-25*24*60*60 )))
    #wersja GNU
    #rok_30=$(date --date='25 days ago' +"%Y")
    #miesiac_30=$(date --date='25 days ago' +"%m")
    #dzien_30=$(date --date='25 days ago' +"%d")
    if [ -d "${ROOT_DIR}${SORT_CAT}" ]; then
        for days in `seq "${dzien_30}" -1 1`; do
            if [ -d "${ROOT_DIR}${SORT_CAT}${rok_30}/${miesiac_30}/${days}/" ]; then
                echo "Usuwam ${ROOT_DIR}${SORT_CAT}${rok_30}/${miesiac_30}/${days}/"
                tresc=$(rm -rf "${ROOT_DIR}${SORT_CAT}${rok_30}/${miesiac_30}/${days}/" 2>&1)
                ret="${?}"
                if [ "${ret}" -ne 0 ];then
                    echo "Problem z usunieciem katalogow - komunikat ${tresc} - kod bledu ${ret}"
                fi
            fi
        done
        for months in `seq "${miesiac_30}" -1 1`; do
            if [ -d "${ROOT_DIR}${SORT_CAT}${rok_30}/${months}/" ]; then
                echo "Usuwam ${ROOT_DIR}${SORT_CAT}${rok_30}/${months}/"
                tresc=$(rm -rf "${ROOT_DIR}${SORT_CAT}${rok_30}/${months}/" 2>&1)
                ret="${?}"
                if [ "${ret}" -ne 0 ];then
                    echo "Problem z usunieciem katalogow - komunikat ${tresc} - kod bledu ${ret}"
                fi
            fi
        done
    else
        echo "Brak katalogu ze zdjeciami/plikami, ktore mozna by bylo usunac"
        return 1
    fi
}

while getopts dmsLA f
do
    case "${f}" in
    d)  usuwanie_starych;;
    m)  przeniesienie_plikow;;
    s)  wyswietlanie_plikow;;
    L)  usuwanie_starych; przeniesienie_plikow;;
    A)  przeniesienie_wszystkich_plikow;;
    \?) echo -e "${USAGE}"; exit 1;;
    *)  echo -e "${USAGE}"; exit 1;;
    esac
done

2 (edytowany przez sqbi 2013-05-24 20:36:43)

Odp: Katalogowanie obrazków z kamerki- skrypt

A teraz reszta opisu. Założenie jest takie że podłączony jest jeden dysk i skonfigurowany jako odczyt/zapis dla anonimowych użytkowników. U kumpla sam router z dyskiem i kamerą jest podpięty do drugiego routera więc podwójny NAT teoretycznie gwarantuje bezpieczeństwo.
Do /etc/crontabs/root trzeba dołożyć dwie linijki:

10 * * * * /scripts/kamera.sh -L
40 * * * * /scripts/kamera.sh -m

Kamera IP zapisuje zdjęcia przez FTP (do katalogu "zdjecia") co sekundę, nazwa zawiera datę po której potem następuje sortowanie.
Mam nadzieję że komuś to się przyda.

edit: aha. przykładowy plik zapisany przez kamerę to: "snapshot-2013-05-24-18-06-56.jpg"