Schrift
[thread]9081[/thread]

wtmp Log-Washer Script: Klitzekleine Hilfe plz? :)

Leser: 1


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
FlorianL
 2007-06-11 16:26
#77446 #77446
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Hallo mal wieder ;)

Diesmal will ich per perlscript "zu alte" einträge aus dem wtmp log löschen, dazu nutze ich unter aix das tool fwtmp um in eine ascii datei zu konvertieren, der output sieht dann z.B so aus:

Quote
root     pts/0          pts/0         7 544768 0000 0000 1181308626 xadmp01.bla-ag.de                Fri Jun  8 15:17:06 MSZ 2007
        pts/0          pts/0         8 544768 0000 0000 1181308692                                  Fri Jun  8 15:18:12 MSZ 2007


Ich hab mir gedacht, ich wandel erstmal den ascii-monats-string um, um dann mit meinem jetzigen datum vergleichen zu können, das funzt zum glück schonmal *g*

Jetzt bin ich wieder bei regex angelangt weil ich split leider nicht nutzen kann (formatierung ist wie man sieht nicht immer gleich)
Oder kann ich vieleicht auch von hinten anfangen zu splitten und nach 6 "treffern" aufhören? Ich hab dazu per google leider nichts passendes gefunden...

Ansonsten, kann mir jemand vieleicht nen kleinen regex basteln der mir den "date" string ausgibt? Das Datum verändert sich ja (logischerweise) viel zu stark als das ich noob ein passendes schneidern könnte ;)

so siehts im moment aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/perl

use strict;
use warnings;

my $maxage = '4';               # Maximales alter der Eintraege in Wochen

sub bin2ascii {
       system("/usr/lib/acct/fwtmp < ./wtmp_testfile > /tmp/wtmp.ascii");
}

sub ascii2bin {
       system("/usr/lib/acct/fwtmp -ci < /tmp/wtmp.ascii > ./wtmp_testfile");
}

sub mapmonth {
       my %mnr=('Jan', 1, 'Feb', 2, 'Mar', 3, 'Apr', 4, 'Mai', 5, 'Jun', 6, 'Jul', 7, 'Aug', 8, 'Sep', 9, 'Oct', 10, 'Nov', 11, 'Dec', 12);
       my $monat=$mnr{$_[0]};
       return($monat);
}

sub ripdates {
       my $date = `date`;
       my @date_now = split(/ /,$date);
       my $currentmonth = $date_now[1];
       my $mappedmonth = mapmonth($currentmonth);
#       print $mappedmonth;             # Test ob die funktion mapmonth funzt
       open(WTMP_ASCII,"/tmp/wtmp.ascii");
       chomp(my @wtmp = <WTMP_ASCII>);
       close(WTMP_ASCII);
       foreach (@wtmp) {
               my @wtmplines =~ ######## ?????? #######
               print "$_\n";
       }
}

print("Loesche wtmp Eintraege der letzten 4 Wochen...\n");
bin2ascii();
ripdates();
#ascii2bin();
renee
 2007-06-11 16:40
#77447 #77447
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl

use strict;
use warnings;

my $re = qr/((?:\w{3}\s+){2}\d+\s+(?:\d+:){2}\d\d\s+[A-Z]{3}\s+\d{4})$/;


if( 'irgendwas anderes, ein ganz langer Text Fri Jun  8 15:18:12 MSZ 2007' =~ $re ){
    print $1,"\n";
}


Edit: emoticons abgeschaltet\n\n

<!--EDIT|renee|1181566430-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
FlorianL
 2007-06-11 17:21
#77448 #77448
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
respekt!

wirklich... also wenn ich mal hören sollte das ein perlcoder gebraucht wird werd ich an dich denken :)
Auf deiner Seite habe ich ein paar aufgaben gesehn die für mich (denke ich gerad ma ohne die lösungen betrachtet zu haben) lösbar scheinen... Hast du irgendwo noch mehr in der Art rumfliegen?

Ich hab leider niemand im bekanntenkreis der sich mit perl ausseinandersetzt, darum ist das lernen relativ einseitig und bei jedem blöden problem wo ich häng muss ich irgendwelche perlboards zu rate ziehn. (Wobei dieses hier in meiner wertung ganz oben steht, bei den anderen gabs meist garkeine oder nur unzulängliche antworten)

Ansonsten... Mach ich heut nich mehr alzuviel, irgendwie hab ich nurnoch weisses rauschen im hirn und weiss nich wie ich die einzelnen zeilen durchgeh, den regex anwende und das datum extrahiere, dann überprüfe ob das "ge-reg-exte" (sic) zu alt ist, und dann wieder ins file schreib...

