Archive

Archive for the ‘Programe’ Category

Multi thread Ping in Free Pascal

Am arătat în articolul precedent cum se poate utiliza WMI pentru testarea disponibilității unui device dintr-o rețea. În articolul curent prezint codul sursă a unei aplicații ce permite lansarea de comenzi ping către diferite IP-uri prin multi thread-uri.

program project1;
{$mode objfpc}{$H+}
uses Classes, SysUtils, CustApp, Windows, ActiveX, ComObj, GetOpts;
Type TPingThread = Class(TThread)
 Computer: String;
 Procedure Execute; Override;
 End;
Const Buffer: Integer= 32;
 Timeout: Integer= 100;
 Retries: Integer= 4;
 MaxThreads: Integer= 30;
Var c: Char;
 OptionIndex: Longint;
 TheOpts: Array[1..5] Of TOption;
 i, ActiveThreads, IpOffline, IpOnLine: Integer;
 IpList: TStringList;
 t: TPingThread;
 Start: Variant;
Function WmiPing(Const Address: String; Const BufferSize, Timeout: Word): Integer;
Const WmiUser = '';
 WmiPassword = '';
 WmiComputer = 'localhost';
 WmiFlagForwardOnly = $00000020;
Var WmiLocator : OLEVariant;
 WmiService : OLEVariant;
 WmiObjectSet: OLEVariant;
 WmiObject : Variant;
 oEnum : ActiveX.IEnumvariant;
 WmiQuery : String[250];
begin
 Result:= -1;
 CoInitialize(Nil);
 Try
 WmiLocator := ComObj.CreateOleObject('WbemScripting.SWbemLocator');
 WmiService := WmiLocator.ConnectServer(WmiComputer, 'root\CIMV2', WmiUser, WmiPassword);
 WmiQuery := Format('Select * From Win32_PingStatus '+
 'Where Address=%s And BufferSize=%d And TimeOut=%d',
 [QuotedStr(Address), BufferSize, Timeout]);
 WmiObjectSet:= WmiService.ExecQuery(WmiQuery, 'WQL', WmiFlagForwardOnly);
 oEnum := IUnknown(WmiObjectSet._NewEnum) As IEnumVariant;
 While oEnum.Next(1, WmiObject, Nil) = 0 Do
 Begin
 Result:= LongInt(WmiObject.Properties_.Item('StatusCode').Value);
 WmiObject:= Unassigned;
 End;
 Finally
 CoUninitialize;
 End;
end;
Procedure TPingThread.Execute;
Var i, k: Integer;
begin
 k:= 0;
 For i:= 1 To Retries Do
 If WmiPing(Computer, Buffer, Timeout)= 0 Then
 Inc(k);
If k= 0 Then
 Inc(IpOffLine)
 Else
 Inc(IpOnLine);
Writeln(Computer, ';', k, ';', Retries);
 Dec(ActiveThreads);
End;
begin
 Start:= GetTickCount;
 IpList:= TStringList.Create;
With TheOpts[1] Do
 Begin
 Name:= 'ipfile';
 Has_Arg:= 1;
 Flag:= Nil;
 Value:= #0;
 End;
 With TheOpts[2] Do
 Begin
 Name:= 'buffer';
 Has_Arg:= 1;
 Flag:= Nil;
 Value:= #0;
 End;
 With TheOpts[3] Do
 Begin
 Name:= 'timeout';
 Has_Arg:= 1;
 Flag:= Nil;
 Value:= #0;
 End;
 With TheOpts[4] Do
 Begin
 Name:= 'retries';
 Has_Arg:= 1;
 Flag:= Nil;
 Value:= #0;
 End;
 With TheOpts[5] Do
 Begin
 Name:= 'maxthreads';
 Has_Arg:= 1;
 Flag:= Nil;
 Value:= #0;
 End;
c:= #0;
 Repeat
 c:= GetLongopts(':i:b:t:r:m:', @TheOpts[1], OptionIndex);
 Case c Of
 'i': If FileExists(OptArg) Then
 Begin
 IpList.LoadFromFile(OptArg);
 If IpList.Count= 0 Then
 Begin
 Writeln('Empty IP File: ', OptArg);
 Exit;
 End;
 End
 Else
 Begin
 Writeln('IP File not found: ', OptArg);
 Exit;
 End;
