Automatischer Import für DbLog und CacheFiles

Begonnen von GunterB, 12 Dezember 2023, 12:54:15

Vorheriges Thema - Nächstes Thema

GunterB

Hallo,

anscheinend scheint sich noch keiner dem automatischen Import der Chache Files angenommen zu haben.

Gibt es da eine Möglichkeit oder hat das schon jemand gelöst?

Meine Vorstellung wäre, dass ich die Chachefiles des Verzeichnisses aufliste und nacheinander dann ImportCacheFile auslöse.

Edit:
Zitat von: DS_Starter am 09 Januar 2024, 00:02:33Das bedeutet allerdings im Vorfeld eine Analyse wieso die Cachefiles entstanden sind.
Die Cachefiles entstehen bei mir, da aus noch ungeklärten Gründen der Server (Ubuntu) mit der Datenbank runter fährt bzw. crashed.

GunterB

Zur Lösung meines Problems habe ich ein Interface für den TelegramBot gebaut.

Das Interface listet den Verzeichnisinhalt auf, bietet Befehle für den Import und unterstützt Gruppenchats.

defmod TelegramMessage06_dblog notify myTelegramBot.msgText:.*(?i)\/?(dblog).*(@\w+)?$ {\
##/\
##------------- dev\
my $devDbLog = "logdb";;\
\
##------------- msg\
my $message = "#$SELF\n";;\
my $msgChatId = ReadingsVal("myTelegramBot","msgChatId",0);;\
my $msgPeer = ReadingsVal("myTelegramBot","msgPeer",0);;\
my $msgText= ReadingsVal($NAME,"msgText",0);;\
\
##------------- botname\
my $me = InternalVal($NAME, "me", "");; ## e.g. 123456789123456789:Botname:@BotBenutzername\
$me =~ /^\d+:\w+:(@\w+)/;;  ## Botname\
my $botname = $1;;\
$msgText =~ /(@\w+)$/i;;\
\
my $inclBotname = $1 ne "";;\
if ($inclBotname) {\
    if ($1 ne $botname) {return;;}\
    ($msgText  =~ s/$botname//);; ## Botnamen entfernen\
}\
\
$msgText =~ s/\///g;;  ## Slash entfernen\
$msgText =~ s/dblog(_)?//i;;  ## dblog_ entfernen\
if (length($msgText) > 0) {\
    $message .= "got Import $msgText\n";;\
    my $DbLog_state = ReadingsVal($devDbLog, "state", "");;\
    if ( $DbLog_state eq "connected" ) {\
        my ($YYYY, $MM, $DD, $hh, $mm, $ss) = ($msgText =~ m/(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})/);;\
        $message .= "starting import of cache file on device $devDbLog\n";;\
        fhem("set $devDbLog importCachefile cache_logdb_${YYYY}-${MM}-${DD}_${hh}-${mm}-${ss}");;\
    } else {\
        $message .= "$devDbLog not connected: $DbLog_state\n";;\
    }\
}\
 \
##------------- msg\
$message .= "\n";;\
my $verzeichnis = "/opt/fhem/log/";;\
my $befehl = "ls ${verzeichnis}cache_logdb* &";;\
my $result = `$befehl`;;\
\
$result =~ s/$verzeichnis//g;;  ## Verzeichnis entfernen\
\
my @y = split /\n/, $result;;\
my $sent = 0;;\
@y= grep { $_ ne '' } @y;;\
if (@y+0 > 0) {\
    $message .= @y+0 . " files:\n";;\
    foreach(@y) {\
        my ($YYYY, $MM, $DD, $hh, $mm, $ss) = ($_ =~ m/(\d+)-(\d+)-(\d+)_(\d+)-(\d+)-(\d+)/);;\
        $message .= "/dblog_$YYYY$MM${DD}_$hh$mm$ss\n";;\
    }\
} else{\
    $message .= "no cached files available\n";;\
}\
\
$message .= "\n";;\
$message .= "/dblog\n";;\
\
fhem("set myTelegramBot _msg \@$msgChatId $message");;\
}


GunterB

Anbei hat mich noch eine Meldung vom User anfichtn erreicht, dessen AT ich nicht vorenthalten möchte:

Zitat von: anfichtnIch hab deine paar Zeilen sehr dankend aufgegrifen.. aber da ich nicht die Zeit und die Lust habe, mich ständig manuell damit zu befassen, ist es bei mir ein kleines AT geworden...
Bei der Gelegenheit hab ich noch ein paar Kleinigkeiten aufgeräumt, u.a. fix definierte Namen...

define AT_dblog_autoimport at +*00:05:00 {\
##------------- dev\
my $devDbLog = "mydblog";;\
my $TelegramBot ="nervzwerg";;\
my $verzeichnis = "/opt/fhem/log/";;\
my $message ="";;\
my $importfile = "";;\
\
##------------- find file\
\
my $befehl = "ls ${verzeichnis}cache_".$devDbLog."* &";;\
my $result = `$befehl`;;\
\
$result =~ s/$verzeichnis//g;;  ## Verzeichnis entfernen\
\
my @y = split /\n/, $result;;\
my $sent = 0;;\
@y= grep { $_ ne '' } @y;;\
if (@y+0 > 0) {\
        for (@y){ \
        $message .= "Cached File found:  \n";;\
        my ($YYYY, $MM, $DD, $hh, $mm, $ss) = ($_ =~ m/(\d+)-(\d+)-(\d+)_(\d+)-(\d+)-(\d+)/);;\
        $message .= "cache_${devDbLog}_$YYYY$MM${DD}_$hh$mm$ss \n";;\
        $importfile = "cache_${devDbLog}_${YYYY}-${MM}-${DD}_$hh-$mm-$ss";;\
        ## $message .= " found.\n";;\
\
##------------- Import\
\
        my $DbLog_state = ReadingsVal($devDbLog, "state", "");;\
        if ( $DbLog_state eq "connected" ) {\
             $message .= "Importing...\n";;\
            fhem("set $devDbLog importCachefile $importfile");;\
        } else {\
            $message .= "$devDbLog not ready: $DbLog_state\n";;\
        }\
\
        $message .= "\n";;\
\
        fhem("set $TelegramBot _msg $message");;\
        last;;\
        }\
}
}

[/code ]


DS_Starter

Kurze Anmerkung zu einem automatischen Import.
In einem normalen produktiven Betrieb sollte DbLog so eingestellt sein, dass keine Cachefiles erzeugt werden (müssen). In Ausnahmesituationen, wie Db-Fehler, DB Absturz oder anderen Defekten werden die Dateien erzeugt um Datenverlust du vermeiden indem man sie später importieren kann.
Das bedeutet allerdings im Vorfeld eine Analyse wieso die Cachefiles entstanden sind.

Einen "blinden" automatischen Import per at ohne vorherige Analyse halte ich deswegen persönlich für nicht sinnvoll.
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter