February 2008 - Posts

 

Mi sistemaši često moramo da radimo dosadne poslove tipa backupa ili slično. Spas je, naravno, u automatizaciji takvih poslova putem skriptova.

U ovom postu ću dati jedan perl skript koji sam svojevremeno napravio u bivšoj firmi i koji mi je štedeo bar 1 sat najdosadnijeg posla dnevno - pravljenja izveštaja.

 

Šta ovaj skript radi?

Otvara Outlook, traži mejl sa određenim subjectom, ekstraktuje dva attacha na disk, obrađuje podatke iz njih, otvara Excel, pravi tabele i popunjava ih, a zatim otvara Word i u pripremljen template, upisuje podatke iz Excela  direktno u bookmarkove.

Na ovaj način, bez ikakvog napora kreira se potpuno gotov izveštaj, koji nakon provere, može da se arhivira, šalje, ili štagod drugo.

Kao što možete da primetite, lenjost je (bar u mom slučaju ) najbolji motiv da bi se sistemaš bavio programiranjem.

 

Zašto Perl, a ne neki drugi skript jezik?

Zato što ne znam ni jedan drugi skript jezik.

Istina ukoliko se pozabavite kodom koji sam postovao, videćete da ne znam ni Perl :)))

 

Zašto sad postuješ ovo?

Zato što trenutno radim nešto slično za Nessus, Nmap i MBSA, da bih mogao da radim korelaciju i analizu logova iz SQL baze. Ako uspem, možda postujem i taj skript.

 

Uvod

S obzirom na to da jedan admin održava više sistema, manuelni pregled logova je veoma, veoma nepoželjan metod za proveru zdravlja naših servera, pa prema tome, ukoliko nemate neki metod za „obaveštavanje", tipa SMS, a uglavnom ga nemate jer održavate servere različitim kompanijama, onda nije loše da parsirate svakodnevno (ili više puta na dan), logove i da ih šaljete sebi na mejl. Kriptovanje mejlova se podrazumeva.

Ukratko, ja sam koristio eventquery.vbs za parsiranje logova, koji je kao rezultat kreirao dva attachmenta koji su u nazivu imali datum(bar za ovaj primer iz posta). Attachmenti su dalje kriptovani gpg-om (http://gnupg.org/), a sam mejl je slat pomoću malog, ali fenomenalnog mail klijenta koji se zove Blat (http://dbkgroup.org/softw/blat.html ). Perl je, naravno, Active Perl. Besplatan je, a može da se preuzme sa adrese http://www.activestate.com/ .

 

Napomena:

Ovaj skript nije generički i moraćete da se dooobro pozabavite njegovom kastomizacijom da bi vam bio od koristi. U svakom slučaju, bar na jednom mestu imate sve što vam treba za ovakvu automatizaciju.

Ukoliko napravite haos na svom računaru, izbrišete podatke ili nešto slično, to je vaša odgovornost, ne moja ;)

 


 

Skript:

 

use strict;

#use warnings;

sleep(3); # s obzirom da se skript pokrece pri logovanju, treba dati masini malo vremena da udahne

 

 

 

######### pravimo kalendar za juce #########

my @danas=localtime();

my @juce=localtime(time-86400);

my $dan_juce=$juce[3];

my $mesec_juce=($juce[4]+1);

my $godina_juce=($juce[5]+1900);

my $godina_juce2=($juce[5]-100); #Ovo cemo koristiti kao format...

$godina_juce2="0".$godina_juce2; #... za poredjenje sa vremenom u emajlu

if ($dan_juce<=9){

$dan_juce="0".($juce[3]);

}

if ($mesec_juce<=9){

$mesec_juce="0".($juce[4]+1);

}

my $mail_juce="$godina_juce2."."$mesec_juce.".$dan_juce;

my $datum_juce="$dan_juce."."$mesec_juce.".$godina_juce;

 

 

 

 

 

################## Mozemo uneti datum, a i ne moramo ##################

my $input = $ARGV[0];

chomp $input;

if ($input eq ""){

$input=$mail_juce;

}

 

 

 

 

 

##################### Setujemo neke varijable ######################

my $txt="ovde ide subject maila";

my $att1="$input.evnt";

my $att2=$input."ovde ide dodatak na datum";

my $path_izvestaj="ovde ide neki path";

my $path_temp="ovde ide neki path";

my $path_scripts="ovde ide neki path";

 

 

 

 

 

 

################# Jel danas vec radjen izvestaj? ##################

if (-e "$path_izvestaj$input.doc"){

print STDERR "\n\a\Izvestaj je vec obradjen!!!\n";

die;

}

 

 

 

######### vadimo dodatke iz mejlova #########

use Win32::OLE::Variant;

use Win32::OLE;

use Win32::OLE::Const 'Microsoft Outlook';

my $outl = Win32::OLE->new('Outlook.Application') or die "\nOutlook? Never heard of it...\n";

my $namespace = $outl->GetNamespace("MAPI");

$namespace->Logon("ovde ide domen na koji se outlook loguje, npr MOJAFIRMA", ,"false", "false");

my $folder = $namespace->GetDefaultFolder(olFolderInbox);

my $ukupno=$folder->items->count;

 

while ($ukupno>=1){ #ovo nema veze posto petlju prekidamo sa 'last' cim nadje ono sto trazimo

my @datum_juce=split / /,($folder->items->item($ukupno)->ReceivedTime);

my $dt=$datum_juce[0];

 

my $subj=$folder->items->item($ukupno)->Subject;

my $mejl=$folder->items->item($ukupno);

if (($subj eq $txt) & ($dt eq $input)) {

$mejl->attachments->item(1)->Saveasfile("$path_temp$att1");

$mejl->attachments->item(2)->Saveasfile("$path_temp$att2");

last;

}

$ukupno--;

}

 

 

 

######### obradjujemo dodatke iz mejlova #########

my @out;

open ("fh","$path_temp$att1") || die "\n\aNe mogu da otvorim fajl $att1\n";

while (<fh>){

if ($_=~/^"warning/i || $_=~/^"error/i) {

s/"/ /g;

push @out,$_;

}

}

 

 

 

 

 

 

######### Otvaramo Excel i pisemo... #########

 

my $excel = Win32::OLE->new('Excel.Application') or die "\nExcel? Never heard of it...\n";

$excel->{'Visible'} = 0;

my $workbook = $excel -> Workbooks -> Add;

$workbook -> ActiveSheet -> Range('A1')->{'Value'} = "Event";

$workbook -> ActiveSheet -> Range('B1')->{'Value'} = "Type";

$workbook -> ActiveSheet -> Range('C1')->{'Value'} = "DateTime";

$workbook -> ActiveSheet -> Range('D1')->{'Value'} = "Source";

$workbook -> ActiveSheet -> Range('E1')->{'Value'} = "Category";

$workbook -> ActiveSheet -> Range('F1')->{'Value'} = "User";

 

 

 

######### Formatiramo zaglavlje #########

$workbook -> ActiveSheet->Range('A1:F1')->Borders->{Weight} = "xlThick";

$workbook -> ActiveSheet->Range('A1:F1')->Borders->{LineStyle} = "xlDouble";

$workbook -> ActiveSheet->Range('A1:F1')->Borders->{ColorIndex} = 1;

 

 

 

######### Upucavamo podatke u excel #########

my $row=2;

my @tmp;

foreach (@out){

@tmp = split / , /,$_;

 

$workbook -> ActiveSheet -> Range('A'.$row)->{'Value'} = $tmp[1];

$workbook -> ActiveSheet -> Range('B'.$row)->{'Value'} = $tmp[0];

$workbook -> ActiveSheet -> Range('C'.$row)->{'Value'} = $tmp[2];

$workbook -> ActiveSheet -> Range('D'.$row)->{'Value'} = $tmp[3];

$workbook -> ActiveSheet -> Range('E'.$row)->{'Value'} = $tmp[5];

$workbook -> ActiveSheet -> Range('F'.$row)->{'Value'} = $tmpDevil;

$row++;

}

 