'b': Begin
 Buffer:= StrToInt(OptArg);
 If (Buffer< 0) Or (Buffer> 65500) Then
 Begin
 Writeln('Ping Buffer ', OptArg, ' out of limit 0..65500');
 Exit;
 End;
 End;
 't': Begin
 Timeout:= StrToInt(OptArg);
 If (Timeout< 10) Or (Timeout> 10000) Then
 Begin
 Writeln('Ping Timeout ', OptArg, ' out of limit 10..10000');
 Exit;
 End;
 End;
 'r': Begin
 Retries:= StrToInt(OptArg);
 If (Retries< 1) Or (Retries> 10) Then
 Begin
 Writeln('Ping Retries ', OptArg, ' out of limit 1..10');
 Exit;
 End;
 End;
 'm': Begin
 MaxThreads:= StrToInt(OptArg);
 If (MaxThreads< 1) Or (MaxThreads> 500) Then
 Begin
 Writeln('Max Threads ', OptArg, ' out of limit 1..500');
 Exit;
 End;
 End;
 End; { case }
 Until c= EndOfOptions;
ActiveThreads:= 0;
 IpOffline:= 0;
 IpOnLine:= 0;
 i:= 0;
 Writeln('Computer;Success;Total');
 While i< IpList.Count Do
 Begin
 If ActiveThreads< MaxThreads Then
 Begin
 t:= TPingThread.Create(True);
 Inc(ActiveThreads);
 Inc(i);
 t.Computer:= IpList[i- 1];
 t.FreeOnTerminate:= True;
 t.Start;
 End;
 End;
While ActiveThreads> 0 Do ;
WriteLn;
 WriteLn('Ip Count= ', IpList.Count);
 WriteLn('Ip Online= ', IpOnLine);
 WriteLn('Ip Offline= ', IpOffline);
 WriteLn('Buffer= ', Buffer);
 WriteLn('Timeout= ', Timeout, ' ms');
 WriteLn('Retries= ', Retries);
 WriteLn('Max Threads= ', MaxThreads);
 WriteLn('Elapsed Time= ', (GetTickCount- Start)/ 1000, 's');
IpList.Free;
end.

Pentru a-l putea folosi descărcați ultima versiune de Lazarus IDE. Eu am compilat programul cu v1.2.0 pe 64 biți. După compilare, din linia de comandă se utilizează astfel:

Pinguin64.exe -i "IP LIST.txt" -b 32 -t 100 -r 4 -m 500 > "IP RESULT.TXT"

unde “IP LIST.txt” este un fișierul care conține lista de IP-uri țintă, iar “IP RESULT.TXT” este fișierul în care vor fi vărsate rezultatele. Parametrii  -b 32 arată faptul că se trimit 32 biți prin ping, -t 100 reprezintă timeout-ul ping-ului în milisecunde, -r 4 reprezintă numărul de încercări succesive efectuate către fiecare IP în parte, iar -m 500 numărul de thread-uri utilizate. Atenție: un număr prea mare de thread-uri se poate să nu poată fi încărcat în memoria computerului dvs!

 

sdfsdfsd

Advertisements
Categories: IT, Programe

WMI Ping in Free Pascal

Ping reprezintă un instrument de rețea ce trimite unui device dintr-o rețea pachete de date, așteptând un răspuns de tip ecou de la acesta.

WMI (Instrumentaţie de Management Windows) este o componentă a sistemului de operare Microsoft Windows şi este implementarea Microsoft WBEM (Web-Based Enterprise Management). WMI poate fi utilizat pentru a automatiza activităţile administrative. WMI se poate utiliza în limbaje de scriptare care au un motor pentru Windows şi care gestionează obiecte ActiveX Microsoft.

Free Pascal este un compilator Pascal pe 32 și 64 biți disponibil pe diverse sisteme de operare. Sintaxa limbajului este compatibilă cu Turbo Pascal și Delphi. Pachetul este disponibil sub o licență GNU modificată.

Am realizat o funcție pentru Free Pascal ce utilizează WMI pentru a testa accesibilitatea unui device din rețea:

