Sistem de Analiza a Log Urilor de Securitate In Retele de Calculatoare
TEZA DE MASTER
SISTEM DE ANALIZĂ A LOG-URILOR DE SECURITATE ÎN REȚELE DE CALCULATOARE
CUPRINS
ADNOTARE
Nume:
Prenume:
Titlul tezei: Sistem de analiză a log-urilor de securitate în rețele de calculatoare
Gradul solicitat: master
Localitate:
Anul perfectării tezei:
Structura tezei: Analiza rețelelor de calculatoeare, ale sistemelor existente de scanare a rețelelor, elaborarea și realizarea, concluzii generale și recomandări, bibliografie, anexe.
Cuvinte cheie: rețele, log, monitorizare, securitate, analiză, sistem.
Domeniul de studii: Rețele de calculatoare
Scopul și obiectivele lucrării: De a monitoriza fișierele log din rețelele de calculatoare și sistemele care rulează în rețea.
Semnificația teoretică: A fost creată un meganism de monitorizare a fișierelor log din rețea și sistemele existente.
Valoarea aplicativă: Există un număr mare de sisteme care monitorizează sistemele din rețea însă ceea ce sa creat este foarte simplu și comod de utilizat, ne avînd nevoie de cunoștințe în domeniu.
Implimentarea rezultatelor obținute: Monitorizarea log-urilor au fost aplicate cu succes în numeroase domenii, printre care monitorizarea locală, cât și cea de la distanță.
ANNOTATIONS
Name:
Subname:
Thesis title: Analysis system logs security in computer networks
Degree required: master
Locality:
Year of completing the thesis:
Structure of the thesis: Analysis calculatoeare networks, existing systems scan networks, development and implimentation, conclusions and recommendations, bibliography, annexes.
Keywords: networks, logging, monitoring, security, analysis, system.
Field of study: Computer Networks
Goals and objectives: To monitor log files of computer networks and systems running on the network.
Theoretical significance: Was created a program to monitor log files from network and systems.
The practical value: There are a large number of systems that monitor network systems but what is created is very simple and convenient to use, we needed having knowledge.
Implementation results: Monitoring logs were successfully applied in many fields, including local monitoring and the remote.
LISTA ABREVIERILOR
INTRODUCERE
Securitatea sistemelor și rețelelor este un element fundamental pentru funcționarea Internet-ului, ea permițând totodată transformarea acestuia dintr-un proiect de cercetare academic, într-o infrastructură de bază a societății zilelor noastre. Dependența de tehnologiile informaționale a creat noi categorii de vulnerabilități pentru alte componente ale infrastructurii sociale, iar un atac major asupra Internet-ului va crea nu numai întreruperi în ceea ce privește comunicațiile, ci va avea implicații și asupra altor infrastructuri critice (transporturi, energie, bancară, etc.). De aceea, securitatea infrastructurii Internet-ului a căpătat atenție deosebită în toate zonele sociale (academic, media, corporații, militar, politic, etc.).
În ciuda progreselor făcute în zona securizării tehnologiilor Internet, marea majoritatea a soluțiilor de securitate, bazate exclusiv pe suport tehnologic, a continuat să fie în continuare ineficace, realizându-se treptat că securitatea în spațiul virtual este în esență o problemă umană. Astfel, practici de securitate pe care societatea umană le-a desăvârșit de-a lungul istoriei sale au început să fie transpuse și în spațiul virtual.
Actualitatea și importanța.
Datorită complexității și dinamicii schimbărilor pe planul tehnologiilor IT, precum și a creșterii diversității și complexității amenințărilor la adresa oricărei organizații conectate la Internet, strategiile de securitate construite exclusiv pe mecanisme de protecție sunt sortite eșecului. Abordarea securității ca proces, și dintr-o perspectivă proactivă, orientată spre identificarea și alertarea timpurie asupra potențialelor amenințări, sau atacurilor aflate în faze inițiale, poate oferi timpul necesar elaborării unui răspuns eficace înainte ca organizația să fie afectată.
Asigurarea eficacității oricărui gen de proces (inclusiv procesul de securitate), presupune adesea definirea și implementarea unei componente care să urmărească constant evoluția procesului, astfel încât să se poată efectua în timp util corecții și actualizări ca răspuns la schimbările ce au loc în mediul de operare.
Scopul și obiectivele tezei.
În această teză noi vom creea un sistem informat pentru monitorizarea fișierlor log din rețelele de calculator.
Sistemul Informatic „Log Monitor” reprezintă un Sistem Informatic de tip desktop, ce urmează a fi implimentat pentru a automatiza procesele ce îl au administratori de sisteme și rețele și anume de a monitoriza și depista errorile sau atacurile care sunt în rețea. Acest Sistem Informatic urmează a fi împărțit în mai multe subsisteme informatice. Sistemul Informatic de cautare a informațiilor, care vor fi utilizat de un user simplu și desigur modulul de setare și monitorizare a fișierelor log.
Noutatea științifico – practică a rezultatelor obținute.
Prin crearea a unui astfel de sistem, noi vom analiza și trece prin toate fazele elaborării unui sistem informatic, ceea ce ne va permite în viitor să creăm practic orice sistem informatic necesar.
Folosirea platformelor moderne ne oferă mari benificii în atingerea scopurilor propuse.
În teza dată noi facem analiza platformelor moderne pentru elaborarea sistemelor informatice, proiectăm și elaborăm un sistem informatic folosind o platforma selecționată, prezentăm ghidul utilizatorului și ghidul programatorului.
Sumarul compartimentelor tezei.
În această teză sunt incluse 3 capitole:
Capitolul 1. Analiza rețelelor de calculator – aici se analizează principiile de elaborare a sistemelor informatice, platformele informatice ce sunt utilizate pentru elaborarea sistemelor informatice, analiza comparativă a acestor platforme și selectarea unei platforme informatice care ulterior va fi utilizată pentru elaborarea unui sistem nou.
Capitolul 2. Elaborarea sistemului informatic Log Monitor – fiind capitolul de bază al acestei lucrări de master, se discută despre instalarea și setarea platformei C#, precum și procesul de elaborare a structurii softului, principii de scanare a rețelelor de calculator și proiectarea monitorizării log-urilor de securitate.
Capitolul 3. Documentația tehnică a Log Monitor – cuprinde ghidul utilizatorului și ghidul programatorului al sistemului dat, fiind foarte comod pentru simpli utilizatori cît și pentru programatori, care doresc să studieză ideile de elaborare a acestui sistem informațional.
Fiecare capitol se încheie cu concluzii referitoare la capitolul dat.
Importanța teoretică și valoarea aplicativă a lucrării.
Sistemul informatic Log Monitor a fost testat și este gata de a fi folosit de administratorii care sunt interesați de a monitoriza mia simplu fișierele log. Datorită sistemului dat a fost automatizat procesul de căutare errorilor și atacurilor în rețeaua de calculator.
Sistemul este dinamic și poate fi ajustat sau modificat printr-o simplă interfață grafică. De asemenea poate fi folosit și un modul web pentru al extinde și pe undele situri web cu prelucrarea și monitorizarea fișierelor log a serverelor de la distanță.
Sistemul dat va simplifica lucrul căutării errorilor și atacurilor care sunt asupra rețelei sau a sistemelor din rețea.
Încât a fost implimentat tehnologia C#, sistemul actual poate fi completat sau extins prin mai multe subsisteme necesare organizației, ce vor automatiza și alte procese în cadrul ei.
Automatizarea procesului de căutare, monitorizare a fișierelor log din rețelele de calculator.
1. ANALIZA REȚELELOR DE CALCULATOR
1.1. Concepte de nivele a informației rețelelor de calculator
Acesta este cazul integrării unor tehnologii pentru a adresa adesea nevoi de eficientizare în organizație, dar care pot genera noi vulnerabilități.
Un exemplu în acest sens este accesibilitatea informațiilor director. Pentru a valida legitimitatea adresei destinatar din mesajele de poștă, multe organizații au integrat serviciile ce rulează pe stațiile gateway (ce recepționează poșta) cu serviciile director (cum ar fi LDAP/Active Directory) ale organizației. Dacă adresa destinatarului este validă, mesajul este acceptat spre livrare. Dacă adresa nu există, expeditorul este notificat despre acest lucru. Atacurile de culegere a informațiilor director – DHA (Directory Harvest Attacks) exploatează această vulnerabilitate prin trimiterea de mesaje către o listă posibilă de adrese de poștă din domeniul țintă. Pentru mesajele pentru care nu se primește notificarea de invaliditate a adresei se poate asuma că sunt legitime, putând fi folosite într-un viitor atac [12]. O soluție pentru acest tip de vulnerabilitate ar fi ca serverul să proceseze mesajele cu adresă invalidă, însă aceasta are ca rezultat un volum din ce în ce mai mare de procesare pentru organizație.
1.1.1. Nivelul protocoalelor de nivel aplicație
De-a lungul timpului au fost semnalate o serie de vulnerabilități în protocoalele native de poștă electronică (SMTP, IMAP și POP), Web (HTTP), cum ar fi: susceptibilitate ridicată la atacurile de tip dicționar (POP și IMAP), transmiterea traficului de date și autentificare în clar (vulnerabilitate exploatată de sniffere), lipsa unui mecanism nativ de autentificare pentru SMTP (exploatat de atacurile de tip SPAM și phishing), existența încă pe scară largă a multor servere SMTP configurate să accepte mesaje de la orice utilizator (open relay), și nu în ultimul rând o suită de bug-uri în diferitele implementări ale acestor protocoale (exploatate adesea de atacurile de tip buffer overflow) [3].
1.1.2. Nivelul sistemelor de operare
Sistemele de operare de tip Windows suportă o largă gamă de servicii, metode și tehnologii lucru în rețea. Multe din aceste componente sunt implementate ca Programe de Control a Serviciilor aflate sub controlul unui Manager de Control al Serviciului ce rulează sub numele de Services.exe. Vulnerabilitățile în aceste servicii care implementează funcționalități ale sistemului de operare reprezintă una din cele mai întâlnite căi de abuzare a stațiilor ce rulează sisteme Windows [10].
Vulnerabilitățile de tip buffer overflow exploatabile de la distanță continuă să fie o problema serioasă de securitate care afectează serviciile Windows. O parte din serviciile sistem de bază oferă interfețe clienților din rețea prin mecanismul RPC (Remote Procedure Calls). Alte servicii Windows implementează interfețe de rețea pe baza altor protocoale, inclusiv a celor standard cum ar fi SMTP, NNTP, HTTP, etc.
Multe din aceste servicii pot fi exploatate de sesiuni de tip anonim (sesiuni cu nume utilizator și parolă nule) pentru a executa cod cu privilegii ”SYSTEM”.
Produsele inițiale Windows aveau activate implicit multe din aceste servicii pentru a asigura o conveniență utilizatorilor cu cunoștințe limitate. Însă aceste servicii, adesea neutilizate de cei mai mulți dintre utilizatori, aduc riscuri de securitate suplimentare [33]. În ceea ce privește sistemele UNIX/Linux, acestea includ în configurația inițială un număr de servicii standard care pot fi exploatabile datorită configurării inadecvate.
1.1.3. Nivelul serviciilor de infrastructură ale Internetului
Un exemplu de serviciu critic pentru infrastructura Internetlui este DNS. Acesta găzduiește înregistrările de tip MX utilizate în rutarea mesajelor de poștă către domeniul destinație, cât și înregistrări de tip adresă ale altor sisteme ce oferă servicii de rețea (Web, autentificare, VPN). DNS ca multe alte protocoale de bază ale Internetlui datează din perioada inițială caracterizată de încredere mutuală. Acest model de încredere nu mai este de actualitate, iar tranzacțiile DNS pot fi viciate de atacuri de este de actualitate, iar tranzacțiile DNS pot fi viciate de atacuri de tip: cache poisoning, domain hijacking, și redirecție man-in-the-middle [31].
Unele din metodele propuse de autentificare a mesajelor de poștă cum ar fi Sender Policy Framework (SPF), SenderID, Domain Keys, Cisco Identified Internet Mail au la bază verificarea domeniului destinatarului utilizând serviciul DNS în actuala formă sau modificată. Pentru a limita cazurile de impersonare a serverelor de web, se recomandă utilizarea certificatelor de securitate, securizarea serviciului DNS [44]. Totuși sunt multe organizații care încă nu folosesc astfel de soluții.
1.1.4. Nivelul aplicațiilor
Outlook Express este aplicația client de poștă instalată pe toate versiunile de sisteme Windows. Vulnerabilitățile în acest produs pot fi exploatate pe baza următorilor vectori de atac:
Atacatorul poate trimite într-un mesaj de poștă un document Office malițios care este rulat de client. Acest vector de atac este exploatat de viruși și de o anumită categorie de viermi (worms) [7].
Atacatorul poate rula un server de știri (News) care trimite răspunsuri malițioase pentru a genera buffer overflow în aplicațiile client de poștă.
Vulnerabilitățile la nivelul clienților de navigare (IE, Firefox, Google Chrome, etc) pot fi exploatate în cazul în care utilizatorul accesează locațiilor web ce conțin scripturi (JavaScript, PHP, ASP) ce implementează astfel de exploatări [5]. Google (ce rulează principalul motor de căutare) realizează o scanare a conținutului paginilor indexate, însă posibilitatea de acces indirect (prin alte site-uri) permite eludarea acestui mecanism de protecție.
De-a lungul timpului au fost identificate vulnerabilități afectând mai toate categoriile reprezentative de aplicații utilizate în Internet cum ar fi: cele de accesare conținut media (Adobe Flash), aplicațiile de transmitere mesaje instant (Yahoo! Messenger, AOL Instant Messenger, MSN Messenger, Jabber, Trillian, Skype, Google Talk sau IRC), și chiar aplicațiile antivirus (AhnLab, Avast!, AVIRA, BitDefender, ClamAV, Computer Associates, F-Secure, Kaspersky, Mcafee, Sophos, Symantec, Trend Micro sau ZoneAlarm) [21]. Chiar dacă aceste vulnerabilități nu vizează în mod direct securitatea serviciilor de bază în rețea, prin preluarea controlului asupra stațiilor afectate de acest gen de vulnerabilități, securitatea altor servicii poate fi compromisă.
1.2. Fazele de compromitere
Pentru a detecta intruziunile, trebuie înțelese acțiunile necesare pentru compromiterea unei ținte. Cele cinci faze descrise în continuare reprezintă o modalitate prin care un atacator poate prelua controlul asupra unei victime. Scenariul prezentat mai jos urmărește atacurile generate din afară care sunt mult mai frecvente și reprezintă o problema majoră pentru organizații [22]. Conform raportului annual despre breșele de date analizate de firma Verizon în 2010, 92% dintre acestea au fost generate de agenți externi organizației.
Recunoașterea – reprezintă procesul de validare al conectivității, verificare a serviciilor active și identificare a aplicațiilor vulnerabile. Atacatorii care verifică vulnerabilitatea unui serviciu înainte de a căuta să exploateze ținta, au o mai mare probabilitate de succes. Recunoașterea ajută atacatorul în planificarea atacurilor într-o manieră cât mai eficient posibilă. Recunoasterea poate fi condusa prin mijloace tehnice precum si nontehnice cum ar fi obtinerea de informatii incorect distruse, sau de la persoane din interior dornice sa ofere informatii [20]. Dintre tehnicile de colectare prealabila de informatii despre tinta din surse publice se amintesc:
• Căutări avansate pe web, forumuri – un exemplu în acest sens este utilizarea de opțiuni avansate ale motoarelor de căutare pentru a beneficia de scurgeri de informații (de exemplu: utilizarea opțiunii allintitle: “index of /” site:.mta.ro la o căutare Google) datorate erorilor de postare sau management a documentelor în organizația țintă.
• Rețele de socializare – în cazul în care ținta este o persoană.
• Interogări DNS – utilizând aplicații simple precum nslookup.
• Interogări Network Information Centers (NICs) – bazele de date WHOIS.
• Sondarea SMTP – simpla trimitere a unui email la o adresă inexistentă în domeniul țintă oferă adesea informații utile despre rețeaua vizată.
Exploatarea – reprezintă procesul de utilizare neautorizată, subversivă sau de creare de breșe în serviciile de pe stația țintă.
Preluarea controlului – reprezintă faza în care atacatorul caută să obțină capabilități suplimentare asupra țintei. În timp ce unele exploatări conduc către obținerea de privilegii de nivel superuser, altele oferă doar acces la nivel utilizator. Atacatorii caută să găsească modalități pentru a obține privilegii mai mari pe stația țintă [41]. De asemenea, atacatorul va urmări ștergerea informațiilor din fișierele de log, adaugă conturi neautorizate și distruge orice informație (procese, fișiere) care evidențiază prezența sa ilegitimă. Unii atacatori pot instala și mijloace de comunicare cu exteriorul (back doors).
Consolidarea – are loc când atacatorul comunică cu victima prin intermediul back doorlui. Back door-ul poate lua forma unui serviciu de ascultare la care atacatorul se conectează. Odată ce sunt amplasate canalele de comunicație acoperite între atacator și victimă, abilitatea sistemelor de detecție sau a analistului de securitate de a detecta astfel de trafic este pusă la mare încercare [49]. În această fază atacatorul are control complet asupra țintei, singurele limitări sunt impuse de dispozitivele de filtrare a traficului din rețea între atacatori și victime.
Abuzul – reprezintă materializarea obiectivului atacului. Aceasta poate fi: furtul de informație, construirea unei baze de atac către alte stații din organizație, sau orice altceva ce atacatorul urmărește.
Tabelul 1.1. Fazele de compromitere
1.3. Tehnici de scanare a rețelelor și sistemelor
Scanarea reprezintă una din activitățile de bază ale fazei de recunoaște prin care atacatorul urmărește identificarea sistemelor active și accesibile din exterior, precum și a serviciilor pe care le oferă, folosind diverse metode și teste de scanare a porturilor, de detectare a sistemului de operare [32]. Tipurile de informații colectate în urma scanării se referă la:
• Serviciile TCP/UDP ce rulează pe fiecare sistem identificat.
• Arhitectura sistemului.
• Adresele IP ale sistemelor accesibile via Internet.
• Tipul sistemului de operare.
Atacatorul va căuta ca prin volumul și structura traficului de scanare generat să nu atragă atenția administratorilor de securitate și sistem din organizația țintă.
1.3.1. Tehnici de scanare a porturilor TCP
Porturile TCP accesibile pot fi identificate prin scanarea adreselor IP țintă. Următoarele tipuri de scanare a porturilor TCP sunt folosite atât de atacatori în faza de recunoaștere, cât și de organizații pentru identificarea propriilor vulnerabilități [51].
1.3.1.1. Metode de scanare standard
Aceste metode permit identificarea cu acuratețe a porturilor și serviciilor active, dar sunt ușor de identificat și jurnalizat. Organizațiile le folosesc în mod curent pentru detectarea propriilor vulnerabilități.
1.3.1.2. Scanare TCP connect
Se trimit pachete de sondare SYN la portul ce verifică. Dacă sistemul verificat răspunde cu un pachet ce are SYN și ACK setate, atunci portul este deschis. Dacă portul este închis, se recepționează direct un pachet RST/ACK. Conexiunea se stabilește prin trimiterea de un pachet ACK de către sistemul ce efectuează scanarea.
Fig. 1.1. Rezultatul scanării TCP connect atunci când un port este deschis
Fig. 1.2. Rezultatul scanării TCP connect atunci când un port este închis
Scanarea standard TCP connect este o cale sigură pentru a identifica serviciile de rețea accesibile. Dezavantajul este că acest tip de scanare este “zgomotos”, și este evitat de atacatorii experimentați.
1.3.1.3. Scanare SYN semi-deschisă (half-open)
Această metodă diferă de cea precedentă prin trimiterea unui pachet RST (pentru a reseta conexiunea) în cel de-al treilea pas al fazei de stabilire a conexiunii. Deoarece adesea conexiunile nestabilite complet nu sunt jurnalizate de stațiile țintă, atacatorii pot utiliza acest gen de scanare [43]. În figurile de mai jos este prezentat schimbul de pachete între 2 sisteme când este lansată o scanare de acest tip, atât în cazul unui port deschis cât și în cazul portului închis.
Fig. 1.3. Rezultatul scanării half-open SYN flag atunci când un port este deschis
Fig. 1.4. Rezultatul scanării half-open SYN flag atunci când un port este închis
Scanarea SYN este rapidă și sigură, dar necesită privilegii de acces la stațiile Windows și Unix.
1.3.1.4. Metode de scanare TCP invizibilă
Metodele de scanare invizibile implică analiza proceselor ce au loc pe stiva TCP/IP a mașinii țintă și răspunsul la pachetele cu anumiți biți setați. Asemenea tehnici nu sunt eficiente la descoperirea porturilor deschise pe anumite sisteme de operare, dar furnizează un anumit grad de discreție și uneori nu sunt jurnalizate [39].
1.3.1.5. Scanare inversă TCP
Se stabilește că dacă un port este închis pe o stație, atunci trebuie trimis un pachet RST/ACK pentru a reseta conexiunea. Pentru a folosi acest lucru se trimit pachete sondă cu diferiți biți de stare TCP setați către fiecare port al mașinii țintă.
Există trei tipuri de configurații a biților de flag, folosite în mod curent:
• Sondare FIN (bitul TCP FIN setat).
• Sondare XMAS (biții TCP FIN, URG, și PUSH setați).
• Sondare NULL (fără biți de stare TCP fără flaguri TCP setate.
Conform standardul RFC, dacă nu este primit nici un răspuns de la portul mașinii țintă, atunci portul este deschis sau stația este inactivă. Pentru toate porturile închise de pe mașina țintă, sunt recepționate pachete RST/ACK. Totuși implementările stivei TCP/IP pe anumite sisteme de operare (cum sunt cele din familia Microsoft Windows) nu urmează complet standardul RFC 793 în acest sens, și deci nu există răspuns RST/ACK la o încercare de conectare pe un port închis [38]. În schimb, această tehnică este eficientă în cazul sistemelor de operare de tip UNIX.
1.3.1.6. Scanare ACK
O tehnică mai discretă de scanare este cea de a identifica porturile TCP deschise prin trimiterea unui volum de pachete de sondare ACK către diferite porturi ale stației țintă și analizarea informațiilor din antetul pachetelor RST recepționate.
Fig. 1.5. Pachetele sondă ACK sunt trimise la diferite porturi
Există două tipuri de tehnici de scanare ACK care implică:
• Analiza câmpului TTL (time-to-live) al pachetelor recepționate – porturile deschise vor fi cele pentru care câmpul TTL este mai mic decât valoarea maximă a TTL din șirul de pachete RST recepționate [37].
• Analiza câmpului WINDOW al pachetelor recepționate – porturile deschise vor avea câmpul WINDOW diferit de 0.
Avantajul acestui tip de scanare este că detecția sa este foarte dificilă, însă datorită faptului că se bazează pe particularități ale implementării stivei TCP/IP, nu are aplicabilitate largă [34].
1.3.1.7. Metode de scanare TCP fabricată (spoofed)
Aceste metode de scanare permit ca pachetele de sondare să fie trimise prin intermediul stațiilor vulnerabile pentru a ascunde adevărata sursă care încearcă scanarea rețelei [30]. Un important avantaj al acestor metode este că pot permite accesul la configurația firewalllui prin intermediul stațiilor de încredere, dar care sunt vulnerabile.
Fig. 1.6. Scanarea porturilor prin FTP
1.3.1.8. Scanare FTP
Multe servere FTP manipulează conexiunile folosind comanda PORT care permite transferul datelor la stația și portul specificat. Dacă există și un director pe care se poate scrie, atunci atacatorul poate introduce o serie de comenzi și alte date într-un fișier și apoi le transmite la o anumită stație și port [35]. Spre exemplu cineva poate face upload unui mesaj email spam, pe un server FTP vulnerabil, și apoi mesajul este trimis la portul SMTP al serverului de email țintă.
1.3.1.9. Scanare Proxy
Configurația incorecta a unor stații poate permite utilizarea lor ca agenți în expedierea cererilor de scanare. Deoarece această soluție este consumatoare de timp, atacatorii preferă adesea să realizeze atacul asupra țintei direct de pe stația proxy [23].
1.3.1.10. Scanare pe baza de sniffer
Elementul ce determină eficiența acestui tip de scanare este configurarea interfeței de rețea a stației în modul promiscuous, după care se ascultă răspunsurile pe segmentul de rețea. Exista două mari avantaje ale utilizării acestei metode de scanare:
• Daca atacatorul capătă privilegii de administrator asupra unei mașini din același segment de rețea cu stația ținta, sau cu firewall-ul care protejează ținta, se pot trimite pachete TCP de la o adresa IP aleatoare din rețea pentru a identifica stațiile de încredere și a obține accesul la firewall [25].
• Daca atacatorul are acces la un segment mare de rețea partajată, poate realiza scanare fabricată în numele stațiilor din segmentul respectiv la care nu are acces, sau care nu există, pentru a scana eficient rețele la distanță într-un mod distribuit și invizibil.
Fig. 1.7. Scanarea antetului IP și părțile implicate
1.3.1.11. Scanarea antetului IP
Scanarea antetului IP este o tehnică de scanare care implică abuzarea implementărilor stivei TCP/IP în majoritatea sistemelor de operare. Sunt implicate trei stații:
• Stația zombie care este o mașină din Internet.
• Stația țintă care va fi scanată.
• Stația de scanare, sondează printr-o secvență de pachete stația zombie, iar pe baza modificărilor în numerele de secvență ale pachetelor recepționate se poate deduce dacă porturile pe stația țintă sunt deschise [13].
1.3.1.12. Scanarea porturilor UDP
Deoarece UDP este un protocol fără conexiune, exista doar două căi de enumerare eficientă a serviciilor de rețea UDP de-a lungul unei rețele IP:
• Trimiterea pachetelor UDP către toate cele 65535 porturi UDP, și apoi așteptarea mesajului “ICMP destination port unreachable” pentru a identifica porturile UDP care nu sunt accesibile [36].
• Folosirea clienților specifici serviciului UDP (snmpwalk, dig, tftp) pentru a trimite datagrame UDP către serviciile de rețea UDP țintă și apoi așteptarea răspunsului pozitiv.
În figurile de mai jos sunt prezentate pachetele UDP și răspunsurile ICMP generate de stații când porturile sunt deschise sau închise. Scanarea porturilor UDP este o scanare de tip invers în care porturile deschise nu răspund.
Fig. 1.8. Rezultatul scanării inverse UDP când un port este deschis
Fig. 1.9. Rezultatul scanării inverse UDP când un port este închis
1.4. Tehnologii pentru detecția intruziunilor
Domeniul detecției intruziunilor a luat naștere odată cu documentul tehnic publicat de J. Anderson în 1980. Acesta propunea primul concept de detecție a anomaliilor în care informația de auditare putea fi folosită pentru identificarea abuzurilor ce aveau loc în sisteme.
Principiul de operare al unui sistem de detecție a intruziunilor are la bază idea conform căreia activitățile în spațiul virtual (inclusiv cele asociate intruziunilor) nu se desfășoară în vacuum, generând indicii și urme [8]. În multe cazuri, atacatorii „personalizează” sistemele compromise utilizând un set propriu de aplicații pentru a-și consolida accesul (instalarea software captură activitate tastatură, spaming, activitate botnet, etc). În mod teoretic, un sistem de calcul are posibilitatea de a detecta astfel de modificări, iar sistemele IDS încearcă să implementeze aceste capabilități și să notifice asupra celor identificate.
Fig. 1.10. Arhitectura generică a unui sistem IDS
Arhitectura de principiu a unui sistem pentru detecția intruziunilor (IDS) este prezentată în figura următoare.
În literatura de specialitate sunt disponibile mai multe clasificări ale sistemelor IDS, cele mai importante fiind după proveniența datelor și după tehnica de detecție folosită.
În funcție de proveniența datelor utilizate în procesul de detecție (ceea ce dictează în mod implicit și amplasarea acestora), soluțiile IDS se clasifică în HIDS (IDS bazate pe informații provenind de la stații) și NIDS (IDS bazate de datele de trafic din rețea) [9].
Un sistem HIDS monitorizează starea stației precum și aspecte ale comportamentului său dinamic cu scopul de a determina încercări de violare a politicii de securitate a sistemului respectiv. HIDS utilizează în general o bază de date securizată cu obiecte sistem și atributele de referință asociate acestora (permisiune, dimensiune, date modificare, etc.). În procesul de monitorizare se compară atributele curente ale obiectelor cu cele de referință, din baza de date.
Un sistem NDIS monitorizează pachetele de date din rețea (Snort, Bro), sau statisticile de trafic furnizate de echipamentele din rețea sau alte aplicații (Novell Analyzer, Microsoft Network Monitor) pentru a determina indicatori asupra activităților suspecte cum ar fi: scanări, propagări de viermi, atacuri DoS, etc [48].
În multe implementări de sisteme IDS comerciale, se combină aspecte specifice HIDS și cele NIDS, aceste implementări fiind numite și NNIDS (IDS de nod de rețea). NNIDS operează ca un NIDS hibrid la nivel de stație ce procesează traficul destinat către mașina respectivă. Aceste soluții hibride adresează limitările de vizibilitate ale NIDS clasic în ceea ce privește traficul de rețea criptat, oferind totodată o monitorizare eficientă la nivelul serviciilor (Web, SMTP, SSH, etc.) pentru identificarea încercărilor de violare a specificațiilor protocoalelor de nivel aplicație [4].
În funcție tehnica de detecție folosită, sistemele IDS au fost în mod tradițional grupate în două clase mari: sisteme bazate pe anomalii și cele bazate pe semnături. În timp, o serie de noi tehnici au fost recunoscute în literatura de specialitate și anume: monitorizarea integrității, monitorizarea fișierelor de jurnalizare, tehnici capcană (honeypot), și tehnicile hibride.
1.5. Analiza fișierelor log
Analiza fișierelor de jurnalizare, denumită adesea în literatura comercială de specialitate LIDS (detecție de intruziuni bazată pe fișiere de jurnalizare) poate fi utilizată pentru a detecta utilizări necorespunzătoare ale sistemelor, sau violări ale politicii de securitate.
1.5.1. Soluții de analiză offline
Anumite soluții realizează analiza fișierelor de jurnalizare (log) pe o durata de timp și generează rapoarte care pot fi evaluate ulterior de personalul de administrare sau de securitate. Acest gen de soluții rulează în mod uzual zilnic și sunt benefice în identificarea evenimentelor pentru o analiză mai aprofundată de timp real. Rapoartele oferă de asemenea informații statistice care ajută în evaluarea tendințelor (detectarea de anomali). Totuși aceste soluții au limitări în ceea ce privește adresarea situațiilor ce necesită un răspuns imediat. De exemplu, dacă un server web este inaccesibil, este necesar un răspuns imediat, iar identificarea acestei probleme pe baza acestui tip de soluție este inadecvată [18].
Logwatch este o soluție ajustabilă care analizează fișierele specificate de utilizator pe baza unor criterii alese de acesta și generează rapoarte. Aplicația constă într-un set de scripturi Perl și filtre care sunt simplu de configurat. Aceste criterii sunt furnizate ca opțiuni în linia de comandă. Soluția poate fi utilizată pentru analiza fișierelor de jurnalizare a programelor uzuale (cum ar fi Apache, sendmail, etc.), dar poate fi ușor configurată pentru a interpreta și jurnalele altor categorii de aplicații [29].
SLAPS-2 (System Log Analysis & Profiling System 2) este o colecție de programe Perl utilizate pentru filtrarea fișierelor de jurnalizare sistem ce se colectează pe un server central. Aplicația produce o serie de rapoarte de analiză a operării sistemului care pot fi trimise prin email către o listă de utilizatori specificați. Această soluție adresează și aspecte legate de rotația fișierelor de jurnalizare utilizate în decursul analizei [46].
1.5.2. Soluții de analiză online
Analiza de timp real constă în acele soluții care rulează permanent și monitorizează unul sau mai multe fișiere de jurnalizare. Aceste soluții au avantajul generării în timp real de alerte când sunt detectate anumite evenimente, însă cele mai multe dintre soluții sunt limitate în ceea ce privește adresarea situațiilor atipice.
SWatch (Simple Watchdog) a fost una din primele soluții create pentru monitorizarea fișierelor de jurnalizare. Aceasta filtrează datele care nu satisfac soluția de filtru, și efectuează asupra datelor rămase un set de acțiuni specificate de utilizator. Când se identifică o linie în fișierul de jurnal care satisface condiția specificată de utilizator o poate salva, sau notifica administratorii. Soluția oferă suport pentru executarea unui set de acțiuni, cât și pentru ignorarea evenimentelor duplicate. Deoarece examinează secvențial evenimentele, funcția de corelație temporară lipsește în acest caz.
Logsurfer este o soluție mai eficientă care permite schimbarea dinamică a regulilor în timp sau în funcție de contextul evenimentelor identificate. Soluția permite o multitudine de opțiuni ce asigură un grad ridicat de flexibilitate, cum ar fi: specificarea de excepții, setare de timeout pentru reguli, specificarea de secvențe de identificare care pot fi ignorate, trimiterea rezultatelor prin email către anumite mașini, etc. Logsurfer+ este o extensie care permite generarea de alerte când se detectează lipsa de mesaje și permite de asemenea specificarea unui număr minim de evenimente care trebuie identificate pentru a genera o alertă [19]. Această ultimă facilitate poate fi folosită pentru identificarea stărilor anormale, însă este necesară o evaluare prealabilă din partea utilizatorului pentru determinarea acestui prag de anomalie.
SEC (Simple Event Correlator) este o soluție bazată pe surse deschise, independentă de platformă care poate fi utilizată pentru corelarea de evenimente. Oferă un mod flexibil de introducere a datelor (pipeuri numite, intrare standard STDIN, sau nume fișiere normale). Se utilizează o listă de reguli pe baza cărora se caută potriviri în liniile de intrare. O regulă SEC are următorul format:
• Condiție de potrivire a evenimentului – sunt exprimate ca expresii regulare și rutine Perl.
• O listă de acțiuni – care vor fi efectuate în cazul satisfacerii condiției de potrivire.
Dintre tipurile de acțiuni se amintesc: creare de contexte, invocarea unor programe externe, resetarea corelațiilor active.
• O valoare booleană – care controlează aplicabilitatea regulii la un moment dat de timp.
La momentul aplicării unei reguli se poate specifica un nume de context, permițându-se astfel corelarea evenimentelor pe bază de context.
Deși are reguli statice, SEC oferă operații de corelare de nivel ridicat cum ar fi: potriviri explicite de perechi și numărarea operațiilor. Spre exemplu, pe baza regulii SingleWithThreshold se poate contoriza numărul de apariții al unui eveniment [15]. Pe durata unui interval de timp dat, iar contorul este comparat cu o valoare de prag specificată în regulă. În cazul în care contorul depășește valoarea de prag, o acțiune se va executa.
OSSEC este un sistem HIDS complex ce oferă și servicii de analiză a fișierelor de jurnalizare. Această aplicație efectuează procesarea fișierelor log în trei etape:
• Predecodare – extrage câmpuri cunoscute din fișierele log precum timpul evenimentului.
• Decodare – folosind decoderi definiți de utilizator pentru a extrage informații relevante din fișierele de jurnalizare care vor fi folosite în procesul de analiză.
• Analiză – efectuează operații de tip potrivire asupra informațiilor decodate pe baza unei structuri arborescente de reguli atomice sau compozite. Structura arborescentă asigură utilizarea în procesul de analiză numai a sub-regulilor relevante pentru procesul de detecție respectiv. De exemplu, dacă se analizează o intrare legată de un eveniment SSH, nu se va traversa prin sub-arborele de reguli pentru evenimente Apache [40].
1.5.3. Monitorizarea integrității fișierelor
Această categorie de monitorizare este capabilă să identifice și raporteze modificări neautorizate asupra fișierelor. Se utilizează pentru protecția fișierelor critice (fișiere binare aplicație, sau fișiere de configurare a aplicațiilor și serviciilor) și care se consideră a fi statice între activitățile de actualizare a sistemului sau a configurațiilor acestuia. Această tehnică stabilește în prealabil o sumă de verificare a fișierelor care se stochează într-o bază de date, după care verifică integritatea fișierelor monitorizate prin recalcularea sumei de verificare și compararea cu cea înregistrată inițial în baza de date [6]. O implementare reprezentativă pentru această clasă o reprezintă aplicația Tripwire, al cărei principiu de funcționare se regăsește și în alte implementări cum ar fi AFICK, OSSEC.
În primă fază se creează politica de monitorizare a integrității prin identificarea fișierelor și directoarelor ce trebuie monitorizate, și stabilirea regulilor de identificare a intruziunilor și a nivelului de verificare a integrității sistemului – atributele de fișier ce vor fi monitorizate cum ar fi: dimensiune, id utilizator, id group, timp ultim acces, timp ultimă modificare, număr de legături, număr iNode, permisiuni, etc [12]. Apoi, se inițializează baza de date care păstrează informații despre starea de referință a fișierelor ce vor fi monitorizate.
Pe durata monitorizării se va compara informația de referință (din baza de date) cu atributele de stare actuală ale fișierului, iar în caz de discrepanță se generează un raport sau o alertă.
Pentru o securitate sporită a mecanismului de monitorizare a integrității, Tripwire criptează și semnează propriile fișiere utilizând două chei criptografice pentru a detecta dacă a fost compromis:
• Cheia de site – protejează fișierul de politică și cel de configurare.
• Cheia locală – protejează baza de date și rapoartele de discrepanță generate.
Pe lângă utilitatea în descoperirea intruziunilor și a breșelor de securitate, monitorizarea integrității fișierelor poate servi și la eficientizarea altor procese din organizație cum ar fi managementul modificărilor și asigurarea conformității cu politica de securitate.
1.6. Concluzii la capitolul 1
Pot fi continuate descrierile și ale altor metode potențiale de analiză și chiar trebuie descoperite noi metode. De regulă, noile metode de analiză nu sunt realizate de administratori, dar pot fi adoptate prin transfer tehnologic. Operații precum clasificarea, interpolarea, determinarea drumului optim etc. trebuie analizate cu atenție și fundamentate științific în cadrul unui proiect de log. Cele de mai sus trebuie combinate cu operațiile de monitorizare computerizată, deoarece forma finală uzuală de prezentare a rezultatelor monitorizate.
Internet-ul reprezinta cel mai amplu proiect creat vreodata de civilizatia umana, societatea moderna informationala reprezentând deja o realitate. Început ca un proiect de cercetare în urma cu patru decenii, Internet-ul devine pe zi ce trece o „oglinda” cât mai fidela a societatii umane, multe din relatiile sociale, economice, politice, culturale transpunându-se pe aceasta infrastructura informationala. În aceste circumstante, securitatea informationala a devenit una din componentele majore și vitale pentru buna operare ale Internet-ului.
2. ELABORAREA SISTEMULUI INFORMATIC „LOG MONITOR”
2.1. Tehnologii folosite la proiectarea sistemului
În general, în cazul proiectării unor aplicații complexe, se utilizează un model de proiectare bazat pe mai multe nivele, separate între ele. Un model de proiectare des utilizat este modelul bazat pe 3 straturi (fig. 2.1). Acestea sunt:
• Stratul prezentare (Presentation tier): este reprezentat de interfața utilizator expusă de program. Uzual, este sub forma unei interfețe grafice, prietenoase pentru utilizator, implementată fie sub forma unor forme Windows, fie sub forma unor interfețe accesibile prin intermediul browserelor web.
• Stratul logic al aplicației (Business Logic tier): este reprezentat de codul aplicației
• Stratul de date (Data tier): va stoca datele manipulate de program. Acestea pot fi stocate în baze de date, fișiere xml, fișiere binare, etc. Marea majoritate a aplicațiilor vor implementa clase care gestionează accesul la acest nivel.
Fig. 2.1. Proiectarea în trei straturi
Înainte de a se trece la proiectarea propriu-zisă a aplicației, este necesar ca proiectantul să aibă o idee clară asupra a ceea ce trebuie să facă aplicația. Bazat pe aceasta, se poate trece la proiectare și implementarea stratului logic [50]. Aici, urmează să fier implementate clasele necesare creării de obiecte capabile sa implementeze și să rezolve problema dorită, capabile să furnizeze informația cerută de stratul de prezentare și să manipuleze datele din stratul de date. Modul de concepere al unei astfel de aplicații multistrat, o vom detalia în continuare.
La proiectarea softului au fost folosite mai multe tehnologii, ca: .NET, XML, FileSystemWatcher.
Am folosit sistemul de programare C# din motivul că ne permite să facem legătura cu bazele de date și să punem în aplicare un întreg sistem legat de sistem. C# ne permite să facem un sistem legat de securizare și salvarea informației într-o singură interfață [2].
Limbajul de programare C# ne-a ajutat să facem întregul sistem de la interfață, meniu, întreaga structură, etc. Aici putem să zicem multe din motivul că tot softul e bazat pe limbajul și orice element e trecut prin codul sursă. Cu astfel de aplicații facem unirea întregei baze de date de log-uri și punem în aplicare întregul mechanism [11].
Am folosit Visual Studio încît ne permite să facem o interacțiune între limbajele de programare mult mai simplă [44]. Și ne ajută și la verificarea erorilor pentru a întelege unde e problema și soluționarea.
2.2. Limbajul C#
Tehnologia orientată pe obiecte și-a demonstrat valoarea într-o multitudine de aplicații din cele mai diverse domenii: electronica medicală, tranzacții de valori mobiliare, sisteme de gestiune a informațiilor din întreprinderi, controlul traficului aerian, producția de semiconductor, jocurile video interactive, rețele de telecomunicații, cercetări în astronomie etc. La ora actuală există deja o bogată experiență acumulată în cadrul proiectelor care au adoptat tehnologia orientată pe obiecte – atît proiecte reușite, cat și proiecte eșuate [47]. Din perspectiva proiectanților de software lucrurile se văd cam în felul următor: la ora actuală chiar și în spatele celor mai obișnuite activități dintr-o societate industrializată (telefonie, tranzacții de acțiuni, conducerea automobilelor, examinări medicale) se află programe sofisticate; software-ul s-a infiltrat tot mai adânc în societatea umană, ceea ce creează o cerere tot mai mare de specialiști [26].
După mai mulți ani de inactivitate pe piața compilatoarelor, Microsoft apare cu o tehnologie nouă, .NET. Noutatea introdusa este C# avînd o sintaxa asemanatoare cu cea din C++ și Java [24]. În platforma C# putem avea clase, interfețe, tablouri, delegări, structuri și enumerări. C# nu e o tehnologie unitară, e o platformă care cuprinde un set de tehnologii: atât un limbaj de programare cât și un mediu de execuție, librării standard, protocoale de comunicație gen RMI.
C# e un limbaj simplu, ca sintaxa, însă e mai evoluat, sau cel puțin mai bine gândit decât Java. De fapt asemănarea dintre C# și Java e doar de suprafață, în realitate C# e mult mai apropiat de C/C++ decât de Java. Există de asemenea avantaje de performanță ale platformei C# legată de viteza de execuție a codului Java, foarte apropiată de performanța codului nativ x86, sau avantaje ținând de suportul nativ pentru servicii Web. Însă C# a fost gîndit mai mult ca un mediu de execuție care să ofere suport foarte simplu pentru componente și servicii Web din diverse limbaje [28]. Deci C# e mai degrabă o reincarnare a tehnologiei COM. Din acest punct de vedere, C# își propune rezolvarea problemei interoperabilității: cum fac să comunic două aplicații X și Y extrem de diferite, scrise în limbaje diferite. Răspunsul C# este: prin componentizare, la nivel de intranet sau prin servicii web (XML/SOAP/WSDL) la nivel de Internet. C# are suport foarte bun pentru reutilizarea codului existent fără a fi necesara rescrierea acestuia [27]. Mediul C# de la Microsoft este destinat platformei Windows. Există standarde deschise privitor la limbajul C#, formatul binar al executabilelor C# cât și al setului principal de biblioteci C#.
În C++, codul generic este înștiințat la compilare și se creează câte o versiune a codului pentru fiecare combinație de tipuri primită ca argument [42]. Exista avantaje evidente în aceasta abordare – toate verificările pot fi făcute la compilare, ceea ce implica o calitate mai buna a codului la rulare, iar compilatorul instantiata numai clasele și metodele care sunt efectiv folosite în proiectul respectiv, ceea ce poate reduce într-o oarecare măsură dimensiunea în memorie a programului respective [14]. Exista însa un dezavantaj major, care iese la iveala în proiecte mari: daca o clasa generica este instantiata pentru multe tipuri, are loc asa-numitul „code bloat – expandarea excesiva a codului. Este posibil ca o funcție sau o clasa banala sa ocupe pagini întregi din memoria procesului la rulare din aceasta cauza – o abordare ineficienta.
În C#, aceste neajunsuri sunt eliminate într-o măsură însemnată datorită sistemului standard de tipuri – CLS. Pînă în prezent, implementarea colecțiilor, de exemplu, se făcea pe baza faptului ca, în CLS, toate tipurile sunt derivate din Object [17].
Codul generic preia ca argumente și tipurile de date cu care lucrează. Între codul generic din C++ și cel din Java există cîteva diferențe importante. Cea mai semnificativă constă în faptul că, spre deosebire de C++, unde codul este instanțiat la compilare, în C#, codul generic din C# are un corespondent direct în limbajul intermediar și este instanțiat la rulare, prin compilare Just in Time (JIT). În anumite condiții, codul poate fi instanțiat și la instalare, prin NGEN.
În C#, după cum spuneam, codul generic din Java este transformat în limbaj intermediar (IL) generic [15]. De exemplu, daca scriem un algoritm de sortare, putem sa îl facem generic, astfel încât sa poată opera fără probleme pentru tipuri întregi, în virgula mobila sau pentru șiruri, si putem distribui cod binar care conține doar instrucțiunile generice. La rulare, acestea sunt transformate în cod propriu-zis, după câteva reguli simple: în cazul în care o clasa/funcție generica este instantiata cu tipuri referință, va exista o singura copie a codului pentru toate instantele care folosesc exclusiv tipuri referință. În cazul în care la instantierea tipurilor generice se folosesc tipuri valoare, va fi creata câte o copie a codului, specializata pentru fiecare dintre aceste tipuri. Despre tipuri valoare în C#, ne putem asigura ca un tip primit ca argument supportă operațiile de baza prin intermediul constrângerilor. Introducerea codului generic în C# aduce de la sine o serie de modificări în regulile limbajului [1]. Codul generic din C# rezolvă o serie de probleme si aduce un plus major de eleganta, performanta si calitate programelor scrise. În condițiile în care importanta codului managed creste de la o zi la alta, aceasta caracteristica a cărei lipsa a fost reproșata până acum creatorilor C# se integrează în ansamblul de instrumente ce alcătuiesc noua generație de instrumente de dezvoltare pentru Windows.
2.3. Elaborarea softului ,,Log Monitor”
Sistemul informatic ,,Log Monitor” este realizat pentru orice tip de calculator cu sistem de operare de la Microsoft, fie Windows 7 pentru utilizatori sau chiar și Windows Server 2007 pentru servere.
Start Sfîrșit
Fig.2.1. Schema bloc de funcționare a softului
Proiectarea interfeței utilizator a aplicației. În cadrul acestei etape programatorul concepe și implementează în mod vizual și interactiv elementele interfeței dintre aplicație și utilizatorul acesteia. Elementul care stă la baza realizării interfeței îl constituie forma (macheta de lucru sau fereastra aplicației) în cadrul careia vor fi implementate toate controalele, bara de meniu, meniurile popup, corespunzatoare aplicației proiectate. Forma poate fi concepută atît ca și fereastra principală a aplicației cît și ca fereastra de dialog afișabilă în anumite momente (stabilite de programator) pe parcursul execuției aplicației. La intrarea în mediul de programare Visual Studio este afișată, în mod implicit, o formă avînd denumirea de Form1. Pe aceasta vor fi implementate celelalte elemente ale interfetei aplicației.
Setarea proprietăților. Ținînd cont de faptul că proprietățile unui obiect determină comportamentul acestuia în cadrul aplicației, această etapă presupune modificarea valorilor proprietăților obiectelor implementate în cadrul etapei descrise mai sus.
Scrierea (editarea) programului corespunzator aplicatiei. Programul corespunzator aplicației reprezintă ansamblul de constante, variabile, proceduri (subrutine), funcții și instrucțiuni definite în vederea prelucrării datelor aplicației. Programul se editează în cadrul ferestrei de editare a programului cunoscută sub numele de fereastra Code. Această fereastră este afișată fie prin apelarea opțiunii Code din cadrul meniului View, fie printr-un dublu click mouse pe obiect din cadrul interfeței aplicației. Declaratiile de variabile generale se vor introduce în cadrul sectiunii (General), a ferestrei Code, iar programul asociat fiecărei proceduri eveniment se va introduce în corpul procedurii (sub-rutinei).
Fig. 2.2. Integrarea întregului system într-o singură clasă
Pe lînga procedurile eveniment în cadrul acestei ferestre pot fi editate și proceduri sau funcții definite de către utilizator. O parte a programului asociat aplicației poate fi scris și în cadrul modulelor program externe (fișiere cu extensia .BAS). Modulele de program externe pot conține doar proceduri sau funcții definite de către utilizator. Apelarea procedurilor definite de către utilizator se realizează fie prin simpla scriere a numelui procedurii și/sau parametrilor acesteia, fie cu ajutorul instructiunii Call, astfel:
Fig.2.3. Proiectul de creare a sistemului
Avantajele acestui soft sunt:
• Cu ajutorul detectării putem face o securizare a informației și apoi să fie restabilită înapoi la parametrii originali.
• Softul dat ne permite să scoatem în evidență marginile unei imagini și apoi să utilizăm imaginea dată ca o formă negativă la unele aplicații. De exemplu imaginile cu scris sau care conțin careva srifturi de scris cu ajutorul detectării conturului putem face ca o arhitectură pentru a face un design pentru un placat ceva sau o publicitate.
• Punerea în aplicare un detectarea marginea-dimensional, valorile pixelilor de-a lungul unei linii sunt digitalizate și informații gradient calculat. Vîrfuri de-a lungul acestui gradient va reprezenta apoi locurile de marginile în cadrul imaginii.
• Cea mai mare parte din cod folosește îmbunătățit Forma Context ca descriptor caracteristică și se potrivesc într-un cadru Hough vot pentru a detecta obiecte
Dezavantaje:
• Marginile vizibile numai în benzile de verde și albastru nu vor fi detectate.
Modificările sau discontinuitățile de intensitate (amplitudine) dintr-o imagine constituie caracteristici fundamentale care pot indica prezența unor obiecte într-o imagine. Aceste discontinuități sunt denumite contururi. La toți operatorii prezentați în lucrare, intensitățile se înlocuiesc cu sumele obținute prin convoluția imaginii procesate cu măștile corespunzătoare.
2.4. Securizarea sistemului
Pentru a reduce riscurile de securitate în utilizarea și administrarea sistemelor IT, cea mai bună strategie este cea pe ansamblu (security in depth). Aceasta presupune evaluarea pe ansamblu a infrastructurii IT și clasificarea expunerii la riscuri de securitate. Pentru fiecare dintre riscurile identificate trebuie realizate planuri de măsuri, fie pentru reducerea expunerii la acele riscuri (mitigation), fie pentru reducerea impactului odată ce riscul s-a produs (contingency).
Sistemele de protecție perimetrală asigură limitarea accesului neautoritat într-o tonă protejată. Spre deosebire de sistemele de securitate de interior, sistemele de detecție perimetrală sunt proiec tate să operete în orice tip de mediu extern (variații de temperatură, umiditate, radiații solare, curenți de aer) cât și factori perturbatori (animale sălbatice, fenomene naturale trantitorii, etc) [16].
Aceste sisteme trebuie să răspundă prompt și precis în realitarea detecției și evaluarea stării de alarmă, să realitete întârtierea pătrunderii în spațiul protejat luându-se măsuri de limitare mecanică a pătrunderii în spațiul protejat (garduri, tiduri, etc) pentru o proiectare cât mai corectă a sistemului de detecție perimetrală trebuie să realităm cum am amintit și mai devreme o analiză de risc pe bata căreia se stabileste nivelul de protecție. Se pornește de la analitarea evaluărilor pierde- rilor potențiale, acestea putând si pierderi materiale, informaționale ori de altă natură.
O arhitectură generică de monitorizare a securității are următoarele componente: surse de evenimente cu relevanță pentru procesul de monitorizare (sisteme IDS de rețea, rutere, sisteme de verificare a integrității fișierelor, etc.), colectoare de evenimente, baza de date cu mesaje de securitate, module de analiză și aplicații pentru suportul răspunsului la incidentele de securitate identificate. Problema cea mai des întâlnită în implementarea unei arhitecturi o reprezintă integrarea componentelor enumerate anterior, în contextul asigurării integrității, disponibilității și securității datelor, și a canalelor de comunicație între componente. Pentru o aplicabilitate extinsă se va considera că infrastructura ce se dorește a fi monitorizată aparține unei organizații diferită de cea ce oferă serviciile de monitorizare – cazul tipic pentru serviciile externalizate cum ar fi Managed Security Servicies. Pentru simplificare, se va utiliza termenul de „infrastructura clientului” pentru a desemna „infrastructura clientului ce se dorește a fi monitorizată”.
După stabilirea inventarului infrastructurii client, se vor evalua aspectele politicii de securitate care influențează generarea de evenimente, procesele de raportare și reacție la intruziuni, pentru a fi păstrate în baza de cunoștințe.
Aspecte precum autorizarea, procedurile de testare și auditare vor oferi informații legate de tipul de comportament pe care senzorii îl vor putea detecta. Evenimentele generate (cum ar fi: accesul de nivel administrator, scanare porturi, etc.) vor fi evaluate în contextul politicii de securitate. Cele găsite ca neconforme cu criteriile politicii de securitate vor fi analizate ca parte posibilă a unei încercări de intruziune.
2.5. Caracterizarea softului ca algoritm de lucru
1. Primul pas pe care îl face softul este de a căuta informații despre evenimentele realizate în rețea. Acest lucru este foarte simplu, este de ajuns să încărcăm fișierul de tip log.
2. Pasul doi vom seta timpul de răspuns pentru a arăta informația despre rețea sau sistemele utilizate în rețea.
3. Pasul dat reprezintă propria mea creație. Aici am folosit proiectul meu care nu se bazeaza pe algoritmii cunoscuți. Pașii următori o să reprezint dezvoltarea muncii mele în teza dată. În primii 3 pași am folosit ceea ce am cunoscut de la alți savanți și algoritmii cunoscuți din surse suplimentare transormați în limbaj de programare. În pasul dat merge afișarea informației din fișierele log și monitorizarea sistemelor din rețea.
4. În acest pas avem posibilitatea de a stoca înformații noi despre alte log fișiere. Vom seta de asemenea pentru fiecare fișier în care timp să fie înoite datele, sau chiar alegem să fie indicate imediat.
5. Vom monitoriza astfel sistemele din rețea și se vor gasi foarte ușor atacurile și erorile care apar in timpul de lucru.
2.6. Testarea softului
Testarea Software reprezintă o investigație empirică realizată cu scopul de a oferi părților interesate informația vizavi de calitatea produsului sau serviciului supus testării, luînd în considerație contextul operațional în care acesta din urma va fi folosit. Testarea Software pune la dispoziție o viziune obiectivă și independentă asupra produsului în dezvoltare, oferind astfel businessului posibilitatea de a înțelege și evalua riscurile asociate cu implementarea produsului soft. Tehnicile de testare includ, dar nu sunt limitate la, procesul de execuție a programului sau aplicației în scopul identificării defectelor/erorilor de software. Testarea Software mai poate fi definită ca un proces de validare și verificare a faptului că un program/aplicație/produs software:
1. Corespunde cerințelor business și cerințelor tehnice care au ghidat proiectarea și implementarea lui;
2. Rulează și se comportă corespunzător așteptărilor.
În dependență de metodologia de testare aleasă, testare Software poate fi implementată la orice etapă în cadrul procesului de dezvoltare, deși partea considerabilă a efortului de testare deobicei este aplicată la etapa de după cizelarea/formalizarea cerințelor și finisarea implementării/codării propriu-zise.
Fig. 2.4. Verificarea erorilor
Defectele software se manifestă ca rezultat al următorului proces: un programator comite o eroare, care la rîndul ei rezultă într-un defect (bug) la nivel de codul sursă al programului; dacă acest defect este executat, în anumite condiții sistemul va produce un rezultat greșit, ceea ce ulterior va duce la o eșuare a programului. Nu toate defectele pot duce la eșuarea programului. De exemplu, defectele ce se conțin într-o secțiune de cod "mort" niciodată nu vor duce la eșuarea programului. Defectele se pot manifesta ca eșuări la schimbarea împrejurimii în care rulează programul. Exemplele de astfel de modificări includ: trecerea pe o platformă hardware nouă, alterări în sursa de date sau interacțiunea cu software diferit. Un singur defect poate rezulta într-un spectru larg de simptome prin care se manifestă căderile.
Deseori aplicațiile software cad din cauza problemelor de compatibilititate cauzate atât de interacțiunea lor cu alte aplicații sau sisteme de operare, cât și de non-conformitățile ce apar de la o versiune a programului la alta într-un proces inceremental de dezvoltare a produsului. Incompatibilitățile ce apar între versiuni se datorează faptului ca la momentul scrierii codului programatorul a considerat, sau a testat, produsul doar pentru un singur sistem de operare (sau un set restrîns de sisteme de operare), fară a lua în calcul problemele ce pot apărea la schimbarea contextului de execuție.
Fig.2.5. Schema de efectuare a verificarilor erorilor
Un rezultat nedorit al acestui fapt poate fi următorul: ultima versiune a programului poate să nu mai fie compatibilă cu acea combinație de software/hardware folosită mai devreme, sau poate să nu mai fie compatibilă cu un careva alt sistem, compatibilitatea cu care este critic de importantă. Deci, testarea de compatibilitate este o "strategie orientată spre prevenire", fapt ce clar o asociază cu ultima din fazele de testare.
Nu toate defectele software sunt cauzate de greșeli în cod. O sursă răspândită de defecte costisitoare sunt lacunele și neclaritățile la nivel de cerințe, de exemplu, cerințele "ascunse" sau incomplete pot să rezulte într-un set de erori introduse încă în faza de proiectare de către designerul programului. Cerințele non-funcționale precum ar fi testabilitatea, scalabilitatea, mentenabilitatea, usabilitatea, performanța și securitatea, sunt o sursă raspândită de astfel de erori.
Fig.2.7. Verificarea erorilor
2.7. Concluzie la capitolul 2
În capitolul dat este introdusă partea practică în comparație cu softurile existente la ora actuală. Este făcută o analiză a unor softuri care sunt pe piață și care și ce probabilitate au pentru îndeplinirea unor sarcini asemănătoare. Aducînd ca date concrete și unde sunt întrebuințate și softurile care au fost contribuite la crearea acestui sistem, avînd fiecare o caracteristică amplă.
În analiza concepției, au fost stabilite cerințele unui algoritm de detectare a erorilor în fișiere de tip log, care urmează a fi implimentat. De asemenea sunt descriși în lux de amănunte pașii de elaborare a softului cuprins de screenshoturi, testarea, avantajele și dezavantajele acestuia.
3. DOCUMENTAȚIA TEHNICĂ A SISTEMULUI „LOG MONITOR”
3.1. Ghidul utilizatorului
În Fig.3.1 dată avem afișat meniul și interfața de bază a softului. Aici este reprezentata interfața de bază și structura lui funcțională. La crearea acestui soft am pus ca scop în primul rînd să îndeplinească toate cerințele temei de licență și ca adăugător să demonstrez că toate componentele sunt funcționale și sunt la nivel superior. Informațiile sunt reprezentate în mai multe component și anume în o imagine ce reprezintă o fotofrafie, sau o imagine care reprezintă locația dată și desigur informația textual care este afișată în component TextArea și cel mai important este faptul ca toate datele sunt selectate din baza de date.
Dificultățile beneficiarilor de software constau în faptul că, în general, dacă reclamațiile asupra produsului, făcute după consumarea actului vânzării, nu sunt cuprinse în garanția expresă și în garanția implicită, ele sunt interpretate ca propuneri de modificare a contractelor de vânzare-cumpărare.
În general, producătorul afirmă că un banal procesor de texte pe care îl vinde, este posibil să nu îndeplinească cele mai elementare operațiuni ale procesării de text, iar acesta nu este responsabil. În termenii de analiză, acest lucru înseamnă cã beneficiarul este pe deplin informat asupra termenilor. Pe piețele nedezvoltate încă, sau în curs de dezvoltare, aceste probleme încă nici nu s-au ridicat. Pe piața americană, datorită dezvoltării comerțului electronic, unde problema repudierii evidente a garanției implicite nu a fost încă clarificată, se fac presiuni deosebite pentru eliminarea acestei cerințe, și propunerile pentru anume softuri.
Un modelul de amenințare este o expresie a așteptărilor referitoare la natura atacatorului și la caracteristicile potențialelor victime. Atacatorii pot fi grupați în următoarele clase:
• Atacatori externi care lansează intruziuni din Internet.
• Atacatori externi care lansează intruziuni din segmente wireless.
• Atacatori interni care lansează intruziuni dintr-un LAN.
• Atacatori interni care lansează intruziuni din segmente wireless.
Abilitatea de a observa victimele pentru diferite tipuri de atac determină și amplasarea platformelor de monitorizare (senzori). Zonele de monitorizare sunt locațiile în care traficul are anumite nivele de privilegiu, stabilite pe baza unui nivel de încredere definit de inginerul de securitate. Aceste trăsături sunt determinate de un dispozitiv de control al accesului, care segmentează traficul în zone diferite. În cazul exemplului de față, dispozitivul de control al accesului este un firewall, care împarte organizația în patru zone distincte: perimetrul, zona demilitarizată (DMZ), zona wireless și intranet. Perimetrul cuprinde zona dintre interfața externă a firewall-ului și ruter-ul de conectare la Internet. Această zonă a reprezentat în mod tradițional locul de amplasare al senzorilor, deoarece oferă cea mai bună vizibilitate asupra amenințărilor externe din Internet. Perimetrul este de asemenea considerat zona cu cel mai scăzut nivel de încredere, deoarece organizația are control limitat asupra stațiilor care inițiază conexiuni către acesta.
Zona demilitarizată cuprinde stațiile conectate la switch-ul DMZ. Senzorii plasați în această zonă vor urmări în mare măsură descoperirea atacurilor împotriva serviciilor uzuale din DMZ (e-mail, web, DNS, FTP, etc), precum și atacuri inițiate din DMZ către alte zone. Produsele de detecție pe baza traficului de rețea oferă un grad de eficiență ridicat în monitorizarea stațiilor DMZ, datorită nivelului scăzut de trafic de zgomot și politicii de securitate relativ simple care guvernează activitatea DMZ. Principala problemă a senzorilor din DMZ o constituie manipularea traficului criptat. Senzorii generici nu pot inspecta conținutul traficului de web ce utilizează criptare SSL, dar există anumite tehnici specializate pentru a oferi vizibilitate la nivel rețea cum ar fi: senzorii cu chei ”escrow”, dispozitive de accelerare a SSL și proxy reverse web.
DMZ reprezintă o rețea cu nivel de încredere mediu, deoarece stațiile sunt sub controlul direct al organizației, dar sunt expuse utilizatorilor din Internet. O bună administrare va limita conectivitatea stațiilor din DMZ către celelalte segmente, în special intranet.
Zona wireless cuprinde toate stațiile cu conectivitate wireless. Stațiile din această zonă au nivel de încredere scăzut, ca și cele din Internet, deoarece oricine aflat în raza de acces a punctului de acces wireless (WAP) se poate conecta în mod teoretic la segmentul wireless. Atacatorii externi din această zonă pot fi grupați în două categorii:
• Utilizatori de servicii fără plată, neautorizați (datorită unei configurări neadecvate).
• Potențiali spioni care doresc acces la informații confidențiale.
Metodele și tehnicile de detecție disponibile pentru această sunt: Airdefense RogueWatch, Airdefense Guard, Snort-Wireless, WIDZ. Strategiile curente vizează detecția atacurilor din această zonă către intranet. Multe organizații au soluții ineficiente pentru protecția clienților din această zonă. În ceea ce privește amenințările externe din Internet, stațiile din zona wireless adesea sunt tratate la fel ca și cele din Intranet.
Organizațiile care amplasează senzori în perimetru au posibilitatea să colecteze informații despre amenințări. Activitatea de scanare și încercările de intruziune eșuate la nivelul firewall-ului pot constitui indicatori pentru viitoare atacuri.
Metodele de detecție bazate pe NIDS vizează în special atacurile lansate din exterior.
În cazul în care este necesară monitorizarea intranetului la nivel rețea, se recomandă următoarele abordări pentru a adresa limitări datorate complexității intranetului și a volumului ridicat de trafic al acestuia:
• Datorită segmentării rețelelor interne și a faptului că în majoritatea cazurilor stațiile de aceeași importanță sunt grupate în același segment, senzorii se pot plasa în aceste subrețele.
• Amplasarea de agenți de colectare pe stațiile critice, care vor transmite traficul către un senzor centralizat.
Această componentă conține informații despre breșe de securitate și combinații de situații care ar putea avea impact asupra securității în general, sau ar putea fi exploatate de un atacator pentru a realiza o intruziune. Formatul bazei de date va trebui sa includă următoarele tipuri de vulnerabilități:
• Vulnerabilități structurale – acestea sunt vulnerabilități interne ale unei aplicații cum ar fi: condiții de concurență (race conditions), buffer overflow, erori de format de șir de caractere, etc. Această parte a bazei de date este cel mai ușor de implementat, și actualizat. Majoritatea acestor procese pot fi automatizate având în vedere că informația este accesibilă prin intermediul subscrierii la anumite liste publice de poștă, sau direct de pe anumite site-uri web unde se găsesc vulnerabilități. În cazul utilizării mai multor surse, este necesară validarea și corelarea acestora de către o echipă abilitată în acest sens.
• Vulnerabilități funcționale – acestea depind în principal de mediul operațional (configurații, condițiile operaționale, utilizatori, etc.). De exemplu, o partiție montată via NFS se consideră a fi vulnerabilitate funcțională în contextul în care atacatorul poate accesa un cont sau sistem care îi permite montarea sistemului de fișiere. De aceea, se poate presupune că există un număr mare de astfel de vulnerabilități în sisteme, dar pot fi considerate ca inactive atât timp cât cel puțin o condiție necesară nu este satisfăcută. Definirea, reprezentarea și actualizarea bazei de date reprezintă o sarcină destul de dificilă pentru această categorie de vulnerabilități, și necesită conlucrarea unor echipe din mai multe domenii (aplicații, sisteme de operare, rețea, baze de date).
Sistemul ne oferă mai multe tipuri de jurnal de evenimente:
Jurnalul de aplicații (Application log) – conține evenimentele înregistrate de programe. De exemplu, un program de baze de date poate înregistra o eroare de fișier în jurnalul de aplicații. Evenimentele ce se scriu în jurnalul de aplicații sunt determinate de dezvoltatorii programului software.
Jurnalul de securitate (Security log) – înregistrează evenimente precum încercările valide și invalide de Log on, precum și evenimentele legate de utilizarea resurselor, cum ar fi crearea, deschiderea sau ștergerea de fișiere.
Jurnalul de sistem (System log) – conține evenimente înregistrate de componentele de sistem. De exemplu, dacă un driver nu reușește să se încarce în timpul pornirii, va fi înregistrat un eveniment în jurnalul de sistem. Sistemele bazate pe platforma Windows determină anticipat evenimentele înregistrate de componentele de sistem.
Este foarte important de menționat că acest soft este unul de importanță majoră. Cu ajutorul tehnologiei de C# eu am elaborate un soft cu baza de date care poate rula pe sisteme de operare Windows elaborate de Microsoft. Acest lucru este foarte important pentru că un produs bun trebuie să fie accesat și folosit de mai multe persoane.
Softul ,,Log Monitor” este creat cu ajutorul noilor tehnologii și este unul de importanță majoră pentru că în zilele noastre toate informațiile se stochează în baze de date. Acesta a fost și un scop de al meu pentru a ajuta procesul de de dezvoltare IT a informațiilor.
În Fig.3.1 este reprezentată interfața softului personal și partea de selectare a informației.
Pașii functionării:
1. În cîmpul dat vom încărca fișierul log care dorim să monitorizăm informația eronată;
2. Vom seta simpul în secunde pentru a ne afișa informația din cât în cât timp să fie inoită datele din fișierele log;
3. Automat din sistem ne va returna toate datele despre fișierul log.
În fereastra dată mai apar și submeniurile:
New Log – funcție ce ne ajută să creăm un tab nou pentur un fișier log în program, de asemenea ne ajută să monitorizăm informațiile necesare.
Open Log – funcție care ne ajută să înlocuim fișierul log deschis la moment.
Close – funcție care ne ajută să închidem fișierul log deschis la moment.
Exit – funcție ce ne ajuta sa părăsim programul.
Este important fapul să menționăm că toate fișierele log care vor fi deschise spre monitorizare vor fi inoite absolut toate conform setarii care de asemenea tot noi o setăm. Adică fiecare fișier log deschis se va afișa în taburi fiecare, care ne va permite simplu să trecem de la unul la altul.
Fig. 3.1. Imaginea inițială
Ceea ce ține de setările pentru monitorizarea fișierelor este de ajuns la tastăm Edit apoi Settings și vom avea deschisă fereastă cu setări care le vom seta, și ulterior dacă vom modifica apoi tasta OK, pentru urmatoarea dată cînd vom rula programul aceste setări vor fi deja setate.
Monitorizăm informația despre fișierul log dorit:
Fig.3.3. Monitorizarea informației din fișiere log
Deshiderea ferestrei unde poate fi setată fișierele log:
Fig.3.2. Fereastra de setare a fișierelor log
3.2. Ghidul programatorului
1. Pentru crearea meniului și interfeței de bază a softului am folosit următorul cod sursă:
// menuStrip
//
this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.fileToolStripMenuItem,
editToolStripMenuItem,
this.viewToolStripMenuItem});
this.menuStrip.Location = new System.Drawing.Point(0, 0);
this.menuStrip.Name = "menuStrip";
this.menuStrip.Size = new System.Drawing.Size(672, 24);
this.menuStrip.TabIndex = 0;
this.menuStrip.Text = "menuStrip";
//
// fileToolStripMenuItem
//
this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
monitorNewLogToolStripMenuItem,
openLogToolStripMenuItem,
this.closeToolStripMenuItem,
exitToolStripMenuItem});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
this.fileToolStripMenuItem.Text = "File";
//
// closeToolStripMenuItem
//
this.closeToolStripMenuItem.Name = "closeToolStripMenuItem";
this.closeToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F4)));
this.closeToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
this.closeToolStripMenuItem.Text = "&Close";
this.closeToolStripMenuItem.ToolTipText = "Close the current tab";
this.closeToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click);
//
// viewToolStripMenuItem
//
this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.nextTabToolStripMenuItem,
this.previousTabToolStripMenuItem});
this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
this.viewToolStripMenuItem.Text = "View";
//
// nextTabToolStripMenuItem
//
this.nextTabToolStripMenuItem.Name = "nextTabToolStripMenuItem";
this.nextTabToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Tab)));
this.nextTabToolStripMenuItem.Size = new System.Drawing.Size(228, 22);
this.nextTabToolStripMenuItem.Text = "&Next Tab";
this.nextTabToolStripMenuItem.ToolTipText = "Display next tab";
this.nextTabToolStripMenuItem.Click += new System.EventHandler(this.nextTabToolStripMenuItem_Click);
//
// previousTabToolStripMenuItem
//
this.previousTabToolStripMenuItem.Name = "previousTabToolStripMenuItem";
this.previousTabToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.Tab)));
this.previousTabToolStripMenuItem.Size = new System.Drawing.Size(228, 22);
this.previousTabToolStripMenuItem.Text = "&Previous Tab";
this.previousTabToolStripMenuItem.ToolTipText = "Display previous tab";
this.previousTabToolStripMenuItem.Click += new System.EventHandler(this.previousTabToolStripMenuItem_Click);
//
// toolStrip1
//
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripButtonNewTab,
this.toolStripButtonOpen,
this.toolStripButtonCopy,
this.toolStripButtonPrev,
this.toolStripButtonNext});
this.toolStrip1.Location = new System.Drawing.Point(0, 24);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(672, 25);
this.toolStrip1.TabIndex = 1;
this.toolStrip1.Text = "toolStrip1";
În meniul „File” apar și submeniurile:
– New Log – funcție care ne ajută să deschidem informație depre fișiere log în program
– Exit- funcție ce ne ajută să părăsim programul.
2. Pentru încărcarea fișierului log am folosit următorul cod-sursă:
/// <summary>
/// Open a file dialog to allow user to select log file to open.
/// </summary>
/// <param name="logControl">The <see cref="LogMonitorControl"/>which will be used to display this file.</param>
private void BrowseForNewLog(LogMonitorControl logControl)
{
LogMonitorTab selectedTab = _tabControl.SelectedTab as LogMonitorTab;
if (null != selectedTab)
{
OpenFileDialog openDialog = new OpenFileDialog();
if (DialogResult.OK == openDialog.ShowDialog(this))
{
logControl.FileName = openDialog.FileName;
selectedTab.Text = Path.GetFileName(logControl.FileName);
}
}
}
3. Cod- sursă pentru monitorizarea unui nou fișier log:
/// <summary>
/// Monitor a new log file.
/// </summary>
/// <param name="fileName">The file to monitor.</param>
/// <remarks>This will add a new tab to the tab control to monitor the given log.</remarks>
private void MonitorNewFile(string fileName)
{
// Create LogMonitorControl
LogMonitorControl logControl = new LogMonitorControl(fileName);
// Sign up for browse event
logControl.BrowseForLogFile += BrowseForNewLogHandler;
// Create new tab
LogMonitorTab newTab = new LogMonitorTab(logControl);
// Setup tab
newTab.Controls.Add(logControl);
newTab.Location = new System.Drawing.Point(4, 22);
newTab.Padding = new System.Windows.Forms.Padding(3);
newTab.Size = new System.Drawing.Size(664, 537);
newTab.TabIndex = 0;
newTab.UseVisualStyleBackColor = true;
// Determine the title of this tab (will be the name of the file if a file is given)
string title = "Load a File";
if (null != fileName) title = Path.GetFileName(fileName);
newTab.Text = title;
newTab.Name = title;
// Setup LogMonitorControl
logControl.Dock = System.Windows.Forms.DockStyle.Fill;
logControl.Location = new System.Drawing.Point(3, 3);
logControl.Name = "_logMonitorControl";
logControl.Size = new System.Drawing.Size(658, 531);
logControl.TabIndex = 0;
// Add this new tab and make it visible
_tabControl.TabPages.Add(newTab);
_tabControl.SelectedIndex = _tabControl.TabPages.Count – 1;
}
4. Ieșirea din program:
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
5. Pentru salvarea informației din fișierele log am folosit următorul cod-sursă:
/// <summary>
/// Allow user to select a new log file to associate with the current tab.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void BrowseForNewLogHandler(object sender, EventArgs args)
{
LogMonitorControl logControl = sender as LogMonitorControl;
if (null == logControl) return; // How did this happen?
BrowseForNewLog(logControl);
}
private void LogMonitor_FormClosing(object sender, FormClosingEventArgs e)
{
// Save the current window position to the configuration file
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings[WIN_POS_KEY].Value =
String.Format("{0},{1},{2},{3}",
Bounds.X.ToString(), Bounds.Y.ToString(), Bounds.Width.ToString(), Bounds.Height.ToString());
config.Save();
}
6. Pentru a crea forma spre setările aiatemului este de ajuns să scrim:
public SettingsForm()
{
InitializeComponent();
// Read current settings from config file
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
bool temp = true;
bool.TryParse(config.AppSettings.Settings[UPDATES_KEY].Value, out temp);
_checkBoxUpdate.Checked = temp;
temp = true;
bool.TryParse(config.AppSettings.Settings[TIMED_UPDATE_KEY].Value, out temp);
_radioButtonTimed.Checked = temp;
_radioButtonImmediate.Checked = !temp;
_textBoxTimeInterval.Text = config.AppSettings.Settings[UPDATE_INTERVAL_KEY].Value;
temp = true;
bool.TryParse(config.AppSettings.Settings[AUTO_SCROLL_KEY].Value, out temp);
_checkBoxAutoScroll.Checked = temp;
EnableButtons();
}
7. Funcția care ne ajută cu setarea timpului:
/// <summary>
/// Enables or disables controls based on the current context.
/// </summary>
private void EnableButtons()
{
if (!_checkBoxUpdate.Checked)
{
_textBoxTimeInterval.Enabled = false;
_radioButtonTimed.Enabled = false;
_radioButtonImmediate.Enabled = false;
}
else
{
_radioButtonTimed.Enabled = true;
_radioButtonImmediate.Enabled = true;
if (_radioButtonTimed.Checked)
{
_textBoxTimeInterval.Enabled = true;
}
else
{
_textBoxTimeInterval.Enabled = false;
}
}
}
8. Funcția care salvează setările:
private void buttonOK_Click(object sender, EventArgs e)
{
// Save new settings to Config file
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings[UPDATES_KEY].Value = _checkBoxUpdate.Checked.ToString();
config.AppSettings.Settings[TIMED_UPDATE_KEY].Value = _radioButtonTimed.Checked.ToString();
config.AppSettings.Settings[UPDATE_INTERVAL_KEY].Value = _textBoxTimeInterval.Text;
config.AppSettings.Settings[AUTO_SCROLL_KEY].Value = _checkBoxAutoScroll.Checked.ToString();
config.Save();
}
9. Codul sursă pentru funcția în care este setată constata pentru timpul spre setar:
private const string UPDATES_KEY = "UpdatesEnabled";
private const string TIMED_UPDATE_KEY = "TimedUpdate";
private const string UPDATE_INTERVAL_KEY = "UpdateInterval";
private const string AUTO_SCROLL_KEY = "AutoScroll";
10. Cod-sursa pentru încărcarea prin drag-drop:
/// <summary>
/// Called when someone drops a file on our application.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tabControl_DragDrop(object sender, DragEventArgs e)
{
// Accept files dropped and create new a tab each file.
IDataObject data = e.Data;
// Only accept file drops
if (data.GetDataPresent(DataFormats.FileDrop))
{
// Get the list of files dropped and create tabs for each
string[] filesToDrop = (string[])e.Data.GetData(DataFormats.FileDrop, false);
for (int idx = 0; idx < filesToDrop.Length; idx++)
{
MonitorNewFile(filesToDrop[idx]);
}
}
}
/// <summary>
/// Called when a user drags an item to be dropped onto our application
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tabControl_DragEnter(object sender, DragEventArgs e)
{
IDataObject data = e.Data;
// Only accept file drops
if (data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
11. Funcția dată reprezintă utilizatorilot de a le oferi posibilitatea de a selecta fișierul log:
/// <summary>
/// Allow user to select a new log file to associate with the current tab.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void BrowseForNewLogHandler(object sender, EventArgs args)
{
LogMonitorControl logControl = sender as LogMonitorControl;
if (null == logControl) return; // How did this happen?
BrowseForNewLog(logControl);
}
private void LogMonitor_FormClosing(object sender, FormClosingEventArgs e)
{
// Save the current window position to the configuration file
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings[WIN_POS_KEY].Value =
String.Format("{0},{1},{2},{3}",
Bounds.X.ToString(), Bounds.Y.ToString(), Bounds.Width.ToString(), Bounds.Height.ToString());
config.Save();
}
12. Funcția dată reprezintă copierea logului ca un clipboard:
< /// <summary>
/// Copy either the current selection or all text in the current tab to the clipboard.
/// </summary>
private void CopySelectedText()
{
LogMonitorTab selectedTab = _tabControl.SelectedTab as LogMonitorTab;
if (null != selectedTab)
{
selectedTab.CopyToClipboard();
}
}
13. Funcția dată reprezintă deschiderea unui fișier log în tab:
/// <summary>
/// Allow user to browse for a log file and open it in the current tab. If no tabs are open then create one.
/// </summary>
private void OpenLogInCurrentTab()
{
LogMonitorTab selectedTab = _tabControl.SelectedTab as LogMonitorTab;
if (null != selectedTab)
{
BrowseForNewLog(selectedTab.LogControl);
}
else
{
OpenLogInNewTab();
}
}
14. Funcția dată reprezintă monitorizarea fișierului log:
/// <summary>
/// Monitor a new log file.
/// </summary>
/// <param name="fileName">The file to monitor.</param>
/// <remarks>This will add a new tab to the tab control to monitor the given log.</remarks>
private void MonitorNewFile(string fileName)
{
// Create LogMonitorControl
LogMonitorControl logControl = new LogMonitorControl(fileName);
// Sign up for browse event
logControl.BrowseForLogFile += BrowseForNewLogHandler;
// Create new tab
LogMonitorTab newTab = new LogMonitorTab(logControl);
// Setup tab
newTab.Controls.Add(logControl);
newTab.Location = new System.Drawing.Point(4, 22);
newTab.Padding = new System.Windows.Forms.Padding(3);
newTab.Size = new System.Drawing.Size(664, 537);
newTab.TabIndex = 0;
newTab.UseVisualStyleBackColor = true;
// Determine the title of this tab (will be the name of the file if a file is given)
string title = "Load a File";
if (null != fileName) title = Path.GetFileName(fileName);
newTab.Text = title;
newTab.Name = title;
// Setup LogMonitorControl
logControl.Dock = System.Windows.Forms.DockStyle.Fill;
logControl.Location = new System.Drawing.Point(3, 3);
logControl.Name = "_logMonitorControl";
logControl.Size = new System.Drawing.Size(658, 531);
logControl.TabIndex = 0;
// Add this new tab and make it visible
_tabControl.TabPages.Add(newTab);
_tabControl.SelectedIndex = _tabControl.TabPages.Count – 1;
}
/// <summary>
/// Allow user to browse for a log file and open it in a new tab.
/// </summary>
private void OpenLogInNewTab()
{
OpenFileDialog openDialog = new OpenFileDialog();
openDialog.Multiselect = true;
if (DialogResult.OK == openDialog.ShowDialog(this))
{
foreach (string fileName in openDialog.FileNames)
{
MonitorNewFile(fileName);
}
}
}
15. Funcția dată reprezintă salvarea datelor în fișiere de configurare:
/// <summary>
/// Load saved settings from Config file.
/// </summary>
private void LoadInitialSettings()
{
string windowPos = ConfigurationManager.AppSettings[WIN_POS_KEY];
// Last window position is stored in a string consisting of 4 values "Left, Top, Width, Height"
string[] parts = windowPos.Split(',');
if (4 == parts.Length)
{
Rectangle startPos = Bounds;
for (int idx = 0; idx < 4; ++idx)
{
int value;
int.TryParse(parts[idx], out value);
switch (idx)
{
case 0: startPos.X = value; break;
case 1: startPos.Y = value; break;
case 2: startPos.Width = value; break;
case 3: startPos.Height = value; break;
}
}
if (0 != startPos.Width && 0 != startPos.Height)
{
// If we had a seemingly valid position then set the window to those settings
StartPosition = FormStartPosition.Manual;
Location = startPos.Location;
Width = startPos.Width;
Height = startPos.Height;
}
}
}
16. Clasa FileSystemWatcher se găsește în spațiul de nume System.IO și este folosit pentru a monitoriza modificări la un fișier sau orice fișier într-un director. Constructorul ia o cale și un model de nume de fișier. Aplicarea LogMonitor apeleaza constructorul cu un nume de fișier pentru modelul de a monitoriza un singur fișier. Suntem interesati in toate evenimentele de schimbare pe care această clasă poate ridica, așa că vă înscrieți pentru toate acestea. Am putea urmări de fapt acest fișier prin renames și continua să monitorizeze fișierul jurnal, dar aleg să păstreze pur și simplu uitam același fișier. Apoi, dacă fișierul este redenumit înapoi, vom detecta acest lucru. În mod similar, dacă un alt fișier este creat cu același nume, care va fi de asemenea detectate. Nu este un lucru care nu este complet evident despre clasa FileSystemWatcher. Asta este, dacă vă înscrieți pentru evenimentele de fișiere pe care nu le va primi dacă nu setați EnableRaisingEvents proprietate de adevărat.
_watcher = new System.IO.FileSystemWatcher(path, baseName);
FileSystemEventHandler handler = new FileSystemEventHandler(watcher_Changed);
_watcher.Changed += handler;
_watcher.Created += handler;
_watcher.Deleted += handler;
_watcher.Renamed += watcher_Renamed;
// Without setting EnableRaisingEvents nothing happens
_watcher.EnableRaisingEvents = true;
3.2. Concluzie la capitolul 3
Capitolul dat cuprinde partea practică în totalmente, caracterizarea softului creat de noi însune, împreună cu screenshoturi pentru a demonstra în parte ce îndeplinește fiecare funcție. De asemenea codul sursă caracterizat în pași ce ajută la efectuarea operațiunii date. Capitolul dat generalizează ideea de bază a întregii lucrări.
Am adus ca dovadă că ceea ce este făcut de alți programatori se poate de făcut și de niște studenți care finisează universitatea. În general putem zice că tot ce am creat corespunde la 100% cu ceea ce se cere în tema tezei.
CONCLUZII GENERALE
Originalitatea tezei de licență pornește de la aplicabilitatea acesteia în plan profesional sau social. Teza de master „Sistem de analiză a log-urilor de secutitate în rețele de calculatoare” reprezintă o lucrare de sinteză executată în baza tuturor cunoștințelor acumulate pe tot parcursul desfășurării studiilor. Aceasta încorporează atît cunoștințele teoretice, cît și cele practice care combinate împreună reprezintă o caracterizare perfectă a modului de funcționare a detectării.
Lucrarea dată cuprinde analiza profundă a tuturor materialelor încadrate din mai multe surse de informație la tema dată de master. A fost făcută o deosebită atenție la toate teoremele de dezvoltare, caracterizarea fiecărui pas, în baza cărora am putea realiza un soft nou.
Internet-ul reprezinta cel mai amplu proiect creat vreodata de civilizatia umana, societatea moderna informationala reprezentând deja o realitate. Început ca un proiect de cercetare în urma cu patru decenii, Internet-ul devine pe zi ce trece o „oglinda” cât mai fidela a societatii umane, multe din relatiile sociale, economice, politice, culturale transpunându-se pe aceasta infrastructura informationala. În aceste circumstante, securitatea informationala a devenit una din componentele majore și vitale pentru buna operare ale Internet-ului.
Securitatea este un proces dinamic care trebuie sa raspunda eficient noilor vulnerabilitati, amenintari, precum si schimbarilor constante care au loc în mediul de operare. O abordare de succes va combina elemente de natura tehnologica, procesuala si umana, prin utilizarea unui proces structurat ce integreaza securitatea informatiei si activitatea de management a riscurilor în ciclul de viata al dezvoltarii sistemelor.
Progresul realizat în zona securizarii tehnologiilor si infrastructurii Internetului a avut ca rezultat o repozitionare a strategiilor utilizate de elementele spatiului de amenintare. Migrarea a tot mai multor aplicatii pe web, inclusiv a celor disponibile pe telefoanele inteligente, precum si disponibilitatea a tot mai multor informatii despre utilizatori pe site-urile de socializare, a creat noi oportunitati pentru atacatori, majoritatea vectorilor de atac folositi în prezent vizând vulnerabilitati în aceste zone.
Este făcută o analiză a unor softuri care sunt pe piață și care și ce probabilitate au pentru îndeplinirea unor sarcini asemănătoare. Aducînd ca date concrete și unde sunt întrebuințate și softurile care au fost contribuite la crearea acestui sistem, avînd fiecare o caracteristică amplă.
În analiza concepției, au fost stabilite cerințele unui algoritm de detectare a contururilor într-o imagine, care urmează a fi implimentat. De asemenea sunt descriși în lux de amănunte pașii de elaborare a softului cuprins de screenshoturi, testarea, avantajele și dezavantajele acestuia.
A fost făcută o caracterizare împreună cu screenshoturi pentru a demonstra fiecare funcție împarte ce îndeplinește și care este codul sursă ce ajută la efectuarea operațiunii date. Am adus ca dovadă că ceea ce este făcut de alți programatori se poate de făcut și de niște studenți care finisează universitatea. În general putem zice că tot ce am creat corespunde la 100% cu ceea ce se cere în tema tezei.
BIBLIOGRAFIE
Acostachioaie D., Cap. 10. Proiectarea si dezvoltarea de aplicatii orientate obiect, http://www.unixinside.org/papers/C++-Book/cap10.html (vizitat 12.05.2014).
Athanasiu I. C# ca limbaj pentru programarea distribuită. București: Matrix Rom, 2000. 236 p.
Bejtlich R. The Tao Of Network Security Monitoring: Beyond Intrusion Detection. Ney York: Addison-Wesley, 2004. 254 p.
Buraga S., Ciobanu G. Atelier de programare în rețele de calculatoare. Iași: Polirom, 2004. 352 p.
Burdescu D., Mihaescu C. Structuri de date și algoritmi. Aplicații. București: SITEH, 2010. 358 p.
Chris M. Network Security Assessment, Second Edition. Dublin: O'Reilly Media, 2007. 483 p.
Connolly T., Begg. C., Strachan A. Baze de date. Proiectare, implementare, gestionare. Bucuresti: Teora, 2001. 450 p.
Cosmina Ivan. Introducere în baze de date relaționale ți obiectuale. București: Roprint, 2007. 973 p.
Cotelea V. Modele și algoritmi de proiectare logică a bazelor de date. Chișinău: ASEM, 2009. 266 p.
Cotelea V., Bulai R., Cotelea M. Interogarea bazelor de date relaționale. Chișinău: UTM, 2011. 72 p.
Counterpane and Network Security Monitoring. http://bt.counterpane.com/presentation2.pdf (vizitat 15.04.2014)
Data Fusion Toolbox. http://bfas.iutlan.univ-rennes1.fr/wiki/index.php/Toolboxs (vizitat 15.04.2014)
Dollinger R. Baze de date și gestiunea tranzacțiilor. Cluj-Napoca: Editura Albastră, 2001. 352 p.
Dollinger R. Utilizarea sistemului SQL. Cluj-Napoca: Editura Albastră, 2001. 342 p.
Fotache M. Proiectarea bazelor de date; Normalizare și postnormalizare, Implementări SQL și Oracle. Iași: POLIROM, 2005. 520 p.
Georgescu H. Programarea concurentă. Teorie și aplicații. București: Editura Tehnică, 2001. 226 p.
Hansman S., Hunt R. A taxonomy of network and computer attacks, Computer and Security. Dublin: Syngress Publishing, 2005. 242 p.
Hernandez Michael J. Proiectarea bazelor de date. București: TEORA, 2003. 440 p.
Honour E., Dalberth P., Kaplan A. Soluții finale la problemele puse de bazele de date în Oracle. București: Teora, 2001. 672 p.
Internet Strom Center. http://isc.sans.org (vizitat 26.04.2014)
Iustin P. Securitatea Poștei Electronice în Internet. București: Editura Academiei Tehnice Militare, 2006. 267 p.
Jacob B. Security Log Management: Identifying Patterns in the Chaos. Dublin: Syngress Publishing, 2006. 372 p.
James P., Anderson C. Computer Security Threat Monitoring and Surveillance. Chicago: Technical Report, 1998. 294 p.
Jim Keogh. C# fără mistere. București: Rosetti Educational, 2006. 390 p.
Jose N. Estonian DDoS Attacks, A summary to date. http://asert.arbornetworks.com/2007/05/estonian-ddos-attacks-a-summary-to-date/ (vizitat 03.05.2014)
Joshua Bloch. C#, ghid practic pentru programatori avansați. București: Teora, 2002. 230 p.
Kathy Sierra, Bert Bates. Atac la C#. București: Teora, 2006. 990 p.
Logofătu Doina. Algoritmi fundamentali în C#. Aplicații. Iași: Polirom, 2007. 264 p.
Logwatch. http://sourceforge.net/projects/logwatch/ (vizitat 03.05.2014)
Lungu, I., Iorga, M., Velicanu, M. Baze de Date – Să învățăm sistemul Oracle în 28 de lecții. București: Editura Economică, 2002. 284 p.
McCarthy N. Network Path Enumeration. http://www.mainnerve.com/lft/ (vizitat 03.05.2014)
Metasploit Framework Penetration Testing Software. http://metasploit.com/ (vizitat 03.05.2014)
Monitor logs with logsurfer. http://www.dankalia.com/tutor/01005/0100501074.htm (vizitat 26.04.2014)
Moraru S., Perniu L. Baze de date în aplicații web. București: Libris, 2004. 230 p.
Nazario J. Future of Internet Worms. http://www.crimelabs.net/docs/worms/worm.pdf (vizitat 13.05.2014)
Nessus Scanner Documentation. http://www.tenable.com/products/nessus/documentation (vizitat 03.05.2014)
Niță A., ș.a. Introducere în .Net Framework, 2008. http://www.scribd.com/doc/55953630/14/Platforma-NET (vizitat 13.05.2014).
Pascu Corina, Pascu Adrian. Totul despre SQL Interogarea bazelor de date. București: Editura Tehnică, 1994. 560 p.
Petcu D., Negru V. Procesare distribuită. Timișoara: Editura Universității de Vest, 2002. 332 p.
Platforma de dezvoltare Mirosoft, Visual Studio 2010: http://www.microsoft.com/visualstudio/en-us/products/2010-editions (vizitat 03.05.2014)
Popescu I. Baze de date relaționale: proiectare și implementare. București: Ed.Universității din București, 1996. 360 p.
Retina CS Management Products. http://www.eeye.com/products/retina/retina-insight (vizitat 23.04.2014)
Sitar T., Dan A. Baze de date distribuite. Cluj-Napoca: Risoprint, 2005. 210 p.
Stanciu V. Proiectarea sistemelor informatice de gestiune. București: Ed. Cison, 2000. 370 p.
Stanciu V. Proiectarea sistemelor informatice, București: Ed. DualTech, 2004. 136 p.
System Log Analysis and Profiling System 2. http://www.openchannelsoftware.com/projects/SLAPS-2/ (vizitat 13.05.2014)
Tanassă St., Olaru C., Andrei St. C# dela 0 la expert. Iași: Polirom, 2004. 832 p.
Tanenbaum S. Rețele de calculatoare. Tg. Mureș: Byblos, 2005. 427 p.
US Department of Energy CIRC, Cyber Incident Response. http://www.doecirc.energy.gov/ (vizitat 23.04.2014)
Vaduva Calin Marin. Programarea în C#. Cluj-Napoca: Editura Albastra, 2004. 320 p.
Velicanu M., Lungu I., Muntean M. Dezvoltarea Aplicațiilor cu Baze de Date în Visual Studio. București: Editura All, 2001. 366 p.
ANEXE
Anexa 1
Listingul softului elaborat
namespace LogMonitor
{
partial class SettingsForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support – do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.Windows.Forms.Label label5;
System.Windows.Forms.Label label1;
this._checkBoxAutoScroll = new System.Windows.Forms.CheckBox();
this._checkBoxUpdate = new System.Windows.Forms.CheckBox();
this._textBoxTimeInterval = new System.Windows.Forms.TextBox();
this._radioButtonTimed = new System.Windows.Forms.RadioButton();
this._radioButtonImmediate = new System.Windows.Forms.RadioButton();
this._buttonOK = new System.Windows.Forms.Button();
this._buttonCancel = new System.Windows.Forms.Button();
label5 = new System.Windows.Forms.Label();
label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// label5
//
label5.AutoSize = true;
label5.Location = new System.Drawing.Point(207, 66);
label5.Name = "label5";
label5.Size = new System.Drawing.Size(47, 13);
label5.TabIndex = 17;
label5.Text = "seconds";
//
// label1
//
label1.AutoSize = true;
label1.Location = new System.Drawing.Point(12, 9);
label1.Name = "label1";
label1.Size = new System.Drawing.Size(303, 13);
label1.TabIndex = 21;
label1.Text = "Enter the settings that will be the defaults for each new log tab.";
//
// _checkBoxAutoScroll
//
this._checkBoxAutoScroll.AutoSize = true;
this._checkBoxAutoScroll.Checked = true;
this._checkBoxAutoScroll.CheckState = System.Windows.Forms.CheckState.Checked;
this._checkBoxAutoScroll.Location = new System.Drawing.Point(10, 87);
this._checkBoxAutoScroll.Name = "_checkBoxAutoScroll";
this._checkBoxAutoScroll.Size = new System.Drawing.Size(170, 17);
this._checkBoxAutoScroll.TabIndex = 20;
this._checkBoxAutoScroll.Text = "Scroll to end with each update";
this._checkBoxAutoScroll.UseVisualStyleBackColor = true;
//
// _checkBoxUpdate
//
this._checkBoxUpdate.AutoSize = true;
this._checkBoxUpdate.Checked = true;
this._checkBoxUpdate.CheckState = System.Windows.Forms.CheckState.Checked;
this._checkBoxUpdate.Location = new System.Drawing.Point(10, 64);
this._checkBoxUpdate.Name = "_checkBoxUpdate";
this._checkBoxUpdate.Size = new System.Drawing.Size(61, 17);
this._checkBoxUpdate.TabIndex = 19;
this._checkBoxUpdate.Text = "Update";
this._checkBoxUpdate.UseVisualStyleBackColor = true;
this._checkBoxUpdate.CheckedChanged += new System.EventHandler(this.checkBoxUpdate_CheckedChanged);
//
// _textBoxTimeInterval
//
this._textBoxTimeInterval.Location = new System.Drawing.Point(162, 63);
this._textBoxTimeInterval.Name = "_textBoxTimeInterval";
this._textBoxTimeInterval.Size = new System.Drawing.Size(39, 20);
this._textBoxTimeInterval.TabIndex = 16;
this._textBoxTimeInterval.Text = "5";
//
// _radioButtonTimed
//
this._radioButtonTimed.AutoSize = true;
this._radioButtonTimed.Checked = true;
this._radioButtonTimed.Location = new System.Drawing.Point(73, 63);
this._radioButtonTimed.Name = "_radioButtonTimed";
this._radioButtonTimed.Size = new System.Drawing.Size(85, 17);
this._radioButtonTimed.TabIndex = 15;
this._radioButtonTimed.TabStop = true;
this._radioButtonTimed.Text = "Check every";
this._radioButtonTimed.UseVisualStyleBackColor = true;
this._radioButtonTimed.CheckedChanged += new System.EventHandler(this.radioButtonTimed_CheckedChanged);
//
// _radioButtonImmediate
//
this._radioButtonImmediate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this._radioButtonImmediate.AutoSize = true;
this._radioButtonImmediate.Location = new System.Drawing.Point(279, 63);
this._radioButtonImmediate.Name = "_radioButtonImmediate";
this._radioButtonImmediate.Size = new System.Drawing.Size(116, 17);
this._radioButtonImmediate.TabIndex = 18;
this._radioButtonImmediate.Text = "Immediate Updates";
this._radioButtonImmediate.UseVisualStyleBackColor = true;
this._radioButtonImmediate.CheckedChanged += new System.EventHandler(this.radioButtonImmediate_CheckedChanged);
//
// _buttonOK
//
this._buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this._buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this._buttonOK.Location = new System.Drawing.Point(15, 131);
this._buttonOK.Name = "_buttonOK";
this._buttonOK.Size = new System.Drawing.Size(75, 23);
this._buttonOK.TabIndex = 22;
this._buttonOK.Text = "OK";
this._buttonOK.UseVisualStyleBackColor = true;
this._buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
//
// _buttonCancel
//
this._buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this._buttonCancel.CausesValidation = false;
this._buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this._buttonCancel.Location = new System.Drawing.Point(306, 131);
this._buttonCancel.Name = "_buttonCancel";
this._buttonCancel.Size = new System.Drawing.Size(75, 23);
this._buttonCancel.TabIndex = 23;
this._buttonCancel.Text = "Cancel";
this._buttonCancel.UseVisualStyleBackColor = true;
//
// SettingsForm
//
this.AcceptButton = this._buttonOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this._buttonCancel;
this.ClientSize = new System.Drawing.Size(405, 170);
this.Controls.Add(this._buttonCancel);
this.Controls.Add(this._buttonOK);
this.Controls.Add(label1);
this.Controls.Add(this._checkBoxAutoScroll);
this.Controls.Add(this._checkBoxUpdate);
this.Controls.Add(label5);
this.Controls.Add(this._textBoxTimeInterval);
this.Controls.Add(this._radioButtonTimed);
this.Controls.Add(this._radioButtonImmediate);
this.Name = "SettingsForm";
this.Text = "Default Settings";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.CheckBox _checkBoxAutoScroll;
private System.Windows.Forms.CheckBox _checkBoxUpdate;
private System.Windows.Forms.TextBox _textBoxTimeInterval;
private System.Windows.Forms.RadioButton _radioButtonTimed;
private System.Windows.Forms.RadioButton _radioButtonImmediate;
private System.Windows.Forms.Button _buttonOK;
private System.Windows.Forms.Button _buttonCancel;
}
}
using System;
using System.Configuration;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace LogMonitor
{
public partial class SettingsForm : Form
{
#region Constants
private const string UPDATES_KEY = "UpdatesEnabled";
private const string TIMED_UPDATE_KEY = "TimedUpdate";
private const string UPDATE_INTERVAL_KEY = "UpdateInterval";
private const string AUTO_SCROLL_KEY = "AutoScroll";
#endregion Constants
public SettingsForm()
{
InitializeComponent();
// Read current settings from config file
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
bool temp = true;
bool.TryParse(config.AppSettings.Settings[UPDATES_KEY].Value, out temp);
_checkBoxUpdate.Checked = temp;
temp = true;
bool.TryParse(config.AppSettings.Settings[TIMED_UPDATE_KEY].Value, out temp);
_radioButtonTimed.Checked = temp;
_radioButtonImmediate.Checked = !temp;
_textBoxTimeInterval.Text = config.AppSettings.Settings[UPDATE_INTERVAL_KEY].Value;
temp = true;
bool.TryParse(config.AppSettings.Settings[AUTO_SCROLL_KEY].Value, out temp);
_checkBoxAutoScroll.Checked = temp;
EnableButtons();
}
#region Methods
/// <summary>
/// Enables or disables controls based on the current context.
/// </summary>
private void EnableButtons()
{
if (!_checkBoxUpdate.Checked)
{
_textBoxTimeInterval.Enabled = false;
_radioButtonTimed.Enabled = false;
_radioButtonImmediate.Enabled = false;
}
else
{
_radioButtonTimed.Enabled = true;
_radioButtonImmediate.Enabled = true;
if (_radioButtonTimed.Checked)
{
_textBoxTimeInterval.Enabled = true;
}
else
{
_textBoxTimeInterval.Enabled = false;
}
}
}
#endregion Methods
#region Event Handlers
private void buttonOK_Click(object sender, EventArgs e)
{
// Save new settings to Config file
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings[UPDATES_KEY].Value = _checkBoxUpdate.Checked.ToString();
config.AppSettings.Settings[TIMED_UPDATE_KEY].Value = _radioButtonTimed.Checked.ToString();
config.AppSettings.Settings[UPDATE_INTERVAL_KEY].Value = _textBoxTimeInterval.Text;
config.AppSettings.Settings[AUTO_SCROLL_KEY].Value = _checkBoxAutoScroll.Checked.ToString();
config.Save();
}
private void checkBoxUpdate_CheckedChanged(object sender, EventArgs e)
{
EnableButtons();
}
private void radioButtonTimed_CheckedChanged(object sender, EventArgs e)
{
if (_radioButtonTimed.Checked)
{
EnableButtons();
}
}
private void radioButtonImmediate_CheckedChanged(object sender, EventArgs e)
{
if (_radioButtonImmediate.Checked)
{
EnableButtons();
}
}
#endregion Event Handlers
}
}
using LogMonitor.UserControls;
namespace LogMonitor
{
partial class LogMonitor
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support – do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem;
System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem;
System.Windows.Forms.ToolStripMenuItem monitorNewLogToolStripMenuItem;
System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
System.Windows.Forms.ToolStripMenuItem openLogToolStripMenuItem;
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LogMonitor));
this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._tabControl = new System.Windows.Forms.TabControl();
this.menuStrip = new System.Windows.Forms.MenuStrip();
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.nextTabToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.previousTabToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.toolStripButtonNewTab = new System.Windows.Forms.ToolStripButton();
this.toolStripButtonOpen = new System.Windows.Forms.ToolStripButton();
this.toolStripButtonCopy = new System.Windows.Forms.ToolStripButton();
this.toolStripButtonPrev = new System.Windows.Forms.ToolStripButton();
this.toolStripButtonNext = new System.Windows.Forms.ToolStripButton();
editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
monitorNewLogToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
openLogToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip.SuspendLayout();
this.toolStrip1.SuspendLayout();
this.SuspendLayout();
//
// editToolStripMenuItem
//
editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
copyToolStripMenuItem,
this.settingsToolStripMenuItem});
editToolStripMenuItem.Name = "editToolStripMenuItem";
editToolStripMenuItem.Size = new System.Drawing.Size(39, 20);
editToolStripMenuItem.Text = "Edit";
//
// copyToolStripMenuItem
//
copyToolStripMenuItem.Name = "copyToolStripMenuItem";
copyToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C)));
copyToolStripMenuItem.Size = new System.Drawing.Size(144, 22);
copyToolStripMenuItem.Text = "&Copy";
copyToolStripMenuItem.ToolTipText = "Copy selected text or entire log file";
copyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem_Click);
//
// settingsToolStripMenuItem
//
this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem";
this.settingsToolStripMenuItem.Size = new System.Drawing.Size(144, 22);
this.settingsToolStripMenuItem.Text = "&Settings";
this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click);
//
// monitorNewLogToolStripMenuItem
//
monitorNewLogToolStripMenuItem.Name = "monitorNewLogToolStripMenuItem";
monitorNewLogToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N)));
monitorNewLogToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
monitorNewLogToolStripMenuItem.Text = "&New Log";
monitorNewLogToolStripMenuItem.ToolTipText = "Load a log file into a new tab";
monitorNewLogToolStripMenuItem.Click += new System.EventHandler(this.monitorNewLogToolStripMenuItem_Click);
//
// exitToolStripMenuItem
//
exitToolStripMenuItem.Name = "exitToolStripMenuItem";
exitToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
exitToolStripMenuItem.Text = "E&xit";
exitToolStripMenuItem.ToolTipText = "Exit Log Monitor";
exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
//
// openLogToolStripMenuItem
//
openLogToolStripMenuItem.Name = "openLogToolStripMenuItem";
openLogToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
openLogToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
openLogToolStripMenuItem.Text = "&Open Log";
openLogToolStripMenuItem.ToolTipText = "Open a new log file in the current tab";
openLogToolStripMenuItem.Click += new System.EventHandler(this.openLogToolStripMenuItem_Click);
//
// _tabControl
//
this._tabControl.AllowDrop = true;
this._tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
this._tabControl.Location = new System.Drawing.Point(0, 49);
this._tabControl.Name = "_tabControl";
this._tabControl.SelectedIndex = 0;
this._tabControl.Size = new System.Drawing.Size(672, 514);
this._tabControl.TabIndex = 2;
this._tabControl.DragDrop += new System.Windows.Forms.DragEventHandler(this.tabControl_DragDrop);
this._tabControl.DragEnter += new System.Windows.Forms.DragEventHandler(this.tabControl_DragEnter);
//
// menuStrip
//
this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.fileToolStripMenuItem,
editToolStripMenuItem,
this.viewToolStripMenuItem});
this.menuStrip.Location = new System.Drawing.Point(0, 0);
this.menuStrip.Name = "menuStrip";
this.menuStrip.Size = new System.Drawing.Size(672, 24);
this.menuStrip.TabIndex = 0;
this.menuStrip.Text = "menuStrip";
//
// fileToolStripMenuItem
//
this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
monitorNewLogToolStripMenuItem,
openLogToolStripMenuItem,
this.closeToolStripMenuItem,
exitToolStripMenuItem});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
this.fileToolStripMenuItem.Text = "File";
//
// closeToolStripMenuItem
//
this.closeToolStripMenuItem.Name = "closeToolStripMenuItem";
this.closeToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F4)));
this.closeToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
this.closeToolStripMenuItem.Text = "&Close";
this.closeToolStripMenuItem.ToolTipText = "Close the current tab";
this.closeToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click);
//
// viewToolStripMenuItem
//
this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.nextTabToolStripMenuItem,
this.previousTabToolStripMenuItem});
this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
this.viewToolStripMenuItem.Text = "View";
//
// nextTabToolStripMenuItem
//
this.nextTabToolStripMenuItem.Name = "nextTabToolStripMenuItem";
this.nextTabToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Tab)));
this.nextTabToolStripMenuItem.Size = new System.Drawing.Size(228, 22);
this.nextTabToolStripMenuItem.Text = "&Next Tab";
this.nextTabToolStripMenuItem.ToolTipText = "Display next tab";
this.nextTabToolStripMenuItem.Click += new System.EventHandler(this.nextTabToolStripMenuItem_Click);
//
// previousTabToolStripMenuItem
//
this.previousTabToolStripMenuItem.Name = "previousTabToolStripMenuItem";
this.previousTabToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.Tab)));
this.previousTabToolStripMenuItem.Size = new System.Drawing.Size(228, 22);
this.previousTabToolStripMenuItem.Text = "&Previous Tab";
this.previousTabToolStripMenuItem.ToolTipText = "Display previous tab";
this.previousTabToolStripMenuItem.Click += new System.EventHandler(this.previousTabToolStripMenuItem_Click);
//
// toolStrip1
//
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripButtonNewTab,
this.toolStripButtonOpen,
this.toolStripButtonCopy,
this.toolStripButtonPrev,
this.toolStripButtonNext});
this.toolStrip1.Location = new System.Drawing.Point(0, 24);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(672, 25);
this.toolStrip1.TabIndex = 1;
this.toolStrip1.Text = "toolStrip1";
//
// toolStripButtonNewTab
//
this.toolStripButtonNewTab.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonNewTab.Image = global::LogMonitor.Properties.Resources.ButtonNew;
this.toolStripButtonNewTab.ImageTransparentColor = System.Drawing.Color.Red;
this.toolStripButtonNewTab.Name = "toolStripButtonNewTab";
this.toolStripButtonNewTab.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonNewTab.Text = "Open Log in a new tab";
this.toolStripButtonNewTab.Click += new System.EventHandler(this.toolStripButtonNewTab_Click);
//
// toolStripButtonOpen
//
this.toolStripButtonOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonOpen.Image = global::LogMonitor.Properties.Resources.ButtonOpen;
this.toolStripButtonOpen.ImageTransparentColor = System.Drawing.Color.Red;
this.toolStripButtonOpen.Name = "toolStripButtonOpen";
this.toolStripButtonOpen.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonOpen.Text = "Open log in current tab";
this.toolStripButtonOpen.Click += new System.EventHandler(this.toolStripButtonOpen_Click);
//
// toolStripButtonCopy
//
this.toolStripButtonCopy.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonCopy.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonCopy.Image")));
this.toolStripButtonCopy.ImageTransparentColor = System.Drawing.Color.Red;
this.toolStripButtonCopy.Name = "toolStripButtonCopy";
this.toolStripButtonCopy.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonCopy.Text = "Copy";
this.toolStripButtonCopy.Click += new System.EventHandler(this.toolStripButtonCopy_Click);
//
// toolStripButtonPrev
//
this.toolStripButtonPrev.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonPrev.Image = global::LogMonitor.Properties.Resources.ButtonPrevTab;
this.toolStripButtonPrev.ImageTransparentColor = System.Drawing.Color.Red;
this.toolStripButtonPrev.Name = "toolStripButtonPrev";
this.toolStripButtonPrev.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonPrev.Text = "Display previous tab";
this.toolStripButtonPrev.Click += new System.EventHandler(this.toolStripButtonPrev_Click);
//
// toolStripButtonNext
//
this.toolStripButtonNext.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonNext.Image = global::LogMonitor.Properties.Resources.ButtonNextTab;
this.toolStripButtonNext.ImageTransparentColor = System.Drawing.Color.Red;
this.toolStripButtonNext.Name = "toolStripButtonNext";
this.toolStripButtonNext.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonNext.Text = "Display next tab";
this.toolStripButtonNext.Click += new System.EventHandler(this.toolStripButtonNext_Click);
//
// LogMonitor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(672, 563);
this.Controls.Add(this._tabControl);
this.Controls.Add(this.toolStrip1);
this.Controls.Add(this.menuStrip);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MainMenuStrip = this.menuStrip;
this.Name = "LogMonitor";
this.Text = "Log Monitor";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LogMonitor_FormClosing);
this.menuStrip.ResumeLayout(false);
this.menuStrip.PerformLayout();
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TabControl _tabControl;
private System.Windows.Forms.MenuStrip menuStrip;
private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem closeToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem;
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripButton toolStripButtonNewTab;
private System.Windows.Forms.ToolStripButton toolStripButtonOpen;
private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem nextTabToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem previousTabToolStripMenuItem;
private System.Windows.Forms.ToolStripButton toolStripButtonPrev;
private System.Windows.Forms.ToolStripButton toolStripButtonNext;
private System.Windows.Forms.ToolStripButton toolStripButtonCopy;
}
}
using System;
using System.Collections.Generic;
using System.Configuration;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using LogMonitor.UserControls;
namespace LogMonitor
{
/// <summary>
/// Main form for the Log Monitor class
/// </summary>
public partial class LogMonitor : Form
{
#region Constants
private const string WIN_POS_KEY = "WindowPosition";
#endregion Constants
/// <summary>
/// Initializes a <see cref="LogMonitor"/>
/// </summary>
/// <param name="initialLogFiles">A list of file names for which tabs will be opened.</param>
public LogMonitor(string[] initialLogFiles)
{
InitializeComponent();
LoadInitialSettings();
if (null == initialLogFiles || 0 == initialLogFiles.Length)
{
MonitorNewFile(null);
}
else
{
foreach (string logName in initialLogFiles)
{
MonitorNewFile(logName);
}
}
}
#region Methods
/// <summary>
/// Load saved settings from Config file.
/// </summary>
private void LoadInitialSettings()
{
string windowPos = ConfigurationManager.AppSettings[WIN_POS_KEY];
// Last window position is stored in a string consisting of 4 values "Left, Top, Width, Height"
string[] parts = windowPos.Split(',');
if (4 == parts.Length)
{
Rectangle startPos = Bounds;
for (int idx = 0; idx < 4; ++idx)
{
int value;
int.TryParse(parts[idx], out value);
switch (idx)
{
case 0: startPos.X = value; break;
case 1: startPos.Y = value; break;
case 2: startPos.Width = value; break;
case 3: startPos.Height = value; break;
}
}
if (0 != startPos.Width && 0 != startPos.Height)
{
// If we had a seemingly valid position then set the window to those settings
StartPosition = FormStartPosition.Manual;
Location = startPos.Location;
Width = startPos.Width;
Height = startPos.Height;
}
}
}
/// <summary>
/// Open a file dialog to allow user to select log file to open.
/// </summary>
/// <param name="logControl">The <see cref="LogMonitorControl"/>which will be used to display this file.</param>
private void BrowseForNewLog(LogMonitorControl logControl)
{
LogMonitorTab selectedTab = _tabControl.SelectedTab as LogMonitorTab;
if (null != selectedTab)
{
OpenFileDialog openDialog = new OpenFileDialog();
if (DialogResult.OK == openDialog.ShowDialog(this))
{
logControl.FileName = openDialog.FileName;
selectedTab.Text = Path.GetFileName(logControl.FileName);
}
}
}
/// <summary>
/// Monitor a new log file.
/// </summary>
/// <param name="fileName">The file to monitor.</param>
/// <remarks>This will add a new tab to the tab control to monitor the given log.</remarks>
private void MonitorNewFile(string fileName)
{
// Create LogMonitorControl
LogMonitorControl logControl = new LogMonitorControl(fileName);
// Sign up for browse event
logControl.BrowseForLogFile += BrowseForNewLogHandler;
// Create new tab
LogMonitorTab newTab = new LogMonitorTab(logControl);
// Setup tab
newTab.Controls.Add(logControl);
newTab.Location = new System.Drawing.Point(4, 22);
newTab.Padding = new System.Windows.Forms.Padding(3);
newTab.Size = new System.Drawing.Size(664, 537);
newTab.TabIndex = 0;
newTab.UseVisualStyleBackColor = true;
// Determine the title of this tab (will be the name of the file if a file is given)
string title = "Load a File";
if (null != fileName) title = Path.GetFileName(fileName);
newTab.Text = title;
newTab.Name = title;
// Setup LogMonitorControl
logControl.Dock = System.Windows.Forms.DockStyle.Fill;
logControl.Location = new System.Drawing.Point(3, 3);
logControl.Name = "_logMonitorControl";
logControl.Size = new System.Drawing.Size(658, 531);
logControl.TabIndex = 0;
// Add this new tab and make it visible
_tabControl.TabPages.Add(newTab);
_tabControl.SelectedIndex = _tabControl.TabPages.Count – 1;
}
/// <summary>
/// Allow user to browse for a log file and open it in a new tab.
/// </summary>
private void OpenLogInNewTab()
{
OpenFileDialog openDialog = new OpenFileDialog();
openDialog.Multiselect = true;
if (DialogResult.OK == openDialog.ShowDialog(this))
{
foreach (string fileName in openDialog.FileNames)
{
MonitorNewFile(fileName);
}
}
}
/// <summary>
/// Allow user to browse for a log file and open it in the current tab. If no tabs are open then create one.
/// </summary>
private void OpenLogInCurrentTab()
{
LogMonitorTab selectedTab = _tabControl.SelectedTab as LogMonitorTab;
if (null != selectedTab)
{
BrowseForNewLog(selectedTab.LogControl);
}
else
{
OpenLogInNewTab();
}
}
/// <summary>
/// Make the next tab active. Will circle around if currently on the last tab.
/// </summary>
private void DisplayNextTab()
{
if (_tabControl.SelectedIndex < _tabControl.TabCount – 1)
{
++_tabControl.SelectedIndex;
}
else
{
_tabControl.SelectedIndex = 0;
}
}
/// <summary>
/// Make the previous tab active. Will circle around if currently on the first tab.
/// </summary>
private void DisplayPreviousTab()
{
if (0 < _tabControl.SelectedIndex)
{
–_tabControl.SelectedIndex;
}
else
{
_tabControl.SelectedIndex = _tabControl.TabCount – 1;
}
}
/// <summary>
/// Copy either the current selection or all text in the current tab to the clipboard.
/// </summary>
private void CopySelectedText()
{
LogMonitorTab selectedTab = _tabControl.SelectedTab as LogMonitorTab;
if (null != selectedTab)
{
selectedTab.CopyToClipboard();
}
}
#endregion Methods
#region Event Handlers
/// <summary>
/// Allow user to select a new log file to associate with the current tab.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void BrowseForNewLogHandler(object sender, EventArgs args)
{
LogMonitorControl logControl = sender as LogMonitorControl;
if (null == logControl) return; // How did this happen?
BrowseForNewLog(logControl);
}
private void LogMonitor_FormClosing(object sender, FormClosingEventArgs e)
{
// Save the current window position to the configuration file
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings[WIN_POS_KEY].Value =
String.Format("{0},{1},{2},{3}",
Bounds.X.ToString(), Bounds.Y.ToString(), Bounds.Width.ToString(), Bounds.Height.ToString());
config.Save();
}
#region Menu/Toolbar Handlers
private void monitorNewLogToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenLogInNewTab();
}
private void toolStripButtonNewTab_Click(object sender, EventArgs e)
{
OpenLogInNewTab();
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
CopySelectedText();
}
private void toolStripButtonCopy_Click(object sender, EventArgs e)
{
CopySelectedText();
}
private void openLogToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenLogInCurrentTab();
}
private void toolStripButtonOpen_Click(object sender, EventArgs e)
{
OpenLogInCurrentTab();
}
private void closeToolStripMenuItem_Click(object sender, EventArgs e)
{
LogMonitorTab selectedTab = _tabControl.SelectedTab as LogMonitorTab;
if (null != selectedTab)
{
_tabControl.TabPages.Remove(selectedTab);
selectedTab.Dispose();
}
}
private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
{
SettingsForm form = new SettingsForm();
form.ShowDialog();
}
private void previousTabToolStripMenuItem_Click(object sender, EventArgs e)
{
DisplayPreviousTab();
}
private void toolStripButtonPrev_Click(object sender, EventArgs e)
{
DisplayPreviousTab();
}
private void nextTabToolStripMenuItem_Click(object sender, EventArgs e)
{
DisplayNextTab();
}
private void toolStripButtonNext_Click(object sender, EventArgs e)
{
DisplayNextTab();
}
#endregion Menu/Toolbar Handlers
#region Drop Support
/// <summary>
/// Called when someone drops a file on our application.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tabControl_DragDrop(object sender, DragEventArgs e)
{
// Accept files dropped and create new a tab each file.
IDataObject data = e.Data;
// Only accept file drops
if (data.GetDataPresent(DataFormats.FileDrop))
{
// Get the list of files dropped and create tabs for each
string[] filesToDrop = (string[])e.Data.GetData(DataFormats.FileDrop, false);
for (int idx = 0; idx < filesToDrop.Length; idx++)
{
MonitorNewFile(filesToDrop[idx]);
}
}
}
/// <summary>
/// Called when a user drags an item to be dropped onto our application
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tabControl_DragEnter(object sender, DragEventArgs e)
{
IDataObject data = e.Data;
// Only accept file drops
if (data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
#endregion Drop Support
#endregion Event Handlers
}
}
BIBLIOGRAFIE
Acostachioaie D., Cap. 10. Proiectarea si dezvoltarea de aplicatii orientate obiect, http://www.unixinside.org/papers/C++-Book/cap10.html (vizitat 12.05.2014).
Athanasiu I. C# ca limbaj pentru programarea distribuită. București: Matrix Rom, 2000. 236 p.
Bejtlich R. The Tao Of Network Security Monitoring: Beyond Intrusion Detection. Ney York: Addison-Wesley, 2004. 254 p.
Buraga S., Ciobanu G. Atelier de programare în rețele de calculatoare. Iași: Polirom, 2004. 352 p.
Burdescu D., Mihaescu C. Structuri de date și algoritmi. Aplicații. București: SITEH, 2010. 358 p.
Chris M. Network Security Assessment, Second Edition. Dublin: O'Reilly Media, 2007. 483 p.
Connolly T., Begg. C., Strachan A. Baze de date. Proiectare, implementare, gestionare. Bucuresti: Teora, 2001. 450 p.
Cosmina Ivan. Introducere în baze de date relaționale ți obiectuale. București: Roprint, 2007. 973 p.
Cotelea V. Modele și algoritmi de proiectare logică a bazelor de date. Chișinău: ASEM, 2009. 266 p.
Cotelea V., Bulai R., Cotelea M. Interogarea bazelor de date relaționale. Chișinău: UTM, 2011. 72 p.
Counterpane and Network Security Monitoring. http://bt.counterpane.com/presentation2.pdf (vizitat 15.04.2014)
Data Fusion Toolbox. http://bfas.iutlan.univ-rennes1.fr/wiki/index.php/Toolboxs (vizitat 15.04.2014)
Dollinger R. Baze de date și gestiunea tranzacțiilor. Cluj-Napoca: Editura Albastră, 2001. 352 p.
Dollinger R. Utilizarea sistemului SQL. Cluj-Napoca: Editura Albastră, 2001. 342 p.
Fotache M. Proiectarea bazelor de date; Normalizare și postnormalizare, Implementări SQL și Oracle. Iași: POLIROM, 2005. 520 p.
Georgescu H. Programarea concurentă. Teorie și aplicații. București: Editura Tehnică, 2001. 226 p.
Hansman S., Hunt R. A taxonomy of network and computer attacks, Computer and Security. Dublin: Syngress Publishing, 2005. 242 p.
Hernandez Michael J. Proiectarea bazelor de date. București: TEORA, 2003. 440 p.
Honour E., Dalberth P., Kaplan A. Soluții finale la problemele puse de bazele de date în Oracle. București: Teora, 2001. 672 p.
Internet Strom Center. http://isc.sans.org (vizitat 26.04.2014)
Iustin P. Securitatea Poștei Electronice în Internet. București: Editura Academiei Tehnice Militare, 2006. 267 p.
Jacob B. Security Log Management: Identifying Patterns in the Chaos. Dublin: Syngress Publishing, 2006. 372 p.
James P., Anderson C. Computer Security Threat Monitoring and Surveillance. Chicago: Technical Report, 1998. 294 p.
Jim Keogh. C# fără mistere. București: Rosetti Educational, 2006. 390 p.
Jose N. Estonian DDoS Attacks, A summary to date. http://asert.arbornetworks.com/2007/05/estonian-ddos-attacks-a-summary-to-date/ (vizitat 03.05.2014)
Joshua Bloch. C#, ghid practic pentru programatori avansați. București: Teora, 2002. 230 p.
Kathy Sierra, Bert Bates. Atac la C#. București: Teora, 2006. 990 p.
Logofătu Doina. Algoritmi fundamentali în C#. Aplicații. Iași: Polirom, 2007. 264 p.
Logwatch. http://sourceforge.net/projects/logwatch/ (vizitat 03.05.2014)
Lungu, I., Iorga, M., Velicanu, M. Baze de Date – Să învățăm sistemul Oracle în 28 de lecții. București: Editura Economică, 2002. 284 p.
McCarthy N. Network Path Enumeration. http://www.mainnerve.com/lft/ (vizitat 03.05.2014)
Metasploit Framework Penetration Testing Software. http://metasploit.com/ (vizitat 03.05.2014)
Monitor logs with logsurfer. http://www.dankalia.com/tutor/01005/0100501074.htm (vizitat 26.04.2014)
Moraru S., Perniu L. Baze de date în aplicații web. București: Libris, 2004. 230 p.
Nazario J. Future of Internet Worms. http://www.crimelabs.net/docs/worms/worm.pdf (vizitat 13.05.2014)
Nessus Scanner Documentation. http://www.tenable.com/products/nessus/documentation (vizitat 03.05.2014)
Niță A., ș.a. Introducere în .Net Framework, 2008. http://www.scribd.com/doc/55953630/14/Platforma-NET (vizitat 13.05.2014).
Pascu Corina, Pascu Adrian. Totul despre SQL Interogarea bazelor de date. București: Editura Tehnică, 1994. 560 p.
Petcu D., Negru V. Procesare distribuită. Timișoara: Editura Universității de Vest, 2002. 332 p.
Platforma de dezvoltare Mirosoft, Visual Studio 2010: http://www.microsoft.com/visualstudio/en-us/products/2010-editions (vizitat 03.05.2014)
Popescu I. Baze de date relaționale: proiectare și implementare. București: Ed.Universității din București, 1996. 360 p.
Retina CS Management Products. http://www.eeye.com/products/retina/retina-insight (vizitat 23.04.2014)
Sitar T., Dan A. Baze de date distribuite. Cluj-Napoca: Risoprint, 2005. 210 p.
Stanciu V. Proiectarea sistemelor informatice de gestiune. București: Ed. Cison, 2000. 370 p.
Stanciu V. Proiectarea sistemelor informatice, București: Ed. DualTech, 2004. 136 p.
System Log Analysis and Profiling System 2. http://www.openchannelsoftware.com/projects/SLAPS-2/ (vizitat 13.05.2014)
Tanassă St., Olaru C., Andrei St. C# dela 0 la expert. Iași: Polirom, 2004. 832 p.
Tanenbaum S. Rețele de calculatoare. Tg. Mureș: Byblos, 2005. 427 p.
US Department of Energy CIRC, Cyber Incident Response. http://www.doecirc.energy.gov/ (vizitat 23.04.2014)
Vaduva Calin Marin. Programarea în C#. Cluj-Napoca: Editura Albastra, 2004. 320 p.
Velicanu M., Lungu I., Muntean M. Dezvoltarea Aplicațiilor cu Baze de Date în Visual Studio. București: Editura All, 2001. 366 p.
ANEXE
Anexa 1
Listingul softului elaborat
namespace LogMonitor
{
partial class SettingsForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support – do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.Windows.Forms.Label label5;
System.Windows.Forms.Label label1;
this._checkBoxAutoScroll = new System.Windows.Forms.CheckBox();
this._checkBoxUpdate = new System.Windows.Forms.CheckBox();
this._textBoxTimeInterval = new System.Windows.Forms.TextBox();
this._radioButtonTimed = new System.Windows.Forms.RadioButton();
this._radioButtonImmediate = new System.Windows.Forms.RadioButton();
this._buttonOK = new System.Windows.Forms.Button();
this._buttonCancel = new System.Windows.Forms.Button();
label5 = new System.Windows.Forms.Label();
label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// label5
//
label5.AutoSize = true;
label5.Location = new System.Drawing.Point(207, 66);
label5.Name = "label5";
label5.Size = new System.Drawing.Size(47, 13);
label5.TabIndex = 17;
label5.Text = "seconds";
//
// label1
//
label1.AutoSize = true;
label1.Location = new System.Drawing.Point(12, 9);
label1.Name = "label1";
label1.Size = new System.Drawing.Size(303, 13);
label1.TabIndex = 21;
label1.Text = "Enter the settings that will be the defaults for each new log tab.";
//
// _checkBoxAutoScroll
//
this._checkBoxAutoScroll.AutoSize = true;
this._checkBoxAutoScroll.Checked = true;
this._checkBoxAutoScroll.CheckState = System.Windows.Forms.CheckState.Checked;
this._checkBoxAutoScroll.Location = new System.Drawing.Point(10, 87);
this._checkBoxAutoScroll.Name = "_checkBoxAutoScroll";
this._checkBoxAutoScroll.Size = new System.Drawing.Size(170, 17);
this._checkBoxAutoScroll.TabIndex = 20;
this._checkBoxAutoScroll.Text = "Scroll to end with each update";
this._checkBoxAutoScroll.UseVisualStyleBackColor = true;
//
// _checkBoxUpdate
//
this._checkBoxUpdate.AutoSize = true;
this._checkBoxUpdate.Checked = true;
this._checkBoxUpdate.CheckState = System.Windows.Forms.CheckState.Checked;
this._checkBoxUpdate.Location = new System.Drawing.Point(10, 64);
this._checkBoxUpdate.Name = "_checkBoxUpdate";
this._checkBoxUpdate.Size = new System.Drawing.Size(61, 17);
this._checkBoxUpdate.TabIndex = 19;
this._checkBoxUpdate.Text = "Update";
this._checkBoxUpdate.UseVisualStyleBackColor = true;
this._checkBoxUpdate.CheckedChanged += new System.EventHandler(this.checkBoxUpdate_CheckedChanged);
//
// _textBoxTimeInterval
//
this._textBoxTimeInterval.Location = new System.Drawing.Point(162, 63);
this._textBoxTimeInterval.Name = "_textBoxTimeInterval";
this._textBoxTimeInterval.Size = new System.Drawing.Size(39, 20);
this._textBoxTimeInterval.TabIndex = 16;
this._textBoxTimeInterval.Text = "5";
//
// _radioButtonTimed
//
this._radioButtonTimed.AutoSize = true;
this._radioButtonTimed.Checked = true;
this._radioButtonTimed.Location = new System.Drawing.Point(73, 63);
this._radioButtonTimed.Name = "_radioButtonTimed";
this._radioButtonTimed.Size = new System.Drawing.Size(85, 17);
this._radioButtonTimed.TabIndex = 15;
this._radioButtonTimed.TabStop = true;
this._radioButtonTimed.Text = "Check every";
this._radioButtonTimed.UseVisualStyleBackColor = true;
this._radioButtonTimed.CheckedChanged += new System.EventHandler(this.radioButtonTimed_CheckedChanged);
//
// _radioButtonImmediate
//
this._radioButtonImmediate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this._radioButtonImmediate.AutoSize = true;
this._radioButtonImmediate.Location = new System.Drawing.Point(279, 63);
this._radioButtonImmediate.Name = "_radioButtonImmediate";
this._radioButtonImmediate.Size = new System.Drawing.Size(116, 17);
this._radioButtonImmediate.TabIndex = 18;
this._radioButtonImmediate.Text = "Immediate Updates";
this._radioButtonImmediate.UseVisualStyleBackColor = true;
this._radioButtonImmediate.CheckedChanged += new System.EventHandler(this.radioButtonImmediate_CheckedChanged);
//
// _buttonOK
//
this._buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this._buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this._buttonOK.Location = new System.Drawing.Point(15, 131);
this._buttonOK.Name = "_buttonOK";
this._buttonOK.Size = new System.Drawing.Size(75, 23);
this._buttonOK.TabIndex = 22;
this._buttonOK.Text = "OK";
this._buttonOK.UseVisualStyleBackColor = true;
this._buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
//
// _buttonCancel
//
this._buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this._buttonCancel.CausesValidation = false;
this._buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this._buttonCancel.Location = new System.Drawing.Point(306, 131);
this._buttonCancel.Name = "_buttonCancel";
this._buttonCancel.Size = new System.Drawing.Size(75, 23);
this._buttonCancel.TabIndex = 23;
this._buttonCancel.Text = "Cancel";
this._buttonCancel.UseVisualStyleBackColor = true;
//
// SettingsForm
//
this.AcceptButton = this._buttonOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this._buttonCancel;
this.ClientSize = new System.Drawing.Size(405, 170);
this.Controls.Add(this._buttonCancel);
this.Controls.Add(this._buttonOK);
this.Controls.Add(label1);
this.Controls.Add(this._checkBoxAutoScroll);
this.Controls.Add(this._checkBoxUpdate);
this.Controls.Add(label5);
this.Controls.Add(this._textBoxTimeInterval);
this.Controls.Add(this._radioButtonTimed);
this.Controls.Add(this._radioButtonImmediate);
this.Name = "SettingsForm";
this.Text = "Default Settings";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.CheckBox _checkBoxAutoScroll;
private System.Windows.Forms.CheckBox _checkBoxUpdate;
private System.Windows.Forms.TextBox _textBoxTimeInterval;
private System.Windows.Forms.RadioButton _radioButtonTimed;
private System.Windows.Forms.RadioButton _radioButtonImmediate;
private System.Windows.Forms.Button _buttonOK;
private System.Windows.Forms.Button _buttonCancel;
}
}
using System;
using System.Configuration;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace LogMonitor
{
public partial class SettingsForm : Form
{
#region Constants
private const string UPDATES_KEY = "UpdatesEnabled";
private const string TIMED_UPDATE_KEY = "TimedUpdate";
private const string UPDATE_INTERVAL_KEY = "UpdateInterval";
private const string AUTO_SCROLL_KEY = "AutoScroll";
#endregion Constants
public SettingsForm()
{
InitializeComponent();
// Read current settings from config file
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
bool temp = true;
bool.TryParse(config.AppSettings.Settings[UPDATES_KEY].Value, out temp);
_checkBoxUpdate.Checked = temp;
temp = true;
bool.TryParse(config.AppSettings.Settings[TIMED_UPDATE_KEY].Value, out temp);
_radioButtonTimed.Checked = temp;
_radioButtonImmediate.Checked = !temp;
_textBoxTimeInterval.Text = config.AppSettings.Settings[UPDATE_INTERVAL_KEY].Value;
temp = true;
bool.TryParse(config.AppSettings.Settings[AUTO_SCROLL_KEY].Value, out temp);
_checkBoxAutoScroll.Checked = temp;
EnableButtons();
}
#region Methods
/// <summary>
/// Enables or disables controls based on the current context.
/// </summary>
private void EnableButtons()
{
if (!_checkBoxUpdate.Checked)
{
_textBoxTimeInterval.Enabled = false;
_radioButtonTimed.Enabled = false;
_radioButtonImmediate.Enabled = false;
}
else
{
_radioButtonTimed.Enabled = true;
_radioButtonImmediate.Enabled = true;
if (_radioButtonTimed.Checked)
{
_textBoxTimeInterval.Enabled = true;
}
else
{
_textBoxTimeInterval.Enabled = false;
}
}
}
#endregion Methods
#region Event Handlers
private void buttonOK_Click(object sender, EventArgs e)
{
// Save new settings to Config file
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings[UPDATES_KEY].Value = _checkBoxUpdate.Checked.ToString();
config.AppSettings.Settings[TIMED_UPDATE_KEY].Value = _radioButtonTimed.Checked.ToString();
config.AppSettings.Settings[UPDATE_INTERVAL_KEY].Value = _textBoxTimeInterval.Text;
config.AppSettings.Settings[AUTO_SCROLL_KEY].Value = _checkBoxAutoScroll.Checked.ToString();
config.Save();
}
private void checkBoxUpdate_CheckedChanged(object sender, EventArgs e)
{
EnableButtons();
}
private void radioButtonTimed_CheckedChanged(object sender, EventArgs e)
{
if (_radioButtonTimed.Checked)
{
EnableButtons();
}
}
private void radioButtonImmediate_CheckedChanged(object sender, EventArgs e)
{
if (_radioButtonImmediate.Checked)
{
EnableButtons();
}
}
#endregion Event Handlers
}
}
using LogMonitor.UserControls;
namespace LogMonitor
{
partial class LogMonitor
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support – do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem;
System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem;
System.Windows.Forms.ToolStripMenuItem monitorNewLogToolStripMenuItem;
System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
System.Windows.Forms.ToolStripMenuItem openLogToolStripMenuItem;
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LogMonitor));
this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._tabControl = new System.Windows.Forms.TabControl();
this.menuStrip = new System.Windows.Forms.MenuStrip();
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.nextTabToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.previousTabToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.toolStripButtonNewTab = new System.Windows.Forms.ToolStripButton();
this.toolStripButtonOpen = new System.Windows.Forms.ToolStripButton();
this.toolStripButtonCopy = new System.Windows.Forms.ToolStripButton();
this.toolStripButtonPrev = new System.Windows.Forms.ToolStripButton();
this.toolStripButtonNext = new System.Windows.Forms.ToolStripButton();
editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
monitorNewLogToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
openLogToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip.SuspendLayout();
this.toolStrip1.SuspendLayout();
this.SuspendLayout();
//
// editToolStripMenuItem
//
editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
copyToolStripMenuItem,
this.settingsToolStripMenuItem});
editToolStripMenuItem.Name = "editToolStripMenuItem";
editToolStripMenuItem.Size = new System.Drawing.Size(39, 20);
editToolStripMenuItem.Text = "Edit";
//
// copyToolStripMenuItem
//
copyToolStripMenuItem.Name = "copyToolStripMenuItem";
copyToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C)));
copyToolStripMenuItem.Size = new System.Drawing.Size(144, 22);
copyToolStripMenuItem.Text = "&Copy";
copyToolStripMenuItem.ToolTipText = "Copy selected text or entire log file";
copyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem_Click);
//
// settingsToolStripMenuItem
//
this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem";
this.settingsToolStripMenuItem.Size = new System.Drawing.Size(144, 22);
this.settingsToolStripMenuItem.Text = "&Settings";
this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click);
//
// monitorNewLogToolStripMenuItem
//
monitorNewLogToolStripMenuItem.Name = "monitorNewLogToolStripMenuItem";
monitorNewLogToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N)));
monitorNewLogToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
monitorNewLogToolStripMenuItem.Text = "&New Log";
monitorNewLogToolStripMenuItem.ToolTipText = "Load a log file into a new tab";
monitorNewLogToolStripMenuItem.Click += new System.EventHandler(this.monitorNewLogToolStripMenuItem_Click);
//
// exitToolStripMenuItem
//
exitToolStripMenuItem.Name = "exitToolStripMenuItem";
exitToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
exitToolStripMenuItem.Text = "E&xit";
exitToolStripMenuItem.ToolTipText = "Exit Log Monitor";
exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
//
// openLogToolStripMenuItem
//
openLogToolStripMenuItem.Name = "openLogToolStripMenuItem";
openLogToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
openLogToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
openLogToolStripMenuItem.Text = "&Open Log";
openLogToolStripMenuItem.ToolTipText = "Open a new log file in the current tab";
openLogToolStripMenuItem.Click += new System.EventHandler(this.openLogToolStripMenuItem_Click);
//
// _tabControl
//
this._tabControl.AllowDrop = true;
this._tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
this._tabControl.Location = new System.Drawing.Point(0, 49);
this._tabControl.Name = "_tabControl";
this._tabControl.SelectedIndex = 0;
this._tabControl.Size = new System.Drawing.Size(672, 514);
this._tabControl.TabIndex = 2;
this._tabControl.DragDrop += new System.Windows.Forms.DragEventHandler(this.tabControl_DragDrop);
this._tabControl.DragEnter += new System.Windows.Forms.DragEventHandler(this.tabControl_DragEnter);
//
// menuStrip
//
this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.fileToolStripMenuItem,
editToolStripMenuItem,
this.viewToolStripMenuItem});
this.menuStrip.Location = new System.Drawing.Point(0, 0);
this.menuStrip.Name = "menuStrip";
this.menuStrip.Size = new System.Drawing.Size(672, 24);
this.menuStrip.TabIndex = 0;
this.menuStrip.Text = "menuStrip";
//
// fileToolStripMenuItem
//
this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
monitorNewLogToolStripMenuItem,
openLogToolStripMenuItem,
this.closeToolStripMenuItem,
exitToolStripMenuItem});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
this.fileToolStripMenuItem.Text = "File";
//
// closeToolStripMenuItem
//
this.closeToolStripMenuItem.Name = "closeToolStripMenuItem";
this.closeToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F4)));
this.closeToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
this.closeToolStripMenuItem.Text = "&Close";
this.closeToolStripMenuItem.ToolTipText = "Close the current tab";
this.closeToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click);
//
// viewToolStripMenuItem
//
this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.nextTabToolStripMenuItem,
this.previousTabToolStripMenuItem});
this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
this.viewToolStripMenuItem.Text = "View";
//
// nextTabToolStripMenuItem
//
this.nextTabToolStripMenuItem.Name = "nextTabToolStripMenuItem";
this.nextTabToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Tab)));
this.nextTabToolStripMenuItem.Size = new System.Drawing.Size(228, 22);
this.nextTabToolStripMenuItem.Text = "&Next Tab";
this.nextTabToolStripMenuItem.ToolTipText = "Display next tab";
this.nextTabToolStripMenuItem.Click += new System.EventHandler(this.nextTabToolStripMenuItem_Click);
//
// previousTabToolStripMenuItem
//
this.previousTabToolStripMenuItem.Name = "previousTabToolStripMenuItem";
this.previousTabToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.Tab)));
this.previousTabToolStripMenuItem.Size = new System.Drawing.Size(228, 22);
this.previousTabToolStripMenuItem.Text = "&Previous Tab";
this.previousTabToolStripMenuItem.ToolTipText = "Display previous tab";
this.previousTabToolStripMenuItem.Click += new System.EventHandler(this.previousTabToolStripMenuItem_Click);
//
// toolStrip1
//
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripButtonNewTab,
this.toolStripButtonOpen,
this.toolStripButtonCopy,
this.toolStripButtonPrev,
this.toolStripButtonNext});
this.toolStrip1.Location = new System.Drawing.Point(0, 24);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(672, 25);
this.toolStrip1.TabIndex = 1;
this.toolStrip1.Text = "toolStrip1";
//
// toolStripButtonNewTab
//
this.toolStripButtonNewTab.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonNewTab.Image = global::LogMonitor.Properties.Resources.ButtonNew;
this.toolStripButtonNewTab.ImageTransparentColor = System.Drawing.Color.Red;
this.toolStripButtonNewTab.Name = "toolStripButtonNewTab";
this.toolStripButtonNewTab.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonNewTab.Text = "Open Log in a new tab";
this.toolStripButtonNewTab.Click += new System.EventHandler(this.toolStripButtonNewTab_Click);
//
// toolStripButtonOpen
//
this.toolStripButtonOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonOpen.Image = global::LogMonitor.Properties.Resources.ButtonOpen;
this.toolStripButtonOpen.ImageTransparentColor = System.Drawing.Color.Red;
this.toolStripButtonOpen.Name = "toolStripButtonOpen";
this.toolStripButtonOpen.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonOpen.Text = "Open log in current tab";
this.toolStripButtonOpen.Click += new System.EventHandler(this.toolStripButtonOpen_Click);
//
// toolStripButtonCopy
//
this.toolStripButtonCopy.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonCopy.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonCopy.Image")));
this.toolStripButtonCopy.ImageTransparentColor = System.Drawing.Color.Red;
this.toolStripButtonCopy.Name = "toolStripButtonCopy";
this.toolStripButtonCopy.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonCopy.Text = "Copy";
this.toolStripButtonCopy.Click += new System.EventHandler(this.toolStripButtonCopy_Click);
//
// toolStripButtonPrev
//
this.toolStripButtonPrev.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonPrev.Image = global::LogMonitor.Properties.Resources.ButtonPrevTab;
this.toolStripButtonPrev.ImageTransparentColor = System.Drawing.Color.Red;
this.toolStripButtonPrev.Name = "toolStripButtonPrev";
this.toolStripButtonPrev.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonPrev.Text = "Display previous tab";
this.toolStripButtonPrev.Click += new System.EventHandler(this.toolStripButtonPrev_Click);
//
// toolStripButtonNext
//
this.toolStripButtonNext.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonNext.Image = global::LogMonitor.Properties.Resources.ButtonNextTab;
this.toolStripButtonNext.ImageTransparentColor = System.Drawing.Color.Red;
this.toolStripButtonNext.Name = "toolStripButtonNext";
this.toolStripButtonNext.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonNext.Text = "Display next tab";
this.toolStripButtonNext.Click += new System.EventHandler(this.toolStripButtonNext_Click);
//
// LogMonitor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(672, 563);
this.Controls.Add(this._tabControl);
this.Controls.Add(this.toolStrip1);
this.Controls.Add(this.menuStrip);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MainMenuStrip = this.menuStrip;
this.Name = "LogMonitor";
this.Text = "Log Monitor";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LogMonitor_FormClosing);
this.menuStrip.ResumeLayout(false);
this.menuStrip.PerformLayout();
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TabControl _tabControl;
private System.Windows.Forms.MenuStrip menuStrip;
private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem closeToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem;
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripButton toolStripButtonNewTab;
private System.Windows.Forms.ToolStripButton toolStripButtonOpen;
private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem nextTabToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem previousTabToolStripMenuItem;
private System.Windows.Forms.ToolStripButton toolStripButtonPrev;
private System.Windows.Forms.ToolStripButton toolStripButtonNext;
private System.Windows.Forms.ToolStripButton toolStripButtonCopy;
}
}
using System;
using System.Collections.Generic;
using System.Configuration;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using LogMonitor.UserControls;
namespace LogMonitor
{
/// <summary>
/// Main form for the Log Monitor class
/// </summary>
public partial class LogMonitor : Form
{
#region Constants
private const string WIN_POS_KEY = "WindowPosition";
#endregion Constants
/// <summary>
/// Initializes a <see cref="LogMonitor"/>
/// </summary>
/// <param name="initialLogFiles">A list of file names for which tabs will be opened.</param>
public LogMonitor(string[] initialLogFiles)
{
InitializeComponent();
LoadInitialSettings();
if (null == initialLogFiles || 0 == initialLogFiles.Length)
{
MonitorNewFile(null);
}
else
{
foreach (string logName in initialLogFiles)
{
MonitorNewFile(logName);
}
}
}
#region Methods
/// <summary>
/// Load saved settings from Config file.
/// </summary>
private void LoadInitialSettings()
{
string windowPos = ConfigurationManager.AppSettings[WIN_POS_KEY];
// Last window position is stored in a string consisting of 4 values "Left, Top, Width, Height"
string[] parts = windowPos.Split(',');
if (4 == parts.Length)
{
Rectangle startPos = Bounds;
for (int idx = 0; idx < 4; ++idx)
{
int value;
int.TryParse(parts[idx], out value);
switch (idx)
{
case 0: startPos.X = value; break;
case 1: startPos.Y = value; break;
case 2: startPos.Width = value; break;
case 3: startPos.Height = value; break;
}
}
if (0 != startPos.Width && 0 != startPos.Height)
{
// If we had a seemingly valid position then set the window to those settings
StartPosition = FormStartPosition.Manual;
Location = startPos.Location;
Width = startPos.Width;
Height = startPos.Height;
}
}
}
/// <summary>
/// Open a file dialog to allow user to select log file to open.
/// </summary>
/// <param name="logControl">The <see cref="LogMonitorControl"/>which will be used to display this file.</param>
private void BrowseForNewLog(LogMonitorControl logControl)
{
LogMonitorTab selectedTab = _tabControl.SelectedTab as LogMonitorTab;
if (null != selectedTab)
{
OpenFileDialog openDialog = new OpenFileDialog();
if (DialogResult.OK == openDialog.ShowDialog(this))
{
logControl.FileName = openDialog.FileName;
selectedTab.Text = Path.GetFileName(logControl.FileName);
}
}
}
/// <summary>
/// Monitor a new log file.
/// </summary>
/// <param name="fileName">The file to monitor.</param>
/// <remarks>This will add a new tab to the tab control to monitor the given log.</remarks>
private void MonitorNewFile(string fileName)
{
// Create LogMonitorControl
LogMonitorControl logControl = new LogMonitorControl(fileName);
// Sign up for browse event
logControl.BrowseForLogFile += BrowseForNewLogHandler;
// Create new tab
LogMonitorTab newTab = new LogMonitorTab(logControl);
// Setup tab
newTab.Controls.Add(logControl);
newTab.Location = new System.Drawing.Point(4, 22);
newTab.Padding = new System.Windows.Forms.Padding(3);
newTab.Size = new System.Drawing.Size(664, 537);
newTab.TabIndex = 0;
newTab.UseVisualStyleBackColor = true;
// Determine the title of this tab (will be the name of the file if a file is given)
string title = "Load a File";
if (null != fileName) title = Path.GetFileName(fileName);
newTab.Text = title;
newTab.Name = title;
// Setup LogMonitorControl
logControl.Dock = System.Windows.Forms.DockStyle.Fill;
logControl.Location = new System.Drawing.Point(3, 3);
logControl.Name = "_logMonitorControl";
logControl.Size = new System.Drawing.Size(658, 531);
logControl.TabIndex = 0;
// Add this new tab and make it visible
_tabControl.TabPages.Add(newTab);
_tabControl.SelectedIndex = _tabControl.TabPages.Count – 1;
}
/// <summary>
/// Allow user to browse for a log file and open it in a new tab.
/// </summary>
private void OpenLogInNewTab()
{
OpenFileDialog openDialog = new OpenFileDialog();
openDialog.Multiselect = true;
if (DialogResult.OK == openDialog.ShowDialog(this))
{
foreach (string fileName in openDialog.FileNames)
{
MonitorNewFile(fileName);
}
}
}
/// <summary>
/// Allow user to browse for a log file and open it in the current tab. If no tabs are open then create one.
/// </summary>
private void OpenLogInCurrentTab()
{
LogMonitorTab selectedTab = _tabControl.SelectedTab as LogMonitorTab;
if (null != selectedTab)
{
BrowseForNewLog(selectedTab.LogControl);
}
else
{
OpenLogInNewTab();
}
}
/// <summary>
/// Make the next tab active. Will circle around if currently on the last tab.
/// </summary>
private void DisplayNextTab()
{
if (_tabControl.SelectedIndex < _tabControl.TabCount – 1)
{
++_tabControl.SelectedIndex;
}
else
{
_tabControl.SelectedIndex = 0;
}
}
/// <summary>
/// Make the previous tab active. Will circle around if currently on the first tab.
/// </summary>
private void DisplayPreviousTab()
{
if (0 < _tabControl.SelectedIndex)
{
–_tabControl.SelectedIndex;
}
else
{
_tabControl.SelectedIndex = _tabControl.TabCount – 1;
}
}
/// <summary>
/// Copy either the current selection or all text in the current tab to the clipboard.
/// </summary>
private void CopySelectedText()
{
LogMonitorTab selectedTab = _tabControl.SelectedTab as LogMonitorTab;
if (null != selectedTab)
{
selectedTab.CopyToClipboard();
}
}
#endregion Methods
#region Event Handlers
/// <summary>
/// Allow user to select a new log file to associate with the current tab.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void BrowseForNewLogHandler(object sender, EventArgs args)
{
LogMonitorControl logControl = sender as LogMonitorControl;
if (null == logControl) return; // How did this happen?
BrowseForNewLog(logControl);
}
private void LogMonitor_FormClosing(object sender, FormClosingEventArgs e)
{
// Save the current window position to the configuration file
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings[WIN_POS_KEY].Value =
String.Format("{0},{1},{2},{3}",
Bounds.X.ToString(), Bounds.Y.ToString(), Bounds.Width.ToString(), Bounds.Height.ToString());
config.Save();
}
#region Menu/Toolbar Handlers
private void monitorNewLogToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenLogInNewTab();
}
private void toolStripButtonNewTab_Click(object sender, EventArgs e)
{
OpenLogInNewTab();
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
CopySelectedText();
}
private void toolStripButtonCopy_Click(object sender, EventArgs e)
{
CopySelectedText();
}
private void openLogToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenLogInCurrentTab();
}
private void toolStripButtonOpen_Click(object sender, EventArgs e)
{
OpenLogInCurrentTab();
}
private void closeToolStripMenuItem_Click(object sender, EventArgs e)
{
LogMonitorTab selectedTab = _tabControl.SelectedTab as LogMonitorTab;
if (null != selectedTab)
{
_tabControl.TabPages.Remove(selectedTab);
selectedTab.Dispose();
}
}
private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
{
SettingsForm form = new SettingsForm();
form.ShowDialog();
}
private void previousTabToolStripMenuItem_Click(object sender, EventArgs e)
{
DisplayPreviousTab();
}
private void toolStripButtonPrev_Click(object sender, EventArgs e)
{
DisplayPreviousTab();
}
private void nextTabToolStripMenuItem_Click(object sender, EventArgs e)
{
DisplayNextTab();
}
private void toolStripButtonNext_Click(object sender, EventArgs e)
{
DisplayNextTab();
}
#endregion Menu/Toolbar Handlers
#region Drop Support
/// <summary>
/// Called when someone drops a file on our application.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tabControl_DragDrop(object sender, DragEventArgs e)
{
// Accept files dropped and create new a tab each file.
IDataObject data = e.Data;
// Only accept file drops
if (data.GetDataPresent(DataFormats.FileDrop))
{
// Get the list of files dropped and create tabs for each
string[] filesToDrop = (string[])e.Data.GetData(DataFormats.FileDrop, false);
for (int idx = 0; idx < filesToDrop.Length; idx++)
{
MonitorNewFile(filesToDrop[idx]);
}
}
}
/// <summary>
/// Called when a user drags an item to be dropped onto our application
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tabControl_DragEnter(object sender, DragEventArgs e)
{
IDataObject data = e.Data;
// Only accept file drops
if (data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
#endregion Drop Support
#endregion Event Handlers
}
}
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Sistem de Analiza a Log Urilor de Securitate In Retele de Calculatoare (ID: 150460)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
