Ordnerinhalt ohne Bashscript via ftp-Verbindung löschen möglich ?

Begonnen von TomLee, 10 Januar 2022, 14:53:23

Vorheriges Thema - Nächstes Thema

TomLee

Zitat von: TomLee am 20 Januar 2022, 12:57:44
wie ich das mit dem mounten/umounten löse ist mir noch nicht ganz klar, ...

Es dürfte doch nix dagegen sprechen immer beim Starten/Beenden von Fhem zu mounten/unmounten, oder ?

defmod not_mnt_FBNAS notify global:INITIALIZED|global:SHUTDOWN { $EVENT eq 'INITIALIZED' ? system(q(mount /mnt/FRITZNAS &)) : system(q(umount /mnt/FRITZNAS &))}

Otto123

was spricht dagegen den mount Befehl am Anfang von deinem system() Aufruf zumachen?
Genau genommen sollte man immer noch prüfen ob es geklappt hat...
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Zitatwas spricht dagegen den mount Befehl am Anfang von deinem system() Aufruf zumachen?

Na weil ich das dreimal auch definieren muss und schreibfaul bin ? Morgen fällt mir wieder was neues ein dann mounte/unmounte/schreibe ich das wieder ?
Was spricht dagegen das immer (zumindest wenn FHEM läuft) gemounted ist ?

Ich mein ich hab das schon mit bekommen das du das so handhabst, immer vorher mounten und wieder unmounten bei jedem Zugriff, aber ich muss das ja nicht auch so machen, ausser du überzeugst mich von den Vorteilen.

ZitatGenau genommen sollte man immer noch prüfen ob es geklappt hat...

Ich komm gerade nicht mit wie das gemeint ist, auf was prüfen, ob gemounted und nur dann weiter ?


Wernieman

Grundsätzlich:
Alles kann schiefgehen, wie z.B. der mount. Deshalb sollte man
1. den Fehlercode auswerten ($?)
2. nachprüfen, obs geklappt hat
Wie eben in jedem Programm. Macht es Fehlertolleranter

Der dauerhafte mount hat den nachteil, das es zu problemen z.B. bei reboot des Quellsystemes kommen kann. Was nicht gemountet ist, kann keine Probleme verursachen. Bei Backupsystemen kommt noch ein 2. Aspekt hinzu: Was nicht gemountet ist, kann nicht komprimitiert werden. *)

*) deshalb sind bei mir backupplatten nicht mal "angeschaltet". Was nicht läuft ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

TomLee

Danke für das erläutern.

Ich schlussfolgere daraus, weil jetzt wirds ja noch länger, das ich am Ende für meine kleine Spielerei bis jetzt drei Bash-Scripte erstellen müsste, weil hier wird ja immer empfohlen die Shell-Befehle in ein Script auszulagern und nicht alles über einen System-Befehl in FHEM.

Morgen fällt mir wieder was neues ein, brauch ich wieder ein neues Script, das summiert sich mit der Zeit, da hat das für mich schon was wenn man alles einfach nur in der DEF einer msgDialog-Definition stehen hat, meine jetzigen Gedanken dazu.

edit:

Ok, mit Parameterübergabe braucht man nur ein Script und es ist alles etwas kürzer geworden wie ich mir vorgestellt hatte.

Bei dem if mit den zwei Bedingungen bin ich mir unsicher ob das korrekt ist mit [ $1 == 0 ]

#!/bin/bash

um="umount /mnt/FRITZNAS"
mount /mnt/FRITZNAS;
if [ $? -ne 0 ] || [ $1 == 0 ]; then
    echo "Fehler !"
