Avatar billede janjacobsen Nybegynder
09. april 2004 - 00:26 Der er 17 kommentarer og
1 løsning

Fra logfil til MySQL-database

Det kan være at der nogen som kan hjælpe med denne her.
Jeg har en logfil, som opsamler data over hvilke virus min antivirusscanner fjerner fra serveren.
Er det muligt at smide de data som ligger i logfilen ind i en MySQL-database, således at man kan lave lidt statistik over det?
Et udsnit af logfilen ser således ud:

>>> Virus 'W32/Netsky-P' found in file /home/ekspert/Maildir/cur/1081099968.V2101I564017.afx.dk:2,S/message.scr
Removal successful
>>> Virus 'W32/Netsky-P' found in file /home/ekspert/Maildir/cur/1081100664.V2101I564013.afx.dk:2,S/Part0003/message.scr
Removal successful
>>> Virus 'W32/Netsky-P' found in file /home/ekspert/Maildir/cur/1081099961.V2101I564016.afx.dk:2,S/msg.txt.pif
Removal successful
>>> Virus 'W32/Netsky-P' found in file /home/ekspert/Maildir/cur/1081144939.V2101I564026.afx.dk:2,S/document.zip/data.rtf.scr
>>> Virus 'W32/Netsky-P' found in file /home/ekspert/Maildir/cur/1081144939.V2101I564026.afx.dk:2,S/document.zip
Removal successful

I tabellen måske:

type = 'W32/Netsky-C'
tid = timestamp
mail_id = 1081424414.V2101I564047
inficeret_fil = myaunt.zip/myaunt.rtf.com
hvor = /home/ekspert/Maildir/cur
status = Removal successful

Er det noget som kan lade sig gøre?
Avatar billede arne_v Ekspert
09. april 2004 - 00:33 #1
Ja selvfølgelig.

Du opretter en tabel i MySQL og laver et lille program som læser
linierne for log filen, splitter dem op i dele og laver en INSERT
af data.
Avatar billede janjacobsen Nybegynder
09. april 2004 - 00:39 #2
Jep, den er jeg med på.
Tabellen er ikke noget problem.
Insert er heller ikke noget problem - tror jeg.
Men det med at splitte op - pyha
Jeg går ud fra at jeg skal lave noget i stil med den artikel du har lavet...
Avatar billede arne_v Ekspert
09. april 2004 - 00:40 #3
INSERT til MySQL fra C/C++ har jeg skrevet lidt om.

parsningen tror jeg bare skal laves med noget god gammeldags fedtekode
med strstr, strchr og lidt pointer fræs.
Avatar billede arne_v Ekspert
09. april 2004 - 00:42 #4
Jeg kan godt prøve at lave lidt kode.
Avatar billede janjacobsen Nybegynder
09. april 2004 - 00:45 #5
Aha, det kommer til at tage monster lang tid. Det er første gang jeg prøver noget kode af den slags.
Kan jeg bruge notepad til det her eller skal jeg bruge DEV-C++ .
Avatar billede janjacobsen Nybegynder
09. april 2004 - 00:46 #6
Oki, jeg laver lige tabellen.
Avatar billede arne_v Ekspert
09. april 2004 - 00:49 #7
notepad er OK men dev-cpp er nok bedre
Avatar billede janjacobsen Nybegynder
09. april 2004 - 00:56 #8
Tabel:

DB = virus