aber das macht heut auch nix mehr, is bald feierabend ^^

Schönen Tag noch!
renee
 2007-06-11 17:29
#77449 #77449
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=FlorianL,11.06.2007, 15:21]respekt!

wirklich... also wenn ich mal hören sollte das ein perlcoder gebraucht wird werd ich an dich denken :)
Auf deiner Seite habe ich ein paar aufgaben gesehn die für mich (denke ich gerad ma ohne die lösungen betrachtet zu haben) lösbar scheinen... Hast du irgendwo noch mehr in der Art rumfliegen?

[/quote]

Momentan habe ich keine in der Schublade, die nächsten drei Wochen wird das auch nichts mehr, aber danach vielleicht...

Quote

Ich hab leider niemand im bekanntenkreis der sich mit perl ausseinandersetzt, darum ist das lernen relativ einseitig und bei jedem blöden problem wo ich häng muss ich irgendwelche perlboards zu rate ziehn. (Wobei dieses hier in meiner wertung ganz oben steht, bei den anderen gabs meist garkeine oder nur unzulängliche antworten)


Fragen ist vollkommen legitim, von so etwas lebt ja auch ein Forum wie dieses.

Quote
Ansonsten... Mach ich heut nich mehr alzuviel, irgendwie hab ich nurnoch weisses rauschen im hirn und weiss nich wie ich die einzelnen zeilen durchgeh, den regex anwende und das datum extrahiere, dann überprüfe ob das "ge-reg-exte" (sic) zu alt ist, und dann wieder ins file schreib...

aber das macht heut auch nix mehr, is bald feierabend ^^

Schönen Tag noch!

Wie kann man eine Datei durchlaufen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl

use strict;
use warnings;

# die Datei, die durchsucht werden soll
my $file = 'file.txt';

# oeffne die Datei
# < ist lesend, > ist schreibend, >> ist anhaengend
# 'or die $!' gibt eine Fehlermeldung aus wenn die Datei nicht
# geoeffnet werden kann (fehlende Rechte, Datei nicht da, etc)
open my $fh, '<', $file or die $!;

# so lange Zeilen ausgelesen werden
while( my $line = <$fh> ){
    # gib Zeilennummer und Zeile aus
    print $. . $line;
}

# schliesse Datei
close $fh;


Auf die Zeilen musst Du dann die Regex anwenden. Was "zu alt" ist, musst Du selbst definieren...

Spiel einfach mal etwas rum, bei Fragen weisst Du ja, wo Du posten kannst...\n\n

<!--EDIT|renee|1181568596-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
FlorianL
 2007-06-12 10:53
#77450 #77450
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Morgen zusammen ;)

Ach natürlich mit while, wie auch sonst :P
Hatte gestern nur matsch im kopf, war einfach zu schwül hier ^^

Also ich habs jetzt soweit das ich zumindest schonmal die rausschmeissen kann die nicht im selben monat sind.. Zwar toll und schon ein schritt nach vorne, aber ich will ja alle einträge löschen die älter sind als einen monat, bei meinem script bekomm ich beim monatswechsel probleme :/

Ich hab gerad ma nach nem cpan kalender modul geschaut, aber bevor ichs testen konnte stellte ich schon fest das ich auf dem system keinerlei module installieren kann, bzw darf.

script:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/perl
#
# AIX wtmp Cleaner
#
###################
use strict;
use warnings;

my $tmpfile = '/tmp/wtmp.ascii';
my $regex = qr/((?:\w{3}\s+){2}\d+\s+(?:\d+:){2}\d\d\s+[A-Z]{3}\s+\d{4})$/;
my $date = `date`;
my @cdate = split(/ /, $date);
my $cmonth = mapmonth($cdate[1]);

sub bin2ascii {
system("/usr/lib/acct/fwtmp < ./wtmp_testfile > /tmp/wtmp.ascii");
}
sub ascii2bin {
system("/usr/lib/acct/fwtmp -ci < /tmp/wtmp.ascii > ./wtmp_testfile");
}
sub mapmonth {
my %mnr=('Jan', 1, 'Feb', 2, 'Mar', 3, 'Apr', 4, 'Mai', 5, 'Jun', 6, 'Jul', 7, 'Aug', 8, 'Sep', 9, 'Oct', 10, 'Nov', 11, 'Dec', 12);
my $monat=$mnr{$_[0]};
return($monat);
}