elif [ $1 == "print" ]
    then
    lpr -P HL-2035 /mnt/FRITZNAS/fax.pdf;
    rm /mnt/FRITZNAS/*;
    $um;
elif [ $1 == "save" ]
    then
    cp /mnt/FRITZNAS/fax.pdf /media/usbstick/bli/bla/Fax/fax_`date +%y%m%d_%H%M`.pdf;
    rm /mnt/FRITZNAS/*;
    $um;
elif [ $1 == "delete" ]
    then
    rm /mnt/FRITZNAS/*;
    $um;
fi


defmod md_fax msgDialog {\
"Fax": {\
"message": [\
"{return('(Drucken) ')}",\
"{return('(Sichern) ')}",\
"{return('(Löschen) ')}",\
"(abbrechen) ",\
"{return('Was kann ich für dich tun ?')}"\
],\
"Drucken": {\
"commands": [\
"{system('/opt/fhem/tgfax.sh print &')}"\
]\
},\
"Sichern": {\
"commands": [\
"{system('/opt/fhem/tgfax.sh save &')}"\
]\
},\
"Löschen": {\
"commands": [\
"{system('/opt/fhem/tgfax.sh delete &')}"\
]\
} \
}\
}

TomLee

Wäre es so OK zu prüfen ?

#!/bin/bash
mount /mnt/FRITZNAS;
if [ $? -ne 0 ]; then
    echo "Fehler !"
else
lpr -P HL-2035 /mnt/FRITZNAS/fax.pdf;
rm /mnt/FRITZNAS/*;
umount /mnt/FRITZNAS
fi


Sry, wie mach ich in dem Script "nichts" statt was zurückzugeben ?

Kann ich in einem Bashscript auch sowas wie ein kurzes if machen ?

In Perl geht sowas return if <Bedingung>;

Geht es ähnlich auch in der Scriptsprache ?

Otto123

Zum ersteren: https://github.com/heinz-otto/raspberry/blob/master/setupBackupFhem2Cifs.sh

qpath=$1
dpath=$2
LOG=/var/log/backupFhem.log
{
date
if mount "$dpath"
then
    # only piping works inside crontab
    echo "set BackupFhem gestartet"|$fhemcl $url
    if rsync -rut ${qpath}/backup ${qpath}/restoreDir ${dpath}/fhem/$(hostname)
    then
       echo "set BackupFhem gesichert"|$fhemcl $url
    else
       echo "set BackupFhem RsyncError"|$fhemcl $url
    fi
    umount "$dpath"
else
    echo "set BackupFhem MountError"|$fhemcl $url
fi
} >> $LOG 2>&1

Ich glaube zweiteres ist auch dabei :)
Aber - als Rückgabe in Bash gibt es zwei Kanäle: der normale und Error.
Ich lese immer ganz hier https://openbook.rheinwerk-verlag.de/shell_programmierung/shell_008_003.htm
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

ZitatAber - als Rückgabe in Bash gibt es zwei Kanäle: der normale und Error.

Komm noch nicht ganz mit, Werniemann sagt was von Fehlercode auswerten/prüfen und du machst, in dem Beispiel, wie ich das sehe einfach nur ein if mount <Pfad>, habs aber noch nicht nachvollzogen was da genau passiert dann.

Meine gezeigte Prüfung/Bedingung [ $? -ne 0 ] hatte ich nachvollzogen und die greift auch wenn der mount-Befehl was zurück gibt, sonst gehts weiter.

Ich hab bis jetz aber auch noch nicht wirklich verstanden was die normale Rückgabe ist und was die Fehler-Meldung (zu wenig gelesen).

ZitatSry, wie mach ich in dem Script "nichts" statt was zurückzugeben ?

Einfach nur ein return und das Programm wird verlassen, hab ich heute Morgen im Kopf wenn ich mich an das wenig gelesene von gestern Abend erinnere, allerdings wird dann ja auch was zurückgegeben, habs auch noch nicht ausprobiert.

Otto123

if mount <Pfad> - ist nur wahr wenn der mount (der Befehl) erfolgreich war -> siehe
Deswegen geht ja auch die Kurzform mit UND für den Erfolg
mount <Pfad> && Mache was mit dem Pfad
oder mit ODER für den Misserfolg
mount <Pfad> || Das ging in die Hose
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wernieman

"if <Befehl>" und auswerten von $? ist "kurzgesagt" das gleiche. Ich persöhnlich finde aber das Trennen von Befehl und Errorauswertung gut.

Damit kann man dann auch Fehler in Pipes auswerten "Befehl1 | Befehl2 | Befehl3" .. dann zeigt $? zwar nur den Fehlercode vom letzten Befehl (im Normalfall) .. zum durchlesen z.B. https://unix.stackexchange.com/questions/14270/get-exit-status-of-process-thats-piped-to-another

Sorry aber die Woche war anstrengend, deshalb aktuell wenig Hilfe von mir ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

TomLee

Zitat6.4.1 Rückgabewert mit return  downtop
Wird der Befehl return innerhalb einer Funktion ausgeführt, wird die Funktion verlassen und der Wert n als Ganzzahl zurückgegeben. Die Syntax:

return [n]
Wird hierbei nicht der Parameter n verwendet, dann wird der Rückgabewert des zuletzt ausgeführten Kommandos zurückgegeben.

Ich hätt gerne eine Bestätigung/Meldung was/das was ausgeführt wurde.

Wie krieg ich denn den Rückgabewert des zuletzt ausgeführten Kommandos in den set-Befehl ?

So nicht:


Zitatelif [ $1 == "delete" ]
    then
    rm -v /mnt/FRITZNAS/*;
    ret=return
    perl fhem.pl 7072 "set tb_TelegramBot msg $ret";
    $um;
fi

Wie krieg ich den Rückgabewert von rm -v /mnt/FRITZNAS/*; in den set-Befehl ?

Otto123

nicht probiert aber sollte so gehen ret=$(rm -v /mnt/FRITZNAS/*;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee


TomLee

jetzt noch den Perl-Befehl selbst inkl. Variable, wieder in einer Variablen, zum sparen, wenns geht.

Ich habs auch mit tblog=$(perl fhem.pl 7072 "set tb_TelegramBot msg $ret";"); probiert, beides klappt nicht.

Kann man das mit der Variable in einer Variable überhaupt machen ?

Zitat#!/bin/bash

um="umount /mnt/FRITZNAS"
tblog="perl fhem.pl 7072 "set tb_TelegramBot msg $ret";"

if mount /mnt/FRITZNAS
then
if [ $1 == "print" ]
    then
    cp /mnt/FRITZNAS/fax.pdf /media/usbstick/bli/bla/Fax/fax_`date +%y%m%d_%H%M`.pdf;
    lpr -P HL-2035 /mnt/FRITZNAS/fax.pdf;
    ret=$(rm -v /mnt/FRITZNAS/*; )
    perl fhem.pl 7072 "set tb_TelegramBot msg $ret";

    $um;
elif [ $1 == "save" ]
    then
    ret=$(cp -v /mnt/FRITZNAS/fax.pdf /media/usbstick/bli/bla/Fax/fax_`date +%y%m%d_%H%M`.pdf;)
    perl fhem.pl 7072 "set tb_TelegramBot msg $ret";
    ret=$(rm -v /mnt/FRITZNAS/*; )
    perl fhem.pl 7072 "set tb_TelegramBot msg $ret";
    $um;

elif [ $1 == "delete" ]
    then
    ret=$(rm -v /mnt/FRITZNAS/*; )
    $tblog;
    $um;
fi

fi

Otto123

Du meinst Befehl in Variable und Variable ausführen?
Das ist ein bisschen speziell. Hab hier was gefunden: https://unix.stackexchange.com/questions/444946/how-can-we-run-a-command-stored-in-a-variable
Geht z.B. über array:
cmd=(ls -lha)
"${cmd[@]}"

Geht auch mit Variable
cmd1='ls'
cmd2='-lha'
cmd=($cmd1 $cmd2)
"${cmd[@]}"
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz