diff --git a/img-helpr.sh b/img-helpr.sh index 4e17696..bd7c5a7 100755 --- a/img-helpr.sh +++ b/img-helpr.sh @@ -6,6 +6,7 @@ ## wird in der Zwischenablage abgelegt. ## Author swg, janeemussja.de, November 2013 ## letzte Änderungen +## - Februar 2024, Version 1.08, logger function replaced with bash snipped ## - März 2023, Version 1.07, which_is Funktion repariert ## - Juni 2021, Version 1.06, Progress bar eingebaut ## - Januar 2021, Version 1.05, Test auf fehlende Software geändert. @@ -15,23 +16,44 @@ ## MODIFY AND SHARE AS YOU LIKE! # Log levels for messages -LLMUTE=0 -LLERROR=1 -LLWARNING=2 -LLINFO=3 -LLDEBUG=4 -# Actual log level of the logger used -LOGLEVEL=$LLDEBUG +LLMute=0 +LLMdtry=1 # mandatory: messages that are always written to the log (except mute) +LLError=2 +LLWarning=3 +LLInfo=4 +LLDebug=5 +## Actual log level of the logger used +Log_Level=$LLInfo -# Write log of the script +## base name of the logging script. +Log_Name="${0##*/}"; + +## Write log of the script. +## $1 Loglevel to log the message with. +## $2 message to log. function logger() { -LOGGINGLEVEL=$1; -LOGMESSAGE=$2; -if [ $LOGLEVEL -ge $LOGGINGLEVEL ]; -then - echo ${LOGMESSAGE}; -fi -} + local _logging_level=$1; + local _log_message=$2; + if [[ $Log_Level -lt $_logging_level ]]; then + return; + fi + local _now=$($DATE +%Y%m%d_%H:%M:%S); + if [[ $_logging_level -eq $LLInfo ]]; then + _type=" Info:"; + elif [[ $_logging_level -eq $LLError ]]; then + _type=" ERROR!"; + elif [[ $_logging_level -eq $LLWarning ]]; then + _type=" Warning:"; + elif [[ $_logging_level -eq $LLDebug ]]; then + _type=" DEBUG:"; + else + _type=":"; + fi + printf "$Log_Name ${_now}${_type} ${_log_message}\n" >> $Log_File; + if [[ $Log_Level -eq $LLDebug ]]; then + printf "${_now}${_type} ${_log_message}\n"; + fi +} function CleanUp() { @@ -47,104 +69,73 @@ exec 3>&- exec 4>&- } +## Returns the binaries full path if existent. function which_is() { - declare -n RETVAL=$1; - EXECUTABLE=$2; - WITHFULLPATH=$(which ${EXECUTABLE} 2>/dev/null); - if [ -x "$WITHFULLPATH" ]; - then - RETVAL="$WITHFULLPATH"; + declare -n _ret_val=$1; # declare RETVAL a reference of $1 + local _executable=$2; + local _with_full_path=$(which ${_executable} 2>/dev/null); + if [ -x "$_with_full_path" ]; then + _ret_val="$_with_full_path"; return 0; else - RETVAL="$EXECUTABLE not found!"; + _ret_val="$_executable not found!"; return 1; fi } - # Was wir am Anfang brauchen -PATH=$PATH:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/global/bin:/global-common/scripts:/usr/sfw/bin:/opt/sfw/bin:/usr/ccs/bin:/usr/xpg4/bin:/opt/SUNWspro/bin:/usr/dt/bin:/usr/openwin/bin:/usr/ucb:/opt/bin - -## Prüfen der notwendigen Software auf Existenz und Ausführbarkeit -# zenity - -which_is MSGDIALOG 'zenity'; -if [[ "$?" != "0" ]]; -then - echo "$MSGDIALOG not found, aborting"; - exit 1; -fi - -# imagemagick -which_is CONVERT 'convert'; -if [[ "$?" != "0" ]]; -then - echo "$CONVERT not found, aborting"; - exit 1; -fi - -# imagemagick -which_is IMGDISPLAY 'display'; -if [[ "$?" != "0" ]]; -then - echo "$IMGDISPLAY not found, aborting"; - exit 1; -fi - -# date -which_is DATE 'date'; -if [[ "$?" != "0" ]]; -then - echo "$DATE not found, aborting"; - exit 1; -fi - -# exiftool -which_is EXIFTOOL 'exiftool'; -if [[ "$?" != "0" ]]; -then - echo "$EXIFTOOL not found, aborting"; - exit 1; -fi - -# xclip -which_is XCLIP 'xclip'; -if [[ "$?" != "0" ]]; -then - echo "$XCLIP not found, aborting"; - exit 1; -fi - -# printf -which_is PRINTF 'printf'; -if [[ "$?" != "0" ]]; -then - echo "$PRINTF not found, aborting"; - exit 1; -fi - -# sed -which_is SED 'sed'; -if [[ "$?" != "0" ]]; -then - echo "$SED not found, aborting"; - exit 1; -fi - +PATH=$PATH:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl SCRIPTNAME=$(echo $0 | sed -e 's/.*\///g'); -VERSION="1.07"; -VERS=1.07; +VERSION="1.08"; ME=$(whoami); TMPPFAD=/tmp; MYHOME=$(echo ~); USTRICH="_"; +## Prüfen der notwendigen Software auf Existenz und Ausführbarkeit +# date +which_is DATE 'date'; +if [ $? != 0 ]; then echo "$DATE not found, aborting"; exit 1; fi + +## Logfile in nextcloud to have a visible result. +Run_Date=$($DATE +%Y_%m_%d) +Log_File="$MYHOME/${Run_Date}_${Log_Name}.log"; +touch $Log_File; +logger $LLInfo "Path: $PATH"; + +# zenity +which_is MSGDIALOG 'zenity'; +if [ $? != 0 ]; then logger $LLError "$MSGDIALOG not found, aborting"; exit 1; fi + +# imagemagick +which_is CONVERT 'convert'; +if [ $? != 0 ]; then logger $LLError "$CONVERT not found, aborting"; exit 1; fi + +# imagemagick +which_is IMGDISPLAY 'display'; +if [ $? != 0 ]; then logger $LLError "$IMGDISPLAY not found, aborting"; exit 1; fi + +# exiftool +which_is EXIFTOOL 'exiftool'; +if [ $? != 0 ]; then logger $LLError "$EXIFTOOL not found, aborting"; exit 1; fi + +# xclip +which_is XCLIP 'xclip'; +if [ $? != 0 ]; then logger $LLError "$XCLIP not found, aborting"; exit 1; fi + +# printf +which_is PRINTF 'printf'; +if [ $? != 0 ]; then logger $LLError "$PRINTF not found, aborting"; exit 1; fi + +# sed +which_is SED 'sed'; +if [ $? != 0 ]; then logger $LLError "$SED not found, aborting"; exit 1; fi + exec 3> >($MSGDIALOG --notification --listen) # The PID of zenity is needed to kill the process at the end of the script ZenityPID=$!; -#((ZenityPID=ZenityPID+1)) # this is a workaround as I don't know how to get the PID of zenity (but get the one of exec) echo "tooltip:Script ${SCRIPTNAME}, Version ${VERSION}" >&3 -#$(logger 3 "Script ${SCRIPTNAME}, Version ${VERSION}"); +logger $LLDebug "Script ${SCRIPTNAME}, Version ${VERSION}."; if [ ! $# -gt 0 ]; then echo "img-helpr, Version: $VERSION, June 2021" echo "Syntax: img-helpr.sh IMG_FILE1 [IMG_FILE2 ...]"; @@ -155,36 +146,38 @@ fi; ## Nutzerdaten USERDATAFILE=$MYHOME/.img_helpr; +## If userdatafile does not exist create one with default values. if [[ -f $USERDATAFILE ]]; then - source $USERDATAFILE; + source $USERDATAFILE; else - printf "#!/bin/bash\nlocal_blog_path='%s/Blog/'; # Wohin sollen die Bilder lokal gespeichert werden\nw_blog_img=450; # Wieviele Pixel breit soll das Blogbild sein\nw_img=1200; # Wieviele Pixel breit soll das verlinkte Bild maximal sein\nh_img=900; # Wieviele Pixel hoch soll das verlinkte Bild maximal sein\nblog_address='http://www.example.com/wp-content'; # Webadresse des Blogs\nblog_path='./wp-content'; # wo im Blog liegen die Bilder\nSSH_LOGIN='' # ssh-Login beim Hoster\nSSH_PASSWD=''" $MYHOME > $USERDATAFILE; - chmod 750 $USERDATAFILE; - source $USERDATAFILE; + printf "#!/bin/bash\nlocal_blog_path='%s/Blog/'; # Wohin sollen die Bilder lokal gespeichert werden\nw_blog_img=450; # Wieviele Pixel breit soll das Blogbild sein\nw_img=1200; # Wieviele Pixel breit soll das verlinkte Bild maximal sein\nh_img=900; # Wieviele Pixel hoch soll das verlinkte Bild maximal sein\nblog_address='http://www.example.com/wp-content'; # Webadresse des Blogs\nblog_path='./wp-content'; # wo im Blog liegen die Bilder\nSSH_LOGIN='' # ssh-Login beim Hoster\nSSH_PASSWD=''" $MYHOME > $USERDATAFILE; + chmod 750 $USERDATAFILE; + source $USERDATAFILE; fi if [ ! -d "$local_blog_path" ]; then - echo "Lokaler Speicherpfad ($local_blog_path) für die Bilder existiert nicht!"; - exit 1; + logger $LLError "Lokaler Speicherpfad ($local_blog_path) für die Bilder existiert nicht!"; + exit 1; fi ## Aus den übergebenen Argumenten die Dateien rausklauben ## Leerzeichen behandeln: +logger $LLDebug "Taking care of spaces in file names."; ARGS="$*"; INP_C=0; INP_TEMP=""; for INP in $ARGS do - #echo "INP ist: $INP"; - INP_TEMP="$INP_TEMP$INP"; - if [ -f "$INP_TEMP" ]; then - FILE[$INP_C]="$INP_TEMP"; #echo "Arrayinhalt an der Stelle $INP_C: ${FILE[$INP_C]}"; - ((INP_C=INP_C+1)); - INP_TEMP=""; - else - echo "Fehler: $?" - INP_TEMP="$INP_TEMP "; - fi + logger $LLDebug "INP ist: $INP"; + INP_TEMP="$INP_TEMP$INP"; + if [ -f "$INP_TEMP" ]; then + FILE[$INP_C]="$INP_TEMP"; + logger $LLDebug "Content of File[$INP_C]: ${FILE[$INP_C]}"; + ((INP_C=INP_C+1)); + INP_TEMP=""; + else + INP_TEMP="$INP_TEMP "; + fi done ## Schleife für Bildumwandlung: Pfad erzeugen @@ -194,9 +187,8 @@ declare -A EXIFDATETIMELIST; # nimmt das Aufnahmedatum + Uhrzeit des Originals MAX_INP_C=$INP_C; for((INP_C=0;INP_C<${#FILE[*]};INP_C++)); do - #echo "Bearbeite: ${FILE[$INP_C]}"; - #echo "Preview: $local_blog_path/preview.jpg"; - # Mögliches Vorschaubild aus exif holen und anzeigen + logger $LLDebug "Bearbeite: ${FILE[$INP_C]}"; + logger $LLDebug "Preview: $local_blog_path/preview.jpg"; $EXIFTOOL -b -W "$local_blog_path/preview.jpg" -preview:PreviewImage "${FILE[$INP_C]}"; if [ -f "$local_blog_path/preview.jpg" ]; then # Wenn exifvorschau existierte: Anzeigen origOrient=$($EXIFTOOL -s -s -s -n -Orientation "${FILE[$INP_C]}"); @@ -214,7 +206,7 @@ do DATETIMEORIGINAL=$($EXIFTOOL -DateTimeOriginal -S "${FILE[$INP_C]}" | $SED -e 's/DateTimeOriginal:\ //'); ## Datum alternativ von heute nehmen if [[ -z "${OUT_PATH_Y##?([-+])+([0-9])}" ]] || [[ -z "${OUT_PATH_M##?([-+])+([0-9])}" ]] || [[ -z "${OUT_DAY##?([-+])+([0-9])}" ]]; then - echo "Kein Datum in Exif gefunden (Jahr=$OUT_PATH_Y, Monat=$OUT_PATH_M, Tag=$OUT_DAY)"; + logger $LLWarning "Kein Datum in Exif gefunden (Jahr=$OUT_PATH_Y, Monat=$OUT_PATH_M, Tag=$OUT_DAY)"; OUT_PATH_Y=$(date +%Y); OUT_PATH_M=$(date +%m); OUT_DAY=$(date +%d); @@ -240,10 +232,10 @@ do while [ -z "${FILENAME}" ] do FILENAME=$($MSGDIALOG --entry --title "Dateiname" --text "Welchen Dateinamen soll das Bild bekommen?" --entry-text="$OUT_DAY$USTRICH" 2> /dev/null); - if [ "$?" -eq "1" ]; then # Es wurde Abbruch geklickt, Script endet: + if [ $? -eq 1 ]; then # Es wurde Abbruch geklickt, Script endet: kill $IMGDISPLAYPID; - CleanUp; - exit 1; + CleanUp; + exit 1; fi done OUTFILE="${local_blog_path}/${OUT_PATH_Y}/${OUT_PATH_M}/${FILENAME}.jpg"; @@ -295,22 +287,22 @@ exec 4> >(${MSGDIALOG} --progress --title="${SCRIPTNAME} ($FILECOUNT files)" --p PROGRESS=0; ## Wenn keine Logindaten hinterlegt sind, muss das Script nur noch die exif-Daten schreiben if [ -z "${SSH_LOGIN}" ]; then - #echo "nur exif setzen"; + logger $LLDebug "No ssh upload, just setting exif."; while [ ${#FILELIST[@]} -gt 0 ] # solange noch CONVERTPIDs vorhanden sind do for CPID in "${!FILELIST[@]}"; do if [ -n "${CPID}" -a -d "/proc/${CPID}" ]; then - # Prozess läuft noch, hochladen noch nicht möglich + logger $LLDebug "Process $CPID still running, exif postphoned."; sleep 2; else - # Konvertierung beendet, kann exif schreiben + logger $LLDebug "${FILELIST[${CPID}]} converted, doing exif."; echo "# Setting exif ${FILELIST[${CPID}]}" >&4 ((PROGRESS++)) echo $(( ($PROGRESS*100/$MAX_INP_C)-1 )) >&4 $EXIFTOOL -overwrite_original -DateTimeOriginal="${EXIFDATETIMELIST[${CPID}]}" ${FILELIST[${CPID}]}; $EXIFTOOL -overwrite_original -OriginalFileName="${EXIFORIGINALLIST[${CPID}]##*/}" ${FILELIST[${CPID}]}; - #echo "tooltip:Argumente: ${EXIFORIGINALLIST[${CPID}]##*/}" >&3 # DEBUG! + logger $LLDebug "tooltip:Argumente: ${EXIFORIGINALLIST[${CPID}]##*/}"; unset FILELIST["${CPID}"]; unset EXIFDATETIMELIST["${CPID}"]; unset EXIFORIGINALLIST["${CPID}"]; @@ -326,14 +318,14 @@ fi ## Hochladen der Bilder aufs Blog while [ ${#FILELIST[@]} -gt 0 ] # solange noch CONVERTPIDs vorhanden sind do - #echo "Länge Liste: ${#FILELIST[@]}"; + logger $LLDebug "Länge Liste: ${#FILELIST[@]}"; for CPID in "${!FILELIST[@]}"; do if [ -n "${CPID}" -a -d "/proc/${CPID}" ]; then - # Prozess läuft noch, hochladen noch nicht möglich + logger $LLDebug "Process $CPID still running, exif and upload postphoned."; sleep 2; else - #echo "Konvertierung beendet, kann exif und hochladen"; + logger $LLDebug "${FILELIST[${CPID}]} converted, doing exif and upload."; echo "# Setting exif ${FILELIST[${CPID}]}" >&4 ((PROGRESS++)) echo $(( ($PROGRESS*25/$MAX_INP_C)-1 )) >&4 @@ -352,7 +344,7 @@ do done done -sleep 5; +sleep 2; echo "100" >&4 # trigger auto-close of progressbar CleanUp; exec 4>&-