sub ripdates {
my $date = `date`;
my @date_now = split(/ /,$date);
my $currentmonth = $date_now[1];
my $mappedmonth = mapmonth($currentmonth);
open my $fh, '<', $tmpfile or die $!;
unlink "wtmpfile.new";
while(my $line = <$fh>) {
foreach ($line) {
my @regexped = ($line =~ $regex);
my @datestring = split(/ /,$regexped[0]);
my $daynr = $datestring[0];
my $monthnr = mapmonth($datestring[1]);
if ($monthnr eq $cmonth) {
open(NEWWTMP,">>wtmpfile.new");
print NEWWTMP $_;
print ("Month: $cmonth -> $line\n");
}
}
}
close $fh;
close (NEWWTMP);
}

print("Loesche wtmp Eintraege der letzten 4 Wochen...\n");
bin2ascii();
ripdates();
#ascii2bin();
#unlink $tmpfile;
#unlink wtmpfile.new;
FlorianL
 2007-06-12 11:05
#77451 #77451
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Also ich hab gerad mal rückspracheg ehalten und es reicht wohl aus wenn wir auf monate beschränken, 48 tage sind da mumpitz, ich nehm jetz einfach alles raus was vor dem vor-monat liegt.

also quasi $currentmonth = 6 und alles von 1-4 und 7-12 wird gelöscht... klingt für mich jetz gerad nich so schwer, ich probiers ma :)
FlorianL
 2007-06-12 11:46
#77452 #77452
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my $date = `date`;
my @cdate = split(/ /, $date);
my $cmonth = mapmonth($cdate[1]);
my $delstart = ($cmonth - 2);
my $delstop = ($cmonth + 1);
my @range = ($delstop .. $delstart);

[...]

if ($monthnr != @range)  {
open(NEWWTMP,">>$newwtmp");
print NEWWTMP $_;
}


Ich bekomme keine fehlermeldung aber es funzt auch nicht (hab ich mir fast gedacht aber ich wusste nich wie ichs "mal eben" zustandebring, und perldoc -q compute.*difference bringt mich gerad auch nich weiter :(

renee, wann stehste auf? *ggg*


edit:

Code: (dl )
1
2
3
4
my $okaymonth1 = ($cmonth - 2);
my $okaymonth2 = ($cmonth - 1);

if (($monthnr eq $cmonth) or ($monthnr eq $okaymonth1) or ($monthnr eq $okaymonth2))



geht zwar, is aber irgendwie hässlig, wie gehts besser?

edit2:

mir fällt gerad auf das ich dann im januar/februar probleme bekommen werde...

hmmm

edit3 (hoffentlich wars das dann *g*):

Code: (dl )
1
2
3
4
5
6
if ($okaymonth1 == '-1') {
       $okaymonth1 = '12';
}
if ($okaymonth2 == '-2') {
       $okaymonth2 = '11';
}

lösung okay oder wie sollte ich das problem besser umgehn?

---
Modedit Gwendragon: +CODE
---\n\n

<!--EDIT|GwenDragon|1181643556-->
renee
 2007-06-12 12:13
#77453 #77453
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
if ( !grep{ $_ == $monthnr }@range )  {
open(NEWWTMP,">>$newwtmp");
print NEWWTMP $_;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2007-06-12 12:21
#77454 #77454
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
besser:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my @range;
if( $cmonth > 2 ){
    @range = ($cmonth-2 .. $cmonth);
}
else{
    my $start = 10 + $cmonth;
    my $mid   = $start == 11 ? 12 : 1;
    @range = ($start,$mid,$cmonth);
}

if( grep{ $_ == $monthnr }@range ){
    print "...";
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
FlorianL
 2007-06-12 16:56
#77455 #77455
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
ich danke dir mal wieder, $danke ++ quasi ^^

also.. ich hab das script eben fröhlich durchgetestet und es ging... kaum schick ichs weiter an nen kollegen, taucht ein fehler auf :p

komischerweise... auf dem selben system mit den selben daten und alles das selbe, so unverständlich!

Error: A file descriptor does not refer to an open file. at wtmpclean.pl line 24.

24:

sub ascii2bin {
system("$fwtmpcmd -ci < $tmpfile > $wtmpfile") || die "Error: $!";
}


das hat aber gefunzt!!! ich bin ratlos... und die meldung bringt mir bei google satte 2 seiten mit 80% müll und 20% deadlinks :(
sonst hab nix groß geändert, quellcode von oben + deine änderungen halt...
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2007-06-11 16:26.