Function WmiPing(Const Address: String; Const BufferSize, Timeout: Word): Integer;
 Const WmiUser = '';
 WmiPassword = '';
 WmiComputer = 'localhost';
 WmiFlagForwardOnly = $00000020;
 Var WmiLocator: OLEVariant;
 WmiService : OLEVariant;
 WmiObjectSet : OLEVariant;
 WmiObject : Variant;
 oEnum : ActiveX.IEnumvariant;
 WmiQuery : String[250];
 begin
 Result:= -1;
 CoInitialize(Nil);
 Try
 WmiLocator := ComObj.CreateOleObject('WbemScripting.SWbemLocator');
 WmiService := WmiLocator.ConnectServer(WmiComputer, 'root\CIMV2', WmiUser, WmiPassword);
 WmiQuery := Format('Select * From Win32_PingStatus Where Address=%s And BufferSize=%d And TimeOut=%d', [QuotedStr(Address), BufferSize, Timeout]);
 WmiObjectSet:= WmiService.ExecQuery(WmiQuery, 'WQL', WmiFlagForwardOnly);
 oEnum := IUnknown(WmiObjectSet._NewEnum) As IEnumVariant;
 While oEnum.Next(1, WmiObject, Nil) = 0 Do
 Begin
 Result:= LongInt(WmiObject.Properties_.Item('StatusCode').Value);
 WmiObject:= Unassigned;
 End;
 Finally
 CoUninitialize;
 End;
 end;


Categories: IT, Programe

Double Commander – manager de fisiere open-source, cross-platform, 64bit

Double Commander este un manager de fișiere realizat cu Free Pascal/Lazarus, disponibil atât sub Windows cât și sub Linux, pe 32 și 64 biți. Permite vizualizarea simultană a două liste de dosare/fișiere, totodată putându-se deschide mai multe tab-uri. Deține un editor de texte intern cu evidențierea sintaxei (util programatorilor). Arhive precum ZIP, TAR GZ, TGZ, LZMA, BZ2, RPM, CPIO, DEB, RAR pot fi explorate precum directoarele. Poate afișa dimensiunea directoarelor în direct în lista de directoare; suportă plugin-uri WCX, WDX și WLX precum Total Commander; se poate conecta la conturi FTP etc. Pentru a se instala, atât sub Windows cât și sub Linux, se va accesa link-ul http://doublecmd.sourceforge.net/site/eng/download.html. Eu am accesat link-ul corespunzător distribuției Linux Mint:

01

Se adăugă ppa-ul respectiv prin comanda în terminal: sudo apt-get-repository ppa:alexx2000/doublecmd:

02

Apoi se actualizează lista ppa-urilor prin comanda sudo apt-get update:

03

Sunt disponibile două versiuni gtk și qt. Recomand versiunea GTK pentru distribuțiile de Linux cu Gnome, iar QT pentru cele cu KDE în special:

04

În Linux Mint, se va putea accesa oricând Double Commander din meniul Accesories:

05

Interfața grafică are aspectul următor:

06

Toate facilitățile oferite vă las să le descoperiți…

jEdit – editor texte open-source, cross-platform, 64bit

Încep o nouă serie de recomandări în ceea ce privește aplicațile. De această dată voi selecta pe cât posibil doar aplicații open-source, cross-platform, disponibile atât pentru sisteme de operare pe 32 biți, cât și pe 64. Voi explica modalitatea de instalare a acestora pe sistemele de operare Linux Mint Release 13 (Maya) și Windows 7 Professional, ambele pe 64 biți. Primul din această listă de aplicații este jEdit – un editor de texte destinat programatorilor, scris în Java. Realizarea acestuia a fost începută în anul 1998. Permite evidențierea sintaxei a peste 200 formate de fișiere, dar permite și adăugarea de noi formate. Are disponibile peste 150 de plug-in-uri accesibile direct din aplicație pentru instalare, personalizare și dezinstalare.
Ce mai ușoară modalitate de instalare în Linut Mint este prin Software Manager.

01

După căutarea textului jEdit se va selecta din listă, se va apăsa butonul Install:

02

După autentificarea utilizatorului se va aștepta derularea procesului de instalare:

03

Va putea fi accesat de acum în colo din meniul MenuProgramming:

04

Interfața grafică este destul de intuitivă:

05

Instalarea plug-in-urilor se realizează accesând din meniul aplicației PluginPlugin manager…:

06

Fereastra ce se deschide oferă o listă a plug-in-urilor ce pot fi instalate:

07

Crearea unui stick USB bootabil cu mai multe sisteme de operare

2012/05/06 1 comment

Una dintre aplicațiile ce vă ajută să creați un stick USB multi-boot se numește YUMI (Your Universal Multiboot Installer). Poate fi descărcat de aici. Permite adăugarea, ștergerea și modificarea intrărilor chiar și după redeschiderea aplicației (față de alte alternative care nu permit acest lucru):

01

Există o listă dedicată de distribuții în YUMI. Permite chiar descărcarea de pe internet a fiecărei imagini ISO:

02

YUMI folosește 7zip pentru a decomprima imaginea ISO a distribuției:

03

04

05

Modul de eliminare a unei intrări din lista de distribuții:

01

Categories: IT, Programe Tags: , , , ,

Martisor electronic

2012/03/01 1 comment

Martisor 2012

Vă prezint un mărțișor electronic, o aplicație realizată în Turbo Delphi Explorer pe care o puteți descărca de aici.

Categories: IT, Programe Tags: , ,

Crearea unui browser web propriu in Turbo Delphi Explorer

2010/11/03 11 comments

Turbo Delphi Explorer este un IDE ce permite realizarea de aplicaţii executabile. În articolul de faţă voi descrie modalitatea de creare a unui browser web. Se va accesa meniul File – New – VCL Forms Application – Delphi for Win32:

01

Vom adăuga din Tool Palette un Panel:

02

Vom seta Bottom pentru proprietatea Align iar pentru Caption vom elimina textul implicit Caption1:

03

Apoi vom adăuga cinci butoane de tip BitBtn din paleta Additional:

04

Le vom seta pe rând proprietatea Caption după cum urmează: Back, Forward, Refresh, Stop şi Home:

05

Apoi, din secţiunea Standard a paletei Tool Palette vom adăuga pe Panel1 un ComboBox:

06

Proprietatea Text a acestuia o vom modifica din ComboBox1 în http://www.google.ro:

07

Vom mai adăuga un buton de tip BitBtn cu proprietatea Caption setată Go. Vom selecta primele cinci butoane (ţinând apăsată tasta Shift şi selectându-le cu mouse-ul) şi le vom schimba proprietăţile akLeft=True, akTop=False, akRight=False şi akBottom din secţiunea Anchors din Object Inspector:

08

Apoi pentru ComboBox1 vom regla pentru akTop, akRight şi akBottom opţiunea True şi pentru akLeft=True:

09

Pentru butonul BitBtn6 vom seta False pentru akLeft şi akTop, iar pentru akRight şi akBottom opţiunea True:

10

Vom mai adăuga apoi o componentă de tip TWebBrowser din paleta Internet (Tool Palette):

11

Vom seta pentru acesta din Object Inspector opţiunea alClient pentru proprietatea Align:

12

Din acest moment vom începe scrierea codului sursă propriu zis şi anume:

13

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   WebBrowser1.GoBack;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
   WebBrowser1.GoForward;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
   WebBrowser1.Refresh;
end;
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
   WebBrowser1.Stop;
end;
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
   WebBrowser1.GoHome;
end;
procedure TForm1.BitBtn6Click(Sender: TObject);
begin
   WebBrowser1.Navigate(ComboBox1.Text);
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
   BitBtn6.Enabled:=ComboBox1.Text<>'';
end;
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;  const pDisp: IDispatch; var URL: OleVariant);
begin
   ComboBox1.Text:=URL;
   ComboBox1.Items.Add(ComboBox1.Text);
end;
procedure TForm1.WebBrowser1StatusTextChange(ASender: TObject;  const Text: WideString);
begin
   Form1.Caption:='Personal Web Browser ['+(WebBrowser1.LocationName)+']';
end;
procedure TForm1.WebBrowser1StatusTextChange(ASender: TObject;  const Text: WideString);
begin
   Form1.Caption:='Personal Web Browser ['+(WebBrowser1.LocationName)+']';
end;

14

Vom seta ca la crearea lui Form1 să se execute evenimentul ce se declanşează la apăsarea butonului BitBtn6 şi anume BitBtn6Click:

15

Iar proprietatea Caption a ferestrei Form1 o vom modifica din Form1 în Personal Web Browser:

16

Pentru ca executabilul ce îl vom genera să aibe amprentă proprie, vom merge în meniul Project – Options…:

17

Şi vom alege o pictogramă diferită de cea implicită:

18

Aplicaţia lansată în execuţie arată astfel:

19

Se pot adăuga următoarele modificări asupra proiectului:

BitBtn6.Default:=True;
Form1.WindowState:=wsMaximized;

– pentru ca la apăsarea tastei Enter (în cazul în care focus-ul este în ComboBox1) să se execute evenimentul ataşat apăsării butonului BitBtn6
– iar în momentul lansării în execuţie a aplicaţiei, fereastra principală să fie maximizată pe tot ecranul.

Fişierul executabil generat în urma compilării proiectului este disponibil aici.

Categories: IT, Programe Tags: , , , , , ,