$workbook -> Activesheet->Range('A:F')->Columns->AutoFit();

$workbook -> SaveAs ("$path_temp$input.evnt.xls") or die $!;

$excel -> Quit;

 

my @csv_out;

open ("fh1","$path_temp$att2") || die "\n\aNe mogu da otvorim fajl $att2\n";

while (<fh1>){

s/"/ /g;

push @csv_out,$_;

}

 

 

######### Otvaramo Excel i pisemo... #########

$excel->{'Visible'} = 1;

$workbook = $excel -> Workbooks -> Add;

 

my $row_csv=1;

my @csv_tmp;

foreach (@csv_out){

@csv_tmp = split / , /,$_;

 

$workbook -> ActiveSheet -> Range('A'.$row_csv)->{'Value'} = $csv_tmp[1];

$workbook -> ActiveSheet -> Range('B'.$row_csv)->{'Value'} = $csv_tmp[9];

$workbook -> ActiveSheet -> Range('C'.$row_csv)->{'Value'} = $csv_tmp[18];

$workbook -> ActiveSheet -> Range('D'.$row_csv)->{'Value'} = $csv_tmp[33];

$row_csv++;

  }

 

 

######### Formatiramo zaglavlje #########

$workbook -> ActiveSheet->Range('A1:D1')->Borders->{Weight} = "xlThick";

$workbook -> ActiveSheet->Range('A1:D1')->Borders->{LineStyle} = "xlDouble";

$workbook -> ActiveSheet->Range('A1:D1')->Borders->{ColorIndex} = 1;

$workbook -> Activesheet->Range('A:D')->Columns->AutoFit();

 

$workbook -> SaveAs ("$path_temp$input.AV.xls") or die $!;

$excel -> Quit;

 

 

 

######################## W O R D ########################

my $template ="tmp.doc";

my $word = CreateObject Win32::OLE 'Word.Application' or die $!;

$word->{'Visible'} = 0;

my $document = $word->Documents->Open({

FileName => "$path_scripts$template",

});

my $selection=$word->selection;

 

my $dtbook=$word->Activedocument->Bookmarks->Item("DATUM")->select;

$selection->typetext({text=>"$input"});

 

my $avbook=$word->Activedocument->Bookmarks->Item("AV")->select;

$selection->InlineShapes -> AddOLEObject({

ClassType=>"Excel.Sheet.8",

Filename => "$path_temp$input.AV.xls",

linkToFile => "False",

DisplayAsIcon => "False",

});

my $eventbook=$word->Activedocument->Bookmarks->Item("EVENT")->select;

$selection->InlineShapes -> AddOLEObject({

ClassType=>"Excel.Sheet.8",

Filename => "$path_temp$input.evnt.xls",

linkToFile => "False",

DisplayAsIcon => "False",

});

 

 

$document -> SaveAs ("$path_izvestaj$input.doc");;

$word->quit;

 

 

 

 

 

 

 

 

 

 

 

 

Pre nekoliko dana, vratim se sa posla i vidim da je moja supruga otkrila nov način primene korišćene IT literature. Corpus delicti:

 

pix i oblande

 

 

 

 

Nakon serije raznoraznih ranjivosti otkrivenih u servisima kompanije google, evo i najnovijeg hita: gmail ne kriptuje session ID ukoliko imate probleme sa konekcijom. Ovaj propust omogućava hakerima sidejacking (http://en.wikipedia.org/wiki/Session_hijacking) sesije wireless korisnika (može i ethernet, ali je taktički komplikovanije izvesti). Ah taj wireless... Originalni članak možete pročitati na adresi: http://www.theregister.co.uk/2008/02/01/google_ssl_sidejacking/

Pozdrav!