CREATE TABLE `vir` (
  `id` tinyint(4) NOT NULL auto_increment,
  `type` tinytext,
  `tid` timestamp(14) NOT NULL,
  `mail_id` tinytext,
  `inficeret_fil` mediumtext,
  `hvor` mediumtext,
  `status` tinytext,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

Jeg vil smide en kommando ind i et cronjob som bare kører filen en gang imellem.
Kan man læse et eller andet sted om C?
Avatar billede arne_v Ekspert
09. april 2004 - 00:58 #9
Er du helt blank i C ?

Men vent lige og se mit eksempel.
Avatar billede janjacobsen Nybegynder
09. april 2004 - 00:59 #10
Tror du at man kan smide loggen direkte ind i tabellen, hen ledt fra http://www.eksperten.dk/spm/485706 ?
Altså en kommando som kører fil samtidig med scanning?
Avatar billede arne_v Ekspert
09. april 2004 - 01:01 #11
Kun hvis sweep understøtter det
Avatar billede janjacobsen Nybegynder
09. april 2004 - 01:04 #12
Ok, nej. Dvs. at det er den bedste måde at få data ind i en tabel.
Avatar billede arne_v Ekspert
09. april 2004 - 01:09 #13
Kode:

#include <stdio.h>
#include <string.h>

int main()
{
  FILE *fp;
  char line[1000],*p1,*p2;
  char type[100],id[100],fil[100],loc[100],status[100];
  fp=fopen("vir.log","r");
  while(fgets(line,sizeof(line),fp))
  {
      p1 = strchr(line,'\'');
      p1++;
      p2 = strchr(p1,'\'');
      strncpy(type,p1,p2-p1);
      type[p2-p1] = '\0';
      p1 = strchr(p2+1,'/');
      p2 = strchr(p1+1,'.');
      while(*p2 != '/') p2--;
      strncpy(loc,p1,p2-p1);
      loc[p2-p1] = '\0';
      p1 = p2 + 1;
      p2 = strchr(p1,'.');
      p2 = strchr(p2+1,'.');
      strncpy(id,p1,p2-p1);
      id[p2-p1] = '\0';
      p1 = strchr(p2+1,'/');
      p2 = strchr(p1+1,' ');
      strncpy(fil,p1,p2-p1);
      fil[p2-p1] = '\0';
      p1 = p2 + 1;
      p2 = strchr(p1,'\n');
      strncpy(status,p1,p2-p1);
      status[p2-p1] = '\0';
      printf("type=%s\n",type);
      printf("id=%s\n",id);
      printf("fil=%s\n",fil);
      printf("loc=%s\n",loc);
      printf("status=%s\n",status);
  }
  fclose(fp);
  return 0;
}
Avatar billede arne_v Ekspert
09. april 2004 - 01:09 #14
Output med test data:

type=W32/Netsky-P
id=1081099968.V2101I564017
fil=/message.scr
loc=/home/ekspert/Maildir/cur
status=Removal successful
type=W32/Netsky-P
id=1081100664.V2101I564013
fil=/Part0003/message.scr
loc=/home/ekspert/Maildir/cur
status=Removal successful
type=W32/Netsky-P
id=1081099961.V2101I564016
fil=/msg.txt.pif
loc=/home/ekspert/Maildir/cur
status=Removal successful
Avatar billede janjacobsen Nybegynder
09. april 2004 - 01:15 #15
wow, dvs at det rent faktisk virker???
Skal den ligge i samme bibliotek som loggen?
tak tak - læg et svar!
Avatar billede arne_v Ekspert
09. april 2004 - 01:16 #16
Her en variant som også forsøger at kalde MySQL (den er ikke testet !):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "mysql.h"

int main()
{
  MYSQL *handle;
  char sqlcmd[200];
  FILE *fp;
  char line[1000],*p1,*p2;
  char type[100],id[100],fil[100],loc[100],status[100];
  handle = mysql_init(NULL);
  mysql_real_connect(handle, "localhost", "root", "", "Test", 0, NULL, 0);
  fp=fopen("vir.log","r");
  while(fgets(line,sizeof(line),fp))
  {
      p1 = strchr(line,'\'');
      p1++;
      p2 = strchr(p1,'\'');
      strncpy(type,p1,p2-p1);
      type[p2-p1] = '\0';
      p1 = strchr(p2+1,'/');
      p2 = strchr(p1+1,'.');
      while(*p2 != '/') p2--;
      strncpy(loc,p1,p2-p1);
      loc[p2-p1] = '\0';
      p1 = p2 + 1;
      p2 = strchr(p1,'.');
      p2 = strchr(p2+1,'.');
      strncpy(id,p1,p2-p1);
      id[p2-p1] = '\0';
      p1 = strchr(p2+1,'/');
      p2 = strchr(p1+1,' ');
      strncpy(fil,p1,p2-p1);
      fil[p2-p1] = '\0';
      p1 = p2 + 1;
      p2 = strchr(p1,'\n');
      strncpy(status,p1,p2-p1);
      status[p2-p1] = '\0';
      sprintf(sqlcmd, "INSERT INTO vir (type,mail_id,inficeret_fil,hvor,status) VALUES ('%s','%s','%s','%s','%s')",type,id,fil,loc,status);
      mysql_query(handle, sqlcmd);
      printf("type=%s\n",type);
      printf("id=%s\n",id);
      printf("fil=%s\n",fil);
      printf("loc=%s\n",loc);
      printf("status=%s\n",status);
  }
  fclose(fp);
  mysql_close(handle);
  return 0;
}
Avatar billede arne_v Ekspert
09. april 2004 - 01:16 #17
svar
Avatar billede janjacobsen Nybegynder
09. april 2004 - 01:19 #18
Jeg vil bruge dagen på at lære lidt i morgen - godnat og mange tak!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester