Wim Caudenbergh Ilco Vermeulen Jarrik Nys Wouter Mouton 3 Toegepaste informatica, reeks 6 Eindwerk Wireless België Monitoring
i
Inhoudsopgave 1 Inleiding
1
2 Het Project
2
3 De 3.1 3.2 3.3
3 3 4 4
server Debian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ubuntu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Problemen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 Wireless Opstelling 4.1 VPN . . . . . . . 4.2 MikroTik . . . . 4.3 Ubiquity . . . . . 4.4 Access Point . . .
. . . .
5 5 5 5 5
5 SNMP 5.1 Waarom SNMP gebruiken . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 OID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6 6 6
6 Munin 6.1 Standaard plugins 6.2 Custom plugins . . 6.3 Graph types . . . . 6.4 Eigen plugins . . . 6.5 Problemen . . . . . 6.6 Oplossing . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
7 7 7 7 7 8 9
7 Scripts 7.1 Discovery script . 7.2 Curl Script . . . 7.3 CCQ script . . . 7.4 Installatie script
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
10 10 16 18 19
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
8 Database
22
9 Locatiebepaling 9.1 ophalen locaties van devices . . . . . 9.2 Pagina . . . . . . . . . . . . . . . . . 9.3 Ophalen van locaties uit de database 9.4 Markers op de map plaatsen . . . . . 9.5 Resultaat . . . . . . . . . . . . . . . 9.6 Uiteindelijke pagina . . . . . . . . .
ii
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
24 24 24 25 26 27 27
10 Back-up
29
11 Presentatie 30 11.1 Voorbereidingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 11.2 Presentatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 12 Slotwoord
31
13 Bronnen
32
14 Bijlagen 14.1 Presentatie in PDF . . . . . . . . . . . . . 14.2 ApiNeighborDiscovery.pl . . . . . . . . . . 14.3 CheckScripts.pl . . . . . . . . . . . . . . . 14.4 createDB.sql . . . . . . . . . . . . . . . . . 14.5 dbScriptje.pm . . . . . . . . . . . . . . . . 14.6 fetch_Curl_nanostations.pl . . . . . . . . 14.7 installatieScript.sh . . . . . . . . . . . . . 14.8 lijstje.pl . . . . . . . . . . . . . . . . . . . 14.9 LongitudeLatitude.pl . . . . . . . . . . . . 14.10MaakScripts.pl . . . . . . . . . . . . . . . 14.11MacsPerAPFinale.pl . . . . . . . . . . . . 14.12mail_notificatie_wireless_clients.pl . . . 14.13MuninFuncties.pm . . . . . . . . . . . . . 14.14NeighborDiscoveryTest1.pl . . . . . . . . . 14.15NeighborDiscoveryTest2.pl . . . . . . . . . 14.16NeighborDiscoveryTest3.pl . . . . . . . . . 14.17snmp-getbulk.pl . . . . . . . . . . . . . . . 14.18snmpneighbors.pl . . . . . . . . . . . . . . 14.19snmpneighbors2.pl . . . . . . . . . . . . . 14.20snmpwalkloop.pl . . . . . . . . . . . . . . 14.21snmp_CCQ_10.96.6.15.pl . . . . . . . . . 14.22snmp_Curl_AantalMacsPerMode.pl . . . 14.23snmp_Curl_Ccq.pl . . . . . . . . . . . . . 14.24snmp_Curl_Distance.pl . . . . . . . . . . 14.25snmp_Curl_SignalStrength.pl . . . . . . 14.26snmp_Curl_TxRx.pl . . . . . . . . . . . . 14.27snmp_download2vreemdenanostations.pl . 14.28snmp_MikroTikMetWifi_CCQ.pl . . . . 14.29snmp_MikroTikMetWifi_CCQ2.pl . . . . 14.30snmp_MikroTikMetWifi_TxRx.pl . . . . 14.31snmp_MikroTikMetWifi_WifiStats.pl . . 14.32snmp_MikroTik_Voltage.pl . . . . . . . . 14.33snmp_SignalStrengthPerApPerMac.pl . .
iii
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33 33 67 70 71 72 78 80 82 83 84 86 88 89 92 93 95 98 99 101 103 104 105 107 108 109 110 112 113 115 116 117 118 119
14.34VendorDef.pl . 14.35VendorSchaal.pl 14.36werkend.pl . . . 14.37zoekinfo.pl . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
iv
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
121 122 123 125
1 Inleiding Wij Ilco Vermeulen, Jarrik Nys, Wim Caudenberg en Wouter Mouton zijn laatste jaars studenten van de opleiding toegepaste informatica uit de afstudeerrichting Systeem- en Netwerkbeheer van de Katholieke Hogeschool Leuven en hebben ervoor gekozen om ons eindwerk te doen rond Monitoring van Wireless België. De startfase van ons eindwerk is vrij moeilijk verlopen. Dit kwam vooral door een initieel verkeerde keuze van project voor ons eindwerk. We hadden namelijk eerst gekozen voor een project van meneer Geens dat draaide rond het vernieuwen van het virtuele systeem die met ’Wolk’ gepaard gaat. Na het krijgen van de initiële uitleg van meneer Geens hadden we het gevoel dat het project niet in lijn lag met de weg die we wilden uitgaan voor ons eindwerk. Na deze korte fase hebben we besloten om verder op zoek te gaan naar een project dat dichter zou aansluiten bij onze interesses en verwachtingen. Zo zijn we uiteindelijk op het project van meneer Maes gestoten, dit is een project ronde de monitoring van Wireless België.
1
2 Het Project Het onderwerp van ons project is ’Monitoring van het Wireless België netwerk’ geworden. Dit is een initiatief mede mogelijk gemaakt door één van onze lectoren, de heer Maes. Het doel van wireless België is, met behulp van zendmasten, gratis draadloze internetverbinding te voorzien voor iedereen in België. Hierbij focussen ze zich vooral op grootsteden, openbare evenementen als festivals, feestzalen en armere wijken waar het voor vele mensen vaak moeilijker is aan voor hun betaalbaar internet te geraken. Het project heeft een core-team van een 7-tal personen, maar ze zijn in een periode van expansie en het initiatief wint ook steeds aan populariteit. Concreet gesproken is ons gevraagd geweest om software, scripts, ... te schrijven voor dit netwerk die bepaalde dingen die interessant zijn om te weten te monitoren. Hierbij gaat het dan om aantal users op het netwerk, throughput van de devices, locatie van de devices, etc. Van deze gegevens kunnen dan ook met behulp van enkele programma’s overzichtelijke grafieken gegenereerd worden.
2
3 De server Bij aanvang van ons project zijn we begonnen met het opstellen, installeren en configureren van een server. Op deze server zou een monitoring programma moeten draaien. Om een juiste keuze te kunnen maken voor het monitoring programma hebben we ervoor gekosze om meerdere monitoring programma’s te testen zoals ’Cacti’ en ’Munin’. Na het uitvoeren van deze testen hebben we ervoor gekozen om ’Munin’ te gebruiken. Vervolgens hebben we bij elke installatie van de sever met ’Munin’ telkens verschillende packages geïnstalleerd om ons eindwerk tot een goed einde te kunnen brengen. De geïnstalleerde packages zijn: • • • • • • • • •
ssh; apache2; mysql-server mysql-client; munin munin-node; snmp; snmpd; unzip; make; libcurl4-gnutls-dev.
Naast deze packages hebben we ook gebruik gemaakt van verschillende Perl-libraries. Deze libraries waren nodig om onze zelfgemaakte en geïmporteerde scripts succesvol te laten runnen. De geïmporteerde scripts zijn: • • • • • • • • • • • •
IO::Socket::PortState; Net::MAC::Vendor; Data::OptList; Email::Date::Format; MIME::Lite; MIME::Types; Net::SNMP; Params::Util; Sub::Exporter; Sub::Install; WWW::Curl::Easy; WWW::Curl::Form.
3.1 Debian In onze start-setup hebben we gekozen voor een Debian-server, in de stable squeeze versie. We kozen voor Debian omdat we hier al enige ervaring mee hadden en hier hadden we ook al een image van beschikbaar.
3
Na eerste testen werd het duidelijk dat de keuze voor Debian niet zo’n goed idee was. Zo bleek na vele pogingen om Munin op onze Debian server werkende te krijgen niet zo evident te zijn. Ook zou deze software ’out-of-the-box’ normaal gezien moeten werken.
3.2 Ubuntu Vervolgens hebben we op aanraden van meneer Geens ervoor gekozen om te werken met Ubuntu. Hier werkte alle software die normaal ’out-of-the-box’ zou moeten werken zonder problemen. We hebben ervoor gekozen om de server zonder GUI te installeren. Dit omdat we hier toch geen nood aan hebben en aangezien we alles op onze eigen laptop kunnen testen, door gebruik van SSH en gewoon te surfen naar onze apache.
3.3 Problemen Omdat we de nieuwste versie van Munin wilden gebruiken en niet de versie die standaard geïnstalleerd wordt als je apt-get install doet op Ubuntu moesten we onze sources.list aanpassen. We hebben op internet gezocht achter een recentere sources.list zodanig dat we de recenste versie van munin konden gebruiken. Dit was op aanraden van meneer Geens omdat deze versie meer mogelijkheden biedt. Een ander probleem hadden we met onze nameserver. We hadden deze fixed ingesteld voor ons project. Maar soms kon het plots gebeuren dat hij zelf ging zoeken achter een nameserver en overschreef met onze ingestelde nameserver. Uiteraard was dit niet onze bedoeling en hebben we dan ook volgend pakket verwijderd om dit op te lossen: resolvconf. Na de deinstallatie van dit pakket werd de nameserver niet meer automatisch gezet dus bleef onze manueel ingestelde nameserver staan.
4
4 Wireless Opstelling Om het netwerk van ’Wireless België’ beter te begrijpen hebben we een testopstelling gemaakt in het netwerk lokaal. Om deze opstelling te maken kregen we een MikroTik device zonder wireless interface en twee Ubiquity NanoStation M5’s. Om onze testopstelling te verbinden met het ’Wireless België’-netwerk is ons testnetwerk doorgepatched naar de draadloze antenne op het dak van GT. Zo was het mogelijk om aan alle toestallen op het netwerk te kunnen en deze dus te monitorren. Vervolgens kregen we het 10.98.250.192/28 subnet zodat het mogelijk is om onze networkdevices een IP te geven zodat deze via Wireless België bereikbaar zijn.
4.1 VPN In eerste instantie hebben we gebruik gemaakt van een VPN-opstelling om op ons subnet te verbinden zodat we op al onze network-devices konden geraken. Om deze VPN tot stand te kunnen brengen hebben we gebruik gemaakt van het programma OpenVPN in combinatie met een self-signed certificate. We hebben gekozen voor OpenVPN omdat het Mikrotik device standaard gebruik kan maken van OpenVPN.
4.2 MikroTik In ons netwerk hebben we gebruik gemaakt één MikroTik device, draaiende op RouterOS. Dit is een switch met routing functionaliteit waar we door middel van een webinterface of command line mee kunnen verbinden. Over het gehele Wireless België netwerk zijn er nog een groot aantal van deze devices terug te vinden. Het grootste deel van de MikroTik-bakjes hebben een guest user genaamd api_user met een gekend password. Deze kan gebruikt worden om via SSH of de MikroTik-API remote in te loggen op de apparaten.
4.3 Ubiquity Ook hebben we twee wireless antennes, de Nanostation M5’s, gekregen om in onze opstelling te gebruiken. De ene hiervan staat in ’station-mode’ en de andere in ’acces point-mode’. Deze staan in point-to-point verbinding met elkaar, en moeten recht naar elkaar gericht staan. Dit is ook hoe het Wireless België netwerk in elkaar zit. Ook hierop kunnen we weer inloggen en gegevens over de devices aanpassen/verkrijgen.
4.4 Access Point Om eenvoudiger te kunnen inloggen op ons eigen opgestelde testnetwerk hebben we ervoor gekozen om een Wireless Acces Point te configureren. Zo was het niet meer verplicht om op in de schoollokalen gebruik te maken van onze opgestelde VPN-tunnel dien enkel bleek te werken op Linux computers.
5
5 SNMP SNMP staat voor Simple Network Management Protocol, dit is een manier om gegevens op te vragen uit een device. Om SNMP-queries uit te voeren moet er niet ingelogd worden op een device; het is enkel nodig dat SNMP enabled is. Dit heeft als grote voordeel dat de bevraagde toestellen minder CPU kracht verliezen aan niet essentiele taken.
5.1 Waarom SNMP gebruiken In het Wireless België netwerk zijn er verschillende soorten devices als de wireless Nanostations, Mikrotiks, ... Al deze apparaten (of toch het grootste deel ervan) hebben SNMP enabled staan. Omdat we niet steeds wilden inloggen op alle devices en de overhead te verminderen gebruiken we dus SNMP. Door de devices te proben met SNMP-query’s kunnen we informatie als signaalsterkte en aantal neighbors verkrijgen. Deze gegevens kunnen we dan weer meegeven aan Munin die deze zal omzetten in duidelijke grafieken. Het nadeel van SNMP is dat het niet echt kan gebruikt worden om grote hoeveelheden data te versturen. Ook de beveiliging is niet wat het moet zijn bij SNMP v1 en v2. Dit zijn juist de versies die deze aparaten gebruiken. Maar we gaan er van uit dat de data niet privé is dus hoeven we ons daar geen zorgen over te maken. Bij het gebruik van SNMP v3 is het mogelijk authenticatie en encryptie te gebruiken. Hierbij wordt dan meestal ook het SET commando ingeschakeld waarmee men dan zelf values kan aanpassen.
5.2 OID Om gebruik te maken van de SNMP-functies als SNMPwalk en SNMPget hadden we natuurlijk de OID’s of Object Identifiers nodig van onze devices. Van de MikroTik devices was er een overzichtelijke lijst beschikbaar waar alle OID’s duidelijk in tree-structuur leesbaar waren. Deze konden we direct gebruiken om informatie van de bakjes te verkrijgen. Van de Nanostations was dit iets minder voor de hand liggend. Hier was nergens een duidelijK OID-list van te vinden. Dit kwam grotendeels neer op trial-and-error wat wel een tijdsrovend proces was. Uiteindelijk hebben we toch enkele OID’s kunnen vinden die nuttige informatie opleverden.
6
6 Munin We hebben ervoor gekozen om als monitoring tool Munin te gebruiken. Dit maakt aan de hand van scripts grafieken aan. Standaard voert Munin aan de hand van een cronjob elke 5 minuten alle pluginscripts uit. Hierbij moet men wel rekening houden dat de looptijd van alle scripts tesamen niet boven de 5 minuten komt; Dit zou kunnen leiden tot grote problemen op het netwerk.
6.1 Standaard plugins Standaard maakt Munin al enkele grafieken aan. Dit zijn grafieken als disk-utilisation en Apache-processes. Met deze grafieken zijn we echter niet veel voor ons project, dus moesten we onze eigen plugins zien te schrijven.
6.2 Custom plugins Voor onze eigen plugins hebben we ons kunnen baseren op de plugins die standaard in Munin zitten. Zo konden we achterhalen hoe de grafieken juist getekend worden en via de site van Munin konden we ook nog enkele extra opties vinden. Aan Munin moet men steeds enkele values meegeven waarop de grafiek gebaseerd zal zijn. Door gebruik te maken van SNMP (zie boven) konden we gegevens achterhalen die interessanter zouden zijn om op een grafiek weer te geven.
6.3 Graph types Munin kan verschillende soorten grafieken tekenen. Er zijn : • Line-graphs; • Area-graphs; • Stack-graphs; Men moet steeds bekijken welk soort graph voor welke informatie de meest overzichtelijke weergave geeft. Soms is het duidelijker de lijnen cumulatief op elkaar te ’stapelen’, terwijl het in andere situaties weer overzichtelijker is de lijnen door elkaar te laten lopen.
6.4 Eigen plugins Een groot deel van ons eindwerk bestond uit het schrijven van eigen plugin. Het heeft wel even geduurd tegen dat we doorhadden hoe dit in zijn werk ging. Maar eens dat de eerste plugin dan geschreven was en werkte ging het steeds vlotter om de volgende plugins te maken. We hebben verschillende soorten van functies gebruikt voor de plugins. Bij onze eerste plugin gaven we de ip-adressen waarvan we een grafiek wilde gewoon mee in een array. Vervolgens zijn we gaan zien om deze vanuit een .txt file in te lezen. Uiteindelijk is het ons ook gelukt om onze plugins te koppelen met een database. Door tijdsgebrek
7
hebben we wel niet al onze plugins kunnen herschrijven zodanig dat ze samen werken met onze database. Maar de laatste nieuwe plugins die we geschreven hebben werken allemaal samen met onze tabellen uit de database. Naar het einde toe zijn we ook meer en meer gebruik gaan maken van fucncties omdat we merkten dat we steeds dezelfde code aan het schrijven waren voor bijvoorbeeld de grafiek te tekenen en dit kan niet de bedoeling zijn. Dus hiervoor zijn functies wel heel handig. We hebben ervoor gekozen om al onze plugins in perl te schrijven. Omdat we al wat ervaring hadden met perl leek dit ons een goede keuze. Achteraf gebleken was dit ook een goede keuze. Perl biedt veel mogelijkheden en we hebben alles kunnen doen wat we wouden. Als laatste plugins hebben we ons bezig gehouden met vendors. Aan het begin van een MAC-adres kan je namelijk zien of het een apple apparaat is of een dell enz. Het leek ons wel interessant om eens te kijken welke apparaten het meeste voorkwamen op het wireless belgium netwerk. We dachten eerst zelf alle codes en bijhorende vendor in een database te steken tot we op het idee kwamen om eens te zien of er geen perl library bestond en jawel ze bestond. We hebben er dan ook voor gekozen om deze library te gebruiken. Hieronder geef ik enkele voorbeelden van de grafieken die we zoal zelf hebben gemaakt. • • • • • • •
CCQ; Download; Upload; Signal strength; TxRx; Venors; ...
6.5 Problemen Met munin zijn we verschillende kleinere problemen tegen gekomen,d ie we meestal wel hebben kunnen oplossen. Soms vergde dit echter wel heel wat opzoekwerk. Maar er is 1 probleem dat we hier willen uitlichten; van dit probleem hebben we namelijk het meeste last gehad. Bij bepaalde snmp queries liep munin vast omdat hij een time out kreeg. Hierdoor kreeg munin zijn werk niet meer gedaan. We hebben dan geprobeerd om munin niet elke 5 minuten te laten lopen maar elk uur. Dit bleek geen oplossing te zijn omdat de munin-run maar 2 minuten nodig had. Het probleem was gewoon dat er sommige IP adressen geen antwoord gaven op de SNMP query omdat snmp daar niet aanstond.
8
6.6 Oplossing We hebben een script geschreven dat alle IP adressen afgaat en degene waar hij geen antwoord krijgt op de snmp query, gaat verwijderen. Zodanig dat er alleen maar plugins overblijven die wel antwoorden op snmp querys. Dit heeft als voordeel dat onze munin wel gaat werken zonder problemen. 1
#!/usr/bin/env perl
2 3 4
use lib ("/etc/scripts"); require dbScriptje;
5 6
dbScriptje::ConnectToMySql();
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
@range=("96","97","98"); foreach $r(@range) { @ips=dbScriptje::returnMikroWirelessEnabledIpRange($r);; foreach $ip(@ips) { print $ip; print "\t"; $out = ‘perl /etc/munin/plugins/snmp_CCQ_$ip.pl‘; @splits = split("\n",$out); if($splits[6] eq "a.value ") { print "slecht en verwijderd"; print "\n"; $verwijder = ‘rm /etc/munin/plugins/snmp_CCQ_$ip.pl‘; } else { print "goed"; print "\n"; } } @ips=(); }
9
7 Scripts Tijdens het project hebben we verschillende scripts gemaakt, de meeste zijn Perl scripts en maken gebruik van libraries. Deze libraries hebben we al eerder op-gelijst. Daarnaast maken we ook nog gebruik van een bashscript, dat is ons installatiescript. Alle scripts staan bij de bijlagen, zie 14.
7.1 Discovery script Het wireless Belgium netwerk is zeer uitgebreid en heeft, zoals de naam al zegt, nodes over heel België. We hadden een manier nodig om de IP-adressen (en eventueel bijkomende info) over alle nodes op het netwerk te verzamelen. Nmap leek voor ons eerst de meest voor de hand liggende keuze, omdat we bepaalde subnetten wisten waarin we op zoek moesten gaan naar de devices. Hierbij stootten we echt op een probleem : Het waren namelijk 5 /16-netwerken. Deze allemaal afscannen zou aanzienlijk wat tijd kosten; al zeker omdat we deze scan meermaas per dag moesten uitvoeren om te kijken of er al dan niet nieuwe devices op het netwerk waren bijgekomen. We zijn dan op zoek gegaan naar alternatieven voor Nmap die we eventueel zelf zouden kunnen scripten. Belangrijke factor hiervoor was dat alle nodes op het netwerk intern een neighbour-list bijhouden. We hadden dus een manier nodig om aan deze list te geraken zodat we recursief steeds dezelfde functie zouden kunnen uitvoeren voor alle ip-adressen in de neighbour list. Hiervoor hebben we 3 oplossingen gevonden die ons wel valabel leken, namelijk : • Inloggen op elk device via SSH; • Gebruik maken van de Perl-API voor MikroTik-devices; • Gebruik maken van SNMP-query’s; Dit inloggen op de devices was voor ons mogelijk doordat we gebruik maakten van een guest-account user die op alle devices hetzelfde was. We hebben verschillende manieren uitgetest omdat we niet wisten welk uiteindelijk de snelste manier ging zijn en hoe we het netwerk het minst konden belasten. Uiteindelijk was de beste oplossing wel overduidelijk. Allereerst hebben we een script geschreven dat via SSH op alle devices van het netwerk ging inloggen om zo de neighbour-list op te roepen. Dit zag er als volgend uit : 1 2
#!/usr/bin/perl
3
10
use Net::SSH::Perl;
4 5 6 7 8 9 10
sub zoekNeighbors { my $host = "$_[0]"; my $user = ’api_user’; my $pass = ’api_user_pass’; my $cmd = ’/ip neighbor print’;
11
my $ssh = new Net::SSH::Perl($host); $ssh->login($user, $pass);
12 13 14
my ($stdout, $stderr, $exit) = $ssh->cmd($cmd); $output = $stdout;
15 16 17
open (MYFILE, ’>>ipadressen.txt’); for ($output =~ /(\d+\.\d+\.\d+\.\d+)/g) { $currentline = $_; $x= grep /$currentline/,@gebruikteIP; if($x == 0){ print MYFILE "$_\n"; push(@gebruikteIP, "$_"); } }
18 19 20 21 22 23 24 25 26 27
close (MYFILE);
28 29 30
}
31 32
zoekNeighbors(’10.98.250.193’);
Op zich werkte dit wel vrij goed, maar het was behoorlijk traag. Alsook inloggen via SSH op elk device was misschien ook wat te belastend voor het netwerk. Doordat we wilden winnen aan snelheid zijn we gaan kijken naar het gebruik van SNMPquery’s. Deze zijn heel lightweight voor het netwerk en zouden veel sneller moeten gaan doordat niet specifiek op de devices ingelogd moet worden. Het script dat we hiervoor geschreven hadden was : 1 2 3 4
use warnings; use IO::Socket; my $start_run = time();
5 6 7 8 9 10
$ip = ’10.98.250.195’; my @adressen; my @b = null; zoek($ip);
11 12
sub zoek
11
13
{ $a = $_[0]; $out = ‘/usr/bin/snmpbulkget -v2c -c public $a ←1.3.6.1.4.1.14988.1.1.11.1.1.2 2>/dev/null‘; $mk = ‘/usr/bin/snmpbulkget -v2c -c public $a ←1.3.6.1.4.1.14988.1.1.11.1.1.5 2>/dev/null‘;
14 15
16
17
@a = split(/\n/,$out); foreach $adres(@a){ @ipad=split(/: /, $adres); push(@adressen,$ipad[1]); }
18 19 20 21 22 23 24
@a = split(/\n/,$mk); foreach $id(@a){ @ipad=split(/: /, $id); push(@b,$ipad[1]); }
25 26 27 28 29 30
#$tel = -1; my $tel = 0; foreach $val(@adressen){
31 32 33 34 35
$end_run = time(); $run_time = $end_run - $start_run;
36 37 38 39
if($b[$tel] ne ’’){ if(!exists $gebruikt{$val}){ $gebruikt{$val}=$b[$tel]; $aantal++; print "$aantal \t $val \t $gebruikt{$val}\t \t ←$run_time\n"; zoek($val); }
40 41 42 43 44
45 46 47
} $tel++;
48 49
}
50 51
}
52 53 54 55 56 57 58 59
sub schrijf(){ open FILE, ">mikrotik-snmp.txt" or die $!; foreach my $key ( sort keys %gebruikt ) { print FILE $key . "\n"; } close(FILE);
60 61 62 63
open FILE, ">nano-snmp.txt" or die $!; foreach my $key ( sort keys %antenne) {
12
print FILE $key . "\n"; } close(FILE);
64 65 66 67
}
68 69
schrijf();
70 71 72 73
my $end_run = time(); my $run_time = $end_run - $start_run; print "Job took $run_time seconds\n";
Dit hebben we nog sneller kunnen maken door Perl-libraries van SNMP te gebruiken maar hebben dit niet verder uitgewerkt. 1
use Net::SNMP;
2 3 4 5
($session,$error) = Net::SNMP->session(Hostname => $ARGV[0], Community => $ARGV[1], Version => ’snmpv2c’);
6 7
die "session error: $error" unless ($session);
8 9
$result = $session->get_bulk_request("1.3.6.1.4.1.14988.1.1.11.1.1.2");
10 11
die "request error: ".$session->error unless (defined $result);
12 13
$session->close;
14 15
print "Number of interfaces: ".$result->{"1.3.6.1.4.1.14988.1.1.11.1.1.2←"}."\n";
Vanaf het moment dat we het script lieten lopen merkten we al direct een verschil : Het liep veel sneller dan ons SSH-script. Maar we kwamen weer uit op een nieuw probleem; niet alle devices hebben SNMP aanstaan. Dit zorgt er voor dat er een deel van de devices niet gevonden worden. Hierna hadden we nog 1 optie over : Inloggen op de devices via een Perl-script gebruik makende van de MikroTik API. Het voordeel hierbij was dat op het Wireless Belgium netwerk alle Mikrotik Devices bij de installatie zo waren ingesteld dat men met de API kan connecten. Nadat we wat vetrouwd waren geraakt met de API konden we snel een script schrijven dat vrij hard leek op de vorige. Dit is tevens ons definitief discovery script. 1 2 3 4
use use use use
dbScriptje; IO::Socket; Mtik ; List::MoreUtils qw(uniq);
5 6
13
7 8 9 10 11 12 13
#Er bestaat een universele guest-login over de MikroTik-bakjes; $mtik_host = *********; $mtik_username = **********; $mtik_password = ************; %gebruikt = (); %devs = (); @devices = ();
14 15 16
sub zoek{
17 18 19
$mtik_host = $_[0]; #Host meegegeven aan de subroutine; if (Mtik::login($mtik_host,$mtik_username,$mtik_password)){ Inloggen op MikroTik-device;
#←-
20 21 22
my @wmd= ("/interface/wireless/getall", "=.proplist=frequency"); my($retval1,@results1) = Mtik::raw_talk(\@wmd); #Command om te ←kijken of er een frequency wordt geretourneerd (Wifi-kaart ←of niet);
23 24 25 26
27 28 29 30 31
if(@results1[1]){ if(@results1[1] =~ m/frequency/){ #Boolean-value setten ←afhankelijk van wifi-kaart of niet; $gebruikt{$mtik_host}=1; }else{ $gebruikt{$mtik_host}=0; } }
32 33
34
my @cmd = ("/ip/neighbor/getall", "=.proplist=identity,software-←id,platform,interface,board,address"); my($retval,@results) = Mtik::raw_talk(\@cmd); #Command dat ←informatie over het MikroTik-device terug zal geven;
35 36
foreach my $result (@results) { list overlopen;
#Elke regel uit de ip-neighbor-←-
37 38
39 40 41 42 43 44 45
46 47
if($result eq "!re"){ #Wanneer regel gelijk aan !re begint ←er een nieuwe entry; if(!exists $devs{$currentline}){ $devs{$currentline}=’’; push @devices, { %devicevalues }; } %devicevalues=(); #Array terug leegmaken; }else{ #Regel niet gelijk aan !re; $result =~ m/=(.*?)=/; #Match de waarden tussen 2 ’=’-←tekens; my $index = $1; #Steek match in $index; $devicevalues{$index}=${^POSTMATCH}; #POSTMATCH geeft ←alles na de gevonden match terug;
48 49 50
} if($result =~ m/(\d+\.\d+\.\d+\.\d+)/){
14
#Indien de gevonden←-
waarde overeen komt met een IP-adres; $currentline=$1; #Currentline = ipadres; if (!exists $gebruikt{$currentline}){ #Indien men deze ←device nog niet eerder gebruikt heeft; $gebruikt{$currentline}=’’; $socket = IO::Socket::INET->new(Proto=>"tcp", ←PeerPort=>"8728", PeerAddr=>"$currentline", ←Timeout=>1); if($socket){ #Kijken of de API-poort voor MikroTik ←openstaat. $aantal++; print $aantal."\n"; zoek($currentline); #Recursief opnieuw de ←subroutine aanroepen met het volgende ip-←adres. }
51 52
53 54
55
56 57 58
59 60
}
61
}
62 63
} Mtik::logout;
64 65
67
#Uitloggen van het device;
}
66
}
68 69 70
zoek($mtik_host); schrijfweg();
71 72 73 74
sub schrijfweg{ dbScriptje::ConnectToMySql(); #Connectie maken met de DB @list = uniq(@devices); #Duplicate hashes uit de array van hashmaps ←halen
75 76
foreach $device(@list){ #Voor elke hash entry in de map
77 78 79 80 81 82 83 84 85
$address = ""; $macaddress = ""; $interface = ""; $identity = ""; $platform = ""; $softwareid = ""; $board = ""; $tempplatform = "";
86 87
88 89 90
91 92 93 94
while ( my ($key, $value) = each(%$device) ) { #Voor elk key-←value pair per hash $key =~ s/-//; if($key eq "platform"){ #Indien key = platform if(length($value)==3){ #Wanneer de value bij platform ←een lengte heeft van 3, is dit een AirOS-device; ${$key}="AirOS"; $tempplatform = $value; #Tijdelijk AirOS opslaan; }else{ ${$key}=$value;
15
} }else{ ${$key}=$value; }
95 96 97 98 99
if($tempplatform ne ""){ #Wanneer tempplatform leeg en het ←dus een AirOS-device is, moet de boardname veranderd ←worden naar waarde die $board = $tempplatform; #hiervoor bij platform stond }
100
101 102 103
print ${$key};
104
}
105 106
$wireless = $gebruikt{$address}; #De $wireless boolean ←veranderen naar de true/false voorafgaang geset; dbScriptje::InsertInInterfaces($address,$macaddress, $interface,←$identity, $platform, $softwareid, $board, $wireless); print "\n --------------------------------------- \n"; #Alle ←waarden wegschrijven naar de DB;
107
108
109
}
110
Dit liep al een pak sneller dan ons SSH-script, maar wel trager dan hetgene we hadden geschreven met SNMP. Dit script liep echter wel alle devices af, en gaf uiteindelijk ook geen foutmeldingen.
7.2 Curl Script Hiervoor maken we gebruik van een script die we gerkegen hebben van meneer Maes. Het is mogelijk om via Curl informatie op te vragen uit de Nanostations. 1 2 3 4 5
use use use use
strict; IO::Socket::PortState qw(check_ports); WWW::Curl::Easy; WWW::Curl::Form;
6 7 8 9 10
my my my my
$ip = shift; $page = shift; $username = "usr"; $password = "Wouter";
11 12
&get_airos_page($ip,$page);
13 14
sub get_airos_page {
15 16
my $https_port = 443;
17 18 19 20 21
my $proto = "http://"; if(check_port($ip,$https_port)) { $proto = "https://"; }
16
22
my $curl = WWW::Curl::Easy->new;
23 24 25 26 27 28 29 30 31 32 33 34
#
$curl->setopt(CURLOPT_URL, $proto.$ip); $curl->setopt(CURLOPT_VERBOSE, 1); $curl->setopt(CURLOPT_FOLLOWLOCATION, 1); $curl->setopt(CURLOPT_SSL_VERIFYPEER, 0); $curl->setopt(CURLOPT_SSL_VERIFYHOST, 0); $curl->setopt(CURLOPT_COOKIEJAR, ’cookie.txt’); my $dummyresponse_body; my $response_headers; $curl->setopt(CURLOPT_WRITEDATA,\$dummyresponse_body); $curl->setopt(CURLOPT_WRITEHEADER,\$response_headers);
35 36 37 38
39
my $retcode = $curl->perform; if ($retcode != 0) { die("AirOS Error while fetching page: $retcode ".$curl->←strerror($retcode)." ".$curl->errbuf."\n"); }
40 41 42 43
my $form; my @hdrs = (’Expect:’);
44 45 46 47
if ($response_headers =~ /WWW-Authenticate: Basic/s) { # old AirOS firmware with HTTP auth
48
$curl->setopt(CURLOPT_URL, $proto.$ip.’/’.$page); $curl->setopt(CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ; $curl->setopt(CURLOPT_USERPWD, $username.":".$password);
49 50 51 52
} else { #newer AirOS firmware with cookie auth
53 54
$curl->setopt(CURLOPT_URL, $proto.$ip.’/login.cgi’); $form = WWW::Curl::Form->new; $form->formadd(’uri’, ’/’.$page); $form->formadd(’username’, $username); $form->formadd(’password’, $password); $curl->setopt(CURLOPT_HTTPPOST, $form);
55 56 57 58 59 60 61
$curl->setopt(CURLOPT_HTTPHEADER, \@hdrs);
62 63
$curl->setopt(CURLOPT_COOKIEFILE, ’cookie.txt’);
64 65
}
66 67 68 69 70 71 72 73
my $response_body; my $response_headers2; $curl->setopt(CURLOPT_WRITEDATA,\$response_body); $curl->setopt(CURLOPT_WRITEHEADER,\$response_headers2); $retcode = $curl->perform;
74
17
if ($retcode != 0) { die("AirOS Error while fetching page: $retcode ".$curl->←strerror($retcode)." ".$curl->errbuf."\n"); }
75 76
77 78
print $response_body;
79 80
}
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
sub check_port() { my $host = $_[0]; my $portc = $_[1]; my $protoc = "tcp"; my %port_hash = ( $protoc => { $portc => {}, } ); my $timeout = 5; my $host_hr = check_ports($host,$timeout,\%port_hash); for my $port (sort {$a <=> $b} keys %{$host_hr->{tcp}}) { my $yesno = $host_hr->{tcp}{$port}{open} ? 1 : 0; return $yesno; } }
7.3 CCQ script
1 2
#!/usr/bin/env perl
3 4 5 6 7 8
open(MYFILE, "/etc/scripts/bestanden/WirelessIpMikroTikMetWifi.txt"); while ($line = <MYFILE>){ push(@ips,$line); } close(MYFILE);
9 10
$woord="a";
11 12 13 14 15 16
foreach $ip(@ips) { $ip = substr $ip,0,length($ip)-1; splice(@uitkomsten); #Create the graph
17 18 19 20 21
print print print print
"graph_title CCQ Wiresless MikroTik $ip\n"; "graph_category CCQ Wiresless MikroTiks\n"; "graph_args --base 1000 -l 0\n"; "graph scale no\n";
22 23
$out = ‘/usr/bin/snmpwalk -v2c -c public $ip ←1.3.6.1.4.1.14988.1.1.1.3.1.10 2>/dev/null‘;
18
if (length($out) > 55) { @splitss=split("\n",$out); foreach $item(@splitss) { @splits = split(/: /,$item); push(@uitkomsten,$splits[1]); } foreach $item2(@uitkomsten) { #create the first label ( line in the graph ) print "$woord.type GAUGE\n"; print "$woord.label $ip\n"; print "$woord.draw LINE1\n";
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#give the label a value print "$woord.value $item2\n"; $woord.="a"; }
39 40 41 42
} else { @splits = split(/: /,$out); $res = @splits[1]; #create the first label ( line in the graph ) print "$woord.type GAUGE\n"; print "$woord.label $ip\n"; print "$woord.draw LINE1\n";
43 44 45 46 47 48 49 50 51 52
#give the label a value print "$woord.value $res\n"; $woord.="a";
53 54 55
}
56 57
}
7.4 Installatie script Om de installatie van ons project te vereenvoudigen hebben we ervoor gekozen om een installatie script in bash te maken. Eerst passen we de resolv.conf aan, zo hebben we zeker een nameserver. Daarna geven we een host in, dit is nodig om SNMP te laten werken. Vervolgens geven we automatisch een IP-adres en geven we ook de juiste configuratie in voor de interface eth1. Hierna download en installeert het script alle nodige packages en libraries. Daarna halen we alle scripts op en plaatsen die in de juiste mappen. 1 2
#!/bin/sh
3 4
#Host file aanpassen#
5
19
6
7 8
wget -O /etc/hosts2 -r https://512335.webontwerp.khleuven.be/Eindwerk/←hosts/hosts cp /etc/hosts2 /etc/hosts /etc/init.d/networking restart
9 10
#Ip adres veranderen#
11 12
13 14
wget -O /etc/network/interfaces2 -r https://512335.webontwerp.khleuven.←be/Eindwerk/interfaces/interfaces cp /etc/network/interfaces2 /etc/network/interfaces /etc/init.d/networking restart
15 16
#Sources.list aanpassen#
17 18
19
wget -O /etc/apt/sourcess.list -r https://512335.webontwerp.khleuven.be/←Eindwerk/sources/sources.list cp /etc/apt/sourcess.list /etc/apt/sources.list
20 21
#Installatie packages#
22 23
apt-get update
24 25 26 27 28 29 30 31 32 33
apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get
install install install install install install install install install
unzip make ssh apache2 mysql-server mysql-client munin munin-node snmp snmpd libcurl4-gnutls-dev
34 35
#Installatie munin plugins#
36 37 38
39 40 41 42 43
mkdir /etc/zips wget -O /etc/zips/plugins.tar -r --cut-dirs=3 https://512335.webontwerp.←khleuven.be/Eindwerk/munin-plugins/plugins.tar tar -xvf /etc/zips/plugins.tar -C /etc/munin/plugins chmod 777 /etc/munin/plugins/snmp_* chmod 777 /etc/munin/plugins/VendorDef.pl chmod 777 /etc/munin/plugins/VendorSchaal.pl chmod 777 /etc/munin/plugins/VendorSchaalTest.pl
44 45
#Installatie scripts /etc/scripts/#
46 47 48
49
mkdir /etc/scripts wget -O /etc/zips/scripts.zip -r --cut-dirs=3 https://512335.webontwerp.←khleuven.be/Eindwerk/scripts/scripts.zip unzip /etc/zips/scripts.zip -d /etc/scripts/
50 51
#Installatie Perl Library’s#
52 53 54
perl -MCPAN -e ’install IO::Socket::PortState’ perl -MCPAN -e ’install Net::MAC::Vendor’
20
55 56 57 58 59 60 61 62 63 64 65 66 67
perl perl perl perl perl perl perl perl perl perl perl perl perl
-MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN
-e -e -e -e -e -e -e -e -e -e -e -e -e
’install ’install ’install ’install ’install ’install ’install ’install ’install ’install ’install ’install ’install
Data::OptList’ Email::Date::Format’ MIME::Lite’ MIME::Types’ Net::SNMP’ Params::Util’ Sub::Exporter’ Sub::Install’ WWW::Curl::Easy’ WWW::Curl::Form’ IO::Socket::PortState’ DBI’ DBD::mysql’
68 69
#Config snmp aanpassen#
70 71 72
rm /etc/snmp/snmpd.conf wget -O /etc/snmp/snmpd.conf -r https://512335.webontwerp.khleuven.be/←Eindwerk/snmp-config/snmpd.conf
73 74
#Config apache2 aanpassen#
75 76 77
78
rm /etc/apache2/sites-enabled/000-default wget -O /etc/apache2/sites-enabled/000-default -r https://512335.←webontwerp.khleuven.be/Eindwerk/apache-config/000-default service apache2 restart
79 80
#Installtie Database server#
81 82
83
echo "Gelieve het wachtwoord in te geven dat u daarstraks hebt gekozen ←bij MYSQL (wirelessbelgium)" mysql -u root -p < /etc/scripts/createDB.sql
84 85
#Munin-config#
86 87
wget -O /etc/munin/plugin-conf.d/snmp -r https://512335.webontwerp.←khleuven.be/Eindwerk/munin-config/snmp
88 89 90
#Munin node herstarten# service munin-node restart
21
8 Database We willen de gegevens van de gevonden neighbours cachen; daarvoor hebben we nood aan een database. We maken gebruik van een mysql-database. Om deze database in te vullen hebben we gebruik gemaakt van diverse scripts zoals onder andere een discovery script die we meerdere malen hebben herschreven zoals al reeds besproken is. We hebben 3 verschillende delen in onze database. We hebben een tabel Interfaces waar we alle gegevens van het neighbor discovery script in plaatsen. Hier zetten we zo veel mogelijk informatie in over alle devices en hun interfaces. Deze dient ook als basis voor de andere tabellen. Het tweede deel zijn de tabellen AantalCurrent, ApIp en UniekVerbondenMacAdressen. Deze werden vooral gebruik voor onze grafieken in Munin. Doormiddel van gegevens van de tabel Interfaces en SNMP konden we deze opvullen. Het laatste deel is de tabel Locatie. Deze tabel dient vanzelfsprekend voor de locaties op te slagen van de devices. Deze worden daarna gebruikt om op een map te plaatsen (Zie volgende sectie). Onze database is duidelijk niet volgens de regels uitgenormaliseerd maar dit was ook ons doel niet. Elke extra functie dat toegevoegd wordt zorgt voor een aanpasing van onze tabellen. Bij elke aanpassing moeten deze opnieuw gevuld worden en dit kan redelijk wat kostbare tijd in beslag nemen. Voor het script dat de tabellen aanmaakt, zie 14.4.
22
23
9 Locatiebepaling Het leek ons interessant om de locaties van de devices automatisch op een gepersonaliseerde Google Maps map te plaatsen om zo een overzicht te creëren van al de devices in het netwerk. Spijtig genoeg staan de locaties niet ingesteld op de devices. Daarom is dit eerder een proof of concept.
9.1 ophalen locaties van devices We beginnen met het ophalen van de locaties van de devices. Hieronder staat hoe we dat kunnen verwezenlijken met behulp van SSH. We kunnen het ook met SNMP of eventueel andere manieren doen. Na het ophalen van de gegevens worden ze in onze database gepushed. 1 2
#!/usr/bin/env perl
3 4 5 6
use lib ("/etc/scripts"); require dbScriptje; use Time::Stamp;
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
dbScriptje::ConnectToMySql(); @ips = ("10.98.250.197","10.98.250.198"); foreach $ip(@ips) { $res = ‘sshpass -p Wolk ssh \ -o UserKnownHostsFile=/dev/null \ -o StrictHostKeyChecking=no \ -l ubnt \ -p 22 $ip \ mca-status | egrep -e ’latitude|longitude’‘; @resultaat = split("\n",$res); foreach $item(@resultaat) { @resultaat2 = split(/=/,$item); push(@resultaat3,$resultaat2[1]); } dbScriptje::InsertLocatie($ip,$resultaat3[0],$resultaat3[1]); }
9.2 Pagina We zetten een pagina op met een lege map. Deze centeren we op België, kiezen ons zoomlevel en ons default maptype.
24
Hiervoor hebben we ook eerst een API-key moeten aanvragen bij Google zelf. (zie http: //www.w3schools.com/googleAPI/google_maps_api_key.asp) 1 2 3
4 5 6 7 8 9
10
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" ←/> <style type="text/css"> html { height: 100% } body { height: 100%; margin: 0; padding: 0 } <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=←AIzaSyBVcbjD4Kxvl2slCVrpCDKvgXY8TmFGPPw&sensor=true">
11 12 13 14 15 16 17 18 19 20 21
22
<script type="text/javascript"> function initialize() { var mapOptions = { center: new google.maps.LatLng(50.88085, 4.67379), zoom: 12, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("←map_canvas"), mapOptions);
23 24 25 26 27 28 29 30 31
}
9.3 Ophalen van locaties uit de database Vervolgens willen we onze waarden uit de database ophalen om deze dan één voor één op de map te plaatsen. We plaatsen deze in een array. 1
2 3
4
$dbhandle error $selected Could
= mysql_connect(’localhost’,’user’, ’password’) or die (’←connecting to mysql’); = mysql_select_db("wirelessbelgium",$dbhandle) or die("←not select examples");
5
25
$result = mysql_query("SELECT * FROM wirelessbelgium.Locatie");
6 7
$locaties=array();
8 9
while ($row = mysql_fetch_array($result)) { array_push($locaties, $row[’LONGITUDE’]); array_push($locaties, $row[’LATITUDE’]); }
10 11 12 13 14
mysql_close($dbhandle);
15 16
?>
9.4 Markers op de map plaatsen In de javascript block van Google Maps voegen we één voor één de locaties toe aan een marker en voegen deze markers toe aan de map. 1 2 3 4
5
if($index % 2==0){
6 7
$var1 = $a; $var2 = $locaties[$index+1]; print "var location = new google.maps.LatLng(" . ←$var2 . "," . $var1 .");\n";
8 9 10
11
?>
12
var marker = new google.maps.Marker({ position: location, map: map });
13 14 15 16 17 18
19
} $index++;
20 21
}
22 23 24
?>
26
9.5 Resultaat
9.6 Uiteindelijke pagina
1
2
$dbhandle error $selected Could
3
4
= mysql_connect(’localhost’,’user’, ’password’) or die (’←connecting to mysql’); = mysql_select_db("wirelessbelgium",$dbhandle) or die("←not select examples");
5
$result = mysql_query("SELECT * FROM wirelessbelgium.Locatie");
6 7
$locaties=array();
8 9
while ($row = mysql_fetch_array($result)) { array_push($locaties, $row[’LONGITUDE’]); array_push($locaties, $row[’LATITUDE’]); }
10 11 12 13 14
mysql_close($dbhandle);
15 16
?>
17 18 19 20
21 22 23 24 25 26
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" ←/> <style type="text/css"> html { height: 100% } body { height: 100%; margin: 0; padding: 0 } #map_canvas { height: 100% } <script type="text/javascript"
27
27
28
src="https://maps.googleapis.com/maps/api/js?key=←AIzaSyBVcbjD4Kxvl2slCVrpCDKvgXY8TmFGPPw&sensor=true">
29 30 31 32 33 34 35 36 37 38
39
<script type="text/javascript"> function initialize() { var mapOptions = { center: new google.maps.LatLng(50.88085, 4.67379), zoom: 12, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("←map_canvas"), mapOptions);
40 41 42 43
44
if($index % 2==0){
45 46
$var1 = $a; $var2 = $locaties[$index+1]; print "var location = new google.maps.LatLng(" . $var2 . ","←. $var1 .");\n";
47 48 49
50
?>
51 52
var marker = new google.maps.Marker({position: location,map: map←});
53 54
55
} $index++;
56 57 58
}
59 60
?>
61 62 63 64 65 66 67 68
}
28
10 Back-up Eenmaal we een werkende configuratie hadden, hebben we ervoor gekozen om dagelijks een back-up te gaan nemen van ons systeem. Om onze back-up te nemen hebben we gebruik gemaakt van rsync in samenwerking met een cronjob. Zo was het mogelijk om bepaalde mappen over te slaan en deze op bepaalde tijdstippen te laten uitvoeren. We hebben zoals eerder vermeld gekozen om deze back-up dagelijks te laten runnen en dat ’s avonds als wij niet meer op het systeem aan het werken waren. Dit omdat we zo weinig tot geen hinder zouden ondervinden van het nemen van deze back-up. Deze back-up’s konden we ook deels gebruiken als een soort van datacenter. Zo konden we steeds live bestanden gaan aanpassen met in het achterhoofd dat we steeds konden terugkeren naar een recent en werkend onderdeel of script. Dit is ons uiteindelijk commando dat we gebruiken in cronjob. 1
rsync -aHAXxv --exclude ’/mnt’ / /mnt/‘date +%d-%m-%y‘/
Dit commando heeft een kleine transformatie doorgaan. Het zorgde namelijk eerst voor wat problemen. Onze backup bestaat uit het lokaal opslaan van heel het systeem en om te beginnen hadden we onze map naar waar we de backup wegschreven, niet ge-exclude. Dit zorgde voor een loop vanaf hij aan /mnt/backup/ begon. Dit was makkelijk op te lossen door deze map als parameter aan –exclude mee te geven. Het volgende probleem was dat al onze backups overschreven werden elke nacht om 3 uur. Als we iets wouden repareren dat we bijvoorbeeld voor het weekend voor het laatst hebben aangepast zou dit niet meer mogelijk zijn (voor dit voorbeeld kunnen we de cronjob natuurlijk ook aanpassen). Hiervoor hebben we ervoor gezorgd dat elke backup in /mnt/‘date +%d-%m-%y‘/ wordt geplaatst. Dit maakt telkens een nieuw mapje aan met als naam de datum van de backup (niet aan te raden voor grote voor langdurig gebruik).
29
11 Presentatie Eén van de laatste luiken van ons eindwerk was het maken en naar voor brengen van een presentatie rond een specifiek aspect van ons eindwerk. Dit moest dan eerst goedgekeurd worden door één van de toezichthoudende lectoren. We hebben geopteerd om eens een korte introductie te geven omtrent ons eindwerk, zodat iedereen juist wist waar we nu net mee bezig geweest zijn de afgelopen weken. Zo was het ook makkelijker ons thema te situeren binnen het project. Als thema hebben we gekozen voor een korte uitleg te geven rond SNMP, doordat dit toch een zeer vaak gebruikt protocol is en dit nog wel interessant zou kunnen zijn voor de andere leerlingen.
11.1 Voorbereidingen In plaats van een simpele PowerPoint te maken, hebben we gekozen om het eens te proberen met een programma genaamd ’Prezi’. We hadden er hiervoor nog niet mee gewerkt, dus het leek ons wel eens leuk het hiermee te doen. In Prezi kan men vanalle opties toepassen die in PowerPoint niet gaan, zoals alles beginnen draaien en te scalen. Hierbij moesten we wel letten dat we het niet té ’duizelingwekkend’ maakten, omdat dit het doel van de Prezi zou doen verwateren. Het hoofddoel blijft nog steeds de informatie beknopt weer te geven, en niet om interessant over te komen.
11.2 Presentatie Zie bijlage 14.1.
30
12 Slotwoord In deze 4 weken hebben we heel wat bijgeleerd over monitoring en het wireless belgium netwerk. De meeste van onze klasgenoten wisten niet eens dat er zo iets bestond als het wireless belgium netwerk; het was dan ook leuk om deze kennis te kunnen delen met onze klasgenoten. Na deze 4 weken hebben we toch al redelijk veel grafieken opgebouwd die zeker bruikbaar zijn voor het wireless belgium network team. Ook hebben we ervoor gezorgd dat er automatisch scripts gegenereerd worden en zoals hierboven al beschreven dat we samenwerken met een databank. Dit om alles zo overzichteijk mogelijk te kunnen doorgeven aan het wireless belgium network team. We kunnen zeker besluiten dat we tijdens deze 4 weken ontzettend veel hebben bijgeleerd. We hebben goed samen gewerkt met ons team en dit heeft een mooi resultaat opgeleverd. Als laatste zouden we graag nog 2 lectoren willen bedanken. Dit zijn Hans Maes en Pieter Geens. Hans Maes, bedankt voor de vele uitleg en informatie die we van u hebben gekregen rond het wireless belgium network. Pieter Geens, bedankt voor alle hulp die we van u hebben gekregen in deze 4 weken.
31
13 Bronnen http://stiern.com/tutorials/adding-custom-google-maps-to-your-website/ http://www.w3schools.com/googleAPI/google_maps_api_key.asp http://munin-monitoring.org/ http://en.wikipedia.org/wiki/Simple_Network_Management_Protocol http://docs.oracle.com/cd/E19469-01/820-6413-13/SNMP_commands_reference_ appendix.html http://docs.cacti.net/manual:087:3a_advanced_topics.3b_snmp_data_ query_walkthrough http://wikis.khleuven.be/sysnw/index.php/Wifi_monitoring http://community.ubnt.com/t5/PowerStation-Integrated-Devices/Ps5-OID-s/ td-p/1040 http://wiki.mikrotik.com/wiki/Manual:API http://forum.mikrotik.com/viewtopic.php?f=8&t=22744 http://www.perlmonks.org/?node_id=566455 http://www.perlmonks.org/?node_id=772666 http://openvpn.net/index.php/open-source/documentation/miscellaneous/ 78-static-key-mini-howto.html http://munin-monitoring.org/wiki/HowToWriteSNMPPlugins http://manpages.ubuntu.com/manpages/lucid/man3/Munin::Plugin.3pm. html http://perlmaven.com/splice-to-slice-and-dice-arrays-in-perl
https://library.linode.com/server-monitoring/cacti/ubuntu-12.04-precise-pango
32
14 Bijlagen 14.1 Presentatie in PDF
33
14.2 ApiNeighborDiscovery.pl
1 2 3 4 5
use use use use use
dbScriptje; IO::Socket; Mtik ; List::MoreUtils qw(uniq); warnings;
6 7 8 9 10 11 12
$mtik_host = "10.98.250.195"; $mtik_username = "api_user"; $mtik_password = "api_user_pass"; %gebruikt = (); %devs = (); @devices = ();
13 14
sub zoek{
15 16 17
$mtik_host = $_[0]; if (Mtik::login($mtik_host,$mtik_username,$mtik_password)){
18 19 20
my @wmd= ("/interface/wireless/getall", "=.proplist=frequency"); my($retval1,@results1) = Mtik::raw_talk(\@wmd);
21 22 23 24 25 26 27 28 29 30
#print $retval1 ."\t"; #print @results1; if(@results1[1]){ if(@results1[1] =~ m/frequency/){ $gebruikt{$mtik_host}=1; }else{ $gebruikt{$mtik_host}=0; } }
31 32
33
my @cmd = ("/ip/neighbor/getall", "=.proplist=identity,software-←id,platform,interface,board,address"); my($retval,@results) = Mtik::raw_talk(\@cmd);
34 35
foreach my $result (@results) {
36 37 38 39 40 41 42 43 44 45 46 47 48 49
if($result eq "!re"){ if(!exists $devs{$currentline}){ $devs{$currentline}=’’; push @devices, { %devicevalues }; } %devicevalues=(); }else{ $result =~ m/=(.*?)=/; my $index = $1; $devicevalues{$index}=${^POSTMATCH}; #print "${^POSTMATCH}\n"; } if($result =~ m/(\d+\.\d+\.\d+\.\d+)/){
67
$currentline=$1; if (!exists $gebruikt{$currentline}){ $gebruikt{$currentline}=’’; $socket = IO::Socket::INET->new(Proto=>"tcp", ←PeerPort=>"8728", PeerAddr=>"$currentline", ←Timeout=>1); if($socket){ $aantal++; print $aantal."\n"; zoek($currentline); } #Voor zoeken : Checken port open, en pingen of ←antwoord; #Voor port was er ’openport’;
50 51 52 53
54 55 56 57 58 59
60 61
}
62
}
63 64
} Mtik::logout;
65 66
}
67 68
}
69 70 71
zoek($mtik_host); schrijfweg();
72 73 74 75
sub schrijfweg{ dbScriptje::ConnectToMySql(); @list = uniq(@devices);
76 77
foreach $device(@list){
78 79 80 81 82 83 84 85 86
$address = ""; $macaddress = ""; $interface = ""; $identity = ""; $platform = ""; $softwareid = ""; $board = ""; $tempplatform = "";
87 88 89 90 91 92 93 94 95 96 97 98 99
while ( my ($key, $value) = each(%$device) ) { $key =~ s/-//; if($key eq "platform"){ if(length($value)==3){ ${$key}="AirOS"; $tempplatform = $value; }else{ ${$key}=$value; } }else{ ${$key}=$value; }
100
68
if($tempplatform ne ""){ $board = $tempplatform; }
101 102 103 104
print ${$key};
105
}
106 107
$wireless = $gebruikt{$address}; dbScriptje::InsertInInterfaces($address,$macaddress, $interface,←$identity, $platform, $softwareid, $board, $wireless); print "\n --------------------------------------- \n";
108 109
110
} #print Dumper(\@list);
111 112 113 114
}
69
14.3 CheckScripts.pl
1
#!/usr/bin/env perl
2 3 4
use lib ("/etc/scripts"); require dbScriptje;
5 6
dbScriptje::ConnectToMySql();
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
@range=("96","97","98"); foreach $r(@range) { @ips=dbScriptje::returnMikroWirelessEnabledIpRange($r);; foreach $ip(@ips) { print $ip; print "\t"; $out = ‘perl /etc/munin/plugins/snmp_CCQ_$ip.pl‘; @splits = split("\n",$out); if($splits[6] eq "a.value ") { print "slecht en verwijderd"; print "\n"; $verwijder = ‘rm /etc/munin/plugins/snmp_CCQ_$ip.pl‘; } else { print "goed"; print "\n"; } } @ips=(); }
70
14.4 createDB.sql
1
CREATE DATABASE wirelessbelgium;
2 3
use wirelessbelgium;
4 5 6 7 8 9 10 11 12 13 14 15 16
CREATE TABLE interfaces ( id INT NOT NULL AUTO_INCREMENT, address VARCHAR(15) , ‘mac-address‘ VARCHAR(17), ‘interface‘ VARCHAR(32), ‘identity‘ VARCHAR(32), platform VARCHAR(32), ‘software-id‘ VARCHAR(32), board VARCHAR(32), wireless BOOLEAN, PRIMARY KEY (ID) );
17 18 19 20 21 22
CREATE TABLE ApIp ( AP_ID INTEGER(4) NOT NULL, IP varchar(15) NOT NULL, PRIMARY KEY(AP_ID,IP) );
23 24 25 26 27 28 29 30
CREATE TABLE UniekVerbondenMacAddressen ( ID INTEGER(4) NOT NULL, MAC varchar(17) NOT NULL, VENDOR varchar(50) NOT NULL, PRIMARY KEY(ID,MAC), FOREIGN KEY(ID) REFERENCES ApIp (AP_ID) ON DELETE CASCADE );
31 32 33 34 35 36 37
CREATE TABLE AantalCurrent ( ID INTEGER(4) NOT NULL, AANTAL INTEGER(4) NOT NULL, PRIMARY KEY(ID), FOREIGN KEY(ID) REFERENCES ApIp (AP_ID) ON DELETE CASCADE );
38 39 40 41 42 43 44
CREATE TABLE Locatie ( IP varchar(15) NOT NULL, LATITUDE varchar(9) NOT NULL, LONGITUDE varchar(9) NOT NULL, PRIMARY KEY(IP) );
71
14.5 dbScriptje.pm
1 2
#!/usr/bin/perl package dbScriptje;
3 4 5 6
use DBI; use DBD::mysql; use warnings;
7 8 9
sub InsertInInterfaces{
10
$connection = ConnectToMySql();
11 12
$insertquery = "insert into interfaces (address, ‘mac-address‘, ‘←interface‘, ‘identity‘, platform, ‘software-id‘, board, ←wiresless) values (?, ?, ?, ?, ?, ?,?,?) ";
13
14
$statement = $connection->prepare($insertquery); $statement->execute($_[0], $_[1], $_[2], $_[3], $_[4] , $_[5],$_[6],←$_[7]);
15 16
17 18
}
19 20
sub InsertUniekVerbondenMacAddressen{
21
$connection = ConnectToMySql();
22 23
$insertquery = "insert into UniekVerbondenMacAddressen (ID,MAC,←VENDOR) values (?, ?, ?)";
24
25
$statement = $connection->prepare($insertquery); $statement->{PrintError}=0; $statement->execute($_[0], $_[1], $_[2]);
26 27 28 29 30
}
31 32
sub InsertLocatie{
33
$connection = ConnectToMySql();
34 35
$insertquery = "insert into Locatie (IP,LATITUDE,LONGITUDE) values ←(?, ?, ?)";
36
37
$statement = $connection->prepare($insertquery); $statement->{PrintError}=0; $statement->execute($_[0], $_[1], $_[2]);
38 39 40 41 42
}
43 44
sub InsertAPIP{
45
72
$connection = ConnectToMySql();
46 47
$insertquery = "insert into ApIp (AP_ID,IP) values (?, ?)";
48 49
$statement = $connection->prepare($insertquery); $statement->{PrintError}=0; $statement->execute($_[0], $_[1]);
50 51 52 53 54
}
55 56
sub InsertAantalCurrent{
57
$connection = ConnectToMySql();
58 59
$insertquery = "insert into AantalCurrent (ID,AANTAL) values (?, ?)"←;
60
61
$statement = $connection->prepare($insertquery); $statement->{PrintError}=0; $statement->execute($_[0], $_[1]);
62 63 64 65
}
66 67
sub printInterfaces{
68
$selectquery = "select * from interfaces";
69 70
$statement = $connection->prepare($selectquery); $statement->execute();
71 72 73
print "interface \t ip-address \t mac-address \t identity \t version←\t board \n";
74
75
while (@data = $statement->fetchrow_array()) {
76 77
print "$data[0] \t $data[1] \t $data[2] \t $data[3] \t $data←[4]";
78
79
}
80 81 82
}
83 84
sub printUniqueMac{
85 86
$selectquery = "select * from UniekVerbondenMacAddressen";
87 88 89
$statement = $connection->prepare($selectquery); $statement->execute();
90 91
print "Mac-Adres \t AP_id \n";
92 93
while (@data = $statement->fetchrow_array()) {
94
print "$data[0] \t $data[1]";
95 96
}
73
97 98
}
99 100
sub returnInterfaces{
101
$selectquery = "select * from interfaces";
102 103
$statement = $connection->prepare($selectquery); $statement->execute();
104 105 106
print "interface \t ip-address \t mac-address \t identity \t version←\t board \n";
107
108
while (@data = $statement->fetchrow_array()) {
109 110
print "$data[0] \t $data[1] \t $data[2] \t $data[3] \t $data←[4]";
111
112
}
113 114 115
}
116 117
sub returnUniqueMac{
118
$selectquery = "select * from UniekVerbondenMacAddressen";
119 120
$statement = $connection->prepare($selectquery); $statement->execute();
121 122 123
while (@data = $statement->fetchrow_array()) {
124 125
$macs{$data[0]} = $data[1];
126
}
127 128
return %macs;
129 130
}
131 132
sub returnAantalVendors{
133
$selectquery = "select VENDOR, count(MAC) from ←UniekVerbondenMacAddressen group by VENDOR order by count(MAC)";
134
135
$statement = $connection->prepare($selectquery); $statement->execute();
136 137 138
while (@data = $statement->fetchrow_array()) {
139 140
$vendor{$data[0]} = $data[1];
141
}
142 143
return %vendor;
144 145
}
146 147
sub returnTop10Vendors{
74
148
$selectquery = "select VENDOR, count(MAC) from ←UniekVerbondenMacAddressen group by VENDOR order by count(MAC) ←desc limit 10";
149
150
$statement = $connection->prepare($selectquery); $statement->execute();
151 152 153
while (@data = $statement->fetchrow_array()) {
154 155
$vendor{$data[0]} = $data[1];
156
}
157 158
return %vendor;
159 160
}
161 162 163
sub returnAantalClients{
164
$selectquery = "select count(MAC) from UniekVerbondenMacAddressen";
165 166
$statement = $connection->prepare($selectquery); $statement->execute();
167 168 169
while (@data = $statement->fetchrow_array()) {
170 171
$res=$data[0];
172
}
173 174
return $res;
175 176
}
177 178
sub returnTop10Clients{
179
$selectquery = "select sum(beta) from (select count(MAC) as beta ←from UniekVerbondenMacAddressen group by VENDOR order by count(←MAC) desc limit 10) as alfa";
180
181
$statement = $connection->prepare($selectquery); $statement->execute();
182 183 184
while (@data = $statement->fetchrow_array()) {
185 186
$res=$data[0];
187
}
188 189
return $res;
190 191
}
192 193
sub printMikroIp{
194 195
$selectquery = "select address from interfaces where platform = ’←Mikrotik’ group by ‘software-id‘";
196
75
$statement = $connection->prepare($selectquery); $statement->execute();
197 198 199
while (@data = $statement->fetchrow_array()) { print $data[0]."\n"; }
200 201 202 203 204
}
205 206
sub returnMikroIp{
207
$selectquery = "select address from interfaces where platform = ’←Mikrotik’ group by ‘software-id‘";
208
209
$statement = $connection->prepare($selectquery); $statement->execute();
210 211 212
while (@data = $statement->fetchrow_array()) { push(@array,$data[0]); }
213 214 215 216
return @array;
217 218
}
219 220 221 222
223
224
225
sub returnMikroWirelessEnabledIpRange(){ $getal=$_[0]; if($getal==96) {$selectquery = "select address from interfaces where←wireless = true and address LIKE ’10.96.%’ group by ‘software-←id‘"}; if($getal==97) {$selectquery = "select address from interfaces where←wireless = true and address LIKE ’10.97.%’ group by ‘software-←id‘"}; if($getal==98) {$selectquery = "select address from interfaces where←wireless = true and address LIKE ’10.98.%’ group by ‘software-←id‘"}; if($getal==99) {$selectquery = "select address from interfaces where←wireless = true and address LIKE ’10.99.%’ group by ‘software-←id‘"};
226
$statement = $connection->prepare($selectquery); $statement->execute();
227 228 229
my @array; while (@data = $statement->fetchrow_array()) {
230 231 232
push(@array,$data[0]); }
233 234 235
return @array;
236 237
}
238 239
sub returnMikroWirelessEnabledIp{
240
76
$selectquery = "select address from interfaces where wireless = true←group by ‘software-id‘";
241
242
$statement = $connection->prepare($selectquery); $statement->execute();
243 244 245
while (@data = $statement->fetchrow_array()) { push(@array,$data[0]); }
246 247 248 249
return @array;
250 251
}
252 253
sub ConnectToMySql {
254 255
$database = ’wirelessbelgium’; $host = ’localhost’; $userid = ’root’; $passwd = ’WolkCloud45’;
256 257 258 259 260 261
my $connectionInfo="dbi:mysql:$database;$host";
262 263
#my $l_connection = DBI->connect($connectionInfo,$userid,$passwd) or←die $DBI::errstr;
264
265
#return $l_connection;
266 267
$connection = DBI->connect($connectionInfo,$userid,$passwd) or die ←$DBI::errstr;
268
269 270 271
}
272 273
1;
77
14.6 fetch_Curl_nanostations.pl
1 2 3 4
use use use use
strict; IO::Socket::PortState qw(check_ports); WWW::Curl::Easy; WWW::Curl::Form;
5 6 7 8 9
my my my my
$ip = shift; $page = shift; $username = "usr"; $password = "Wouter";
10 11
&get_airos_page($ip,$page);
12 13
sub get_airos_page {
14
my $https_port = 443;
15 16
my $proto = "http://"; if(check_port($ip,$https_port)) { $proto = "https://"; }
17 18 19 20 21
my $curl = WWW::Curl::Easy->new;
22 23 24 25 26 27 28 29 30 31 32 33
#
$curl->setopt(CURLOPT_URL, $proto.$ip); $curl->setopt(CURLOPT_VERBOSE, 1); $curl->setopt(CURLOPT_FOLLOWLOCATION, 1); $curl->setopt(CURLOPT_SSL_VERIFYPEER, 0); $curl->setopt(CURLOPT_SSL_VERIFYHOST, 0); $curl->setopt(CURLOPT_COOKIEJAR, ’cookie.txt’); my $dummyresponse_body; my $response_headers; $curl->setopt(CURLOPT_WRITEDATA,\$dummyresponse_body); $curl->setopt(CURLOPT_WRITEHEADER,\$response_headers);
34 35 36 37
38
my $retcode = $curl->perform; if ($retcode != 0) { die("AirOS Error while fetching page: $retcode ".$curl->←strerror($retcode)." ".$curl->errbuf."\n"); }
39 40 41 42
my $form; my @hdrs = (’Expect:’);
43 44 45 46
if ($response_headers =~ /WWW-Authenticate: Basic/s) { # old AirOS firmware with HTTP auth
47 48 49
$curl->setopt(CURLOPT_URL, $proto.$ip.’/’.$page); $curl->setopt(CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ;
78
$curl->setopt(CURLOPT_USERPWD, $username.":".$password);
50
} else {
51
#newer AirOS firmware with cookie auth
52 53
$curl->setopt(CURLOPT_URL, $proto.$ip.’/login.cgi’); $form = WWW::Curl::Form->new; $form->formadd(’uri’, ’/’.$page); $form->formadd(’username’, $username); $form->formadd(’password’, $password); $curl->setopt(CURLOPT_HTTPPOST, $form);
54 55 56 57 58 59 60
$curl->setopt(CURLOPT_HTTPHEADER, \@hdrs);
61 62
$curl->setopt(CURLOPT_COOKIEFILE, ’cookie.txt’);
63
}
64 65 66 67
my $response_body; my $response_headers2; $curl->setopt(CURLOPT_WRITEDATA,\$response_body); $curl->setopt(CURLOPT_WRITEHEADER,\$response_headers2); $retcode = $curl->perform;
68 69 70 71 72 73
if ($retcode != 0) { die("AirOS Error while fetching page: $retcode ".$curl->←strerror($retcode)." ".$curl->errbuf."\n"); }
74 75
76 77
print $response_body;
78 79
}
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
sub check_port() { my $host = $_[0]; my $portc = $_[1]; my $protoc = "tcp"; my %port_hash = ( $protoc => { $portc => {}, } ); my $timeout = 5; my $host_hr = check_ports($host,$timeout,\%port_hash); for my $port (sort {$a <=> $b} keys %{$host_hr->{tcp}}) { my $yesno = $host_hr->{tcp}{$port}{open} ? 1 : 0; return $yesno; } }
79
14.7 installatieScript.sh
1
#!/bin/sh
2 3
#Host file aanpassen#
4 5
6 7
wget -O /etc/hosts2 -r https://512335.webontwerp.khleuven.be/Eindwerk/←hosts/hosts cp /etc/hosts2 /etc/hosts /etc/init.d/networking restart
8 9
#Ip adres veranderen#
10 11
12 13
wget -O /etc/network/interfaces2 -r https://512335.webontwerp.khleuven.←be/Eindwerk/interfaces/interfaces cp /etc/network/interfaces2 /etc/network/interfaces /etc/init.d/networking restart
14 15
#Sources.list aanpassen#
16 17
18
wget -O /etc/apt/sourcess.list -r https://512335.webontwerp.khleuven.be/←Eindwerk/sources/sources.list cp /etc/apt/sourcess.list /etc/apt/sources.list
19 20
#Installatie packages#
21 22
apt-get update
23 24 25 26 27 28 29 30 31 32
apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get apt-get
install install install install install install install install install
unzip make ssh apache2 mysql-server mysql-client munin munin-node snmp snmpd libcurl4-gnutls-dev
33 34
#Installatie munin plugins#
35 36 37
38 39 40 41 42
mkdir /etc/zips wget -O /etc/zips/plugins.tar -r --cut-dirs=3 https://512335.webontwerp.←khleuven.be/Eindwerk/munin-plugins/plugins.tar tar -xvf /etc/zips/plugins.tar -C /etc/munin/plugins chmod 777 /etc/munin/plugins/snmp_* chmod 777 /etc/munin/plugins/VendorDef.pl chmod 777 /etc/munin/plugins/VendorSchaal.pl chmod 777 /etc/munin/plugins/VendorSchaalTest.pl
43 44
#Installatie scripts /etc/scripts/#
45 46
mkdir /etc/scripts
80
47
48
wget -O /etc/zips/scripts.zip -r --cut-dirs=3 https://512335.webontwerp.←khleuven.be/Eindwerk/scripts/scripts.zip unzip /etc/zips/scripts.zip -d /etc/scripts/
49 50
#Installatie Perl Library’s#
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
perl perl perl perl perl perl perl perl perl perl perl perl perl perl perl
-MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN -MCPAN
-e -e -e -e -e -e -e -e -e -e -e -e -e -e -e
’install ’install ’install ’install ’install ’install ’install ’install ’install ’install ’install ’install ’install ’install ’install
IO::Socket::PortState’ Net::MAC::Vendor’ Data::OptList’ Email::Date::Format’ MIME::Lite’ MIME::Types’ Net::SNMP’ Params::Util’ Sub::Exporter’ Sub::Install’ WWW::Curl::Easy’ WWW::Curl::Form’ IO::Socket::PortState’ DBI’ DBD::mysql’
67 68
#Config snmp aanpassen#
69 70 71
rm /etc/snmp/snmpd.conf wget -O /etc/snmp/snmpd.conf -r https://512335.webontwerp.khleuven.be/←Eindwerk/snmp-config/snmpd.conf
72 73
#Config apache2 aanpassen#
74 75 76
77
rm /etc/apache2/sites-enabled/000-default wget -O /etc/apache2/sites-enabled/000-default -r https://512335.←webontwerp.khleuven.be/Eindwerk/apache-config/000-default service apache2 restart
78 79
#Installtie Database server#
80 81
82
echo "Gelieve het wachtwoord in te geven dat u daarstraks hebt gekozen ←bij MYSQL (wirelessbelgium)" mysql -u root -p < /etc/scripts/createDB.sql
83 84
#Munin-config#
85 86
wget -O /etc/munin/plugin-conf.d/snmp -r https://512335.webontwerp.←khleuven.be/Eindwerk/munin-config/snmp
87 88 89
#Munin node herstarten# service munin-node restart
81
14.8 lijstje.pl We gaan deze bijlagen natuurlijk met behulp van een scriptje laten aanmaken. 1 2 3 4
opendir(DIR, ".") or die $!; my @file= readdir DIR; closedir DIR;
5 6
open (LIJST, ’>>lijst.txt’);
7 8 9 10 11 12 13
foreach $file (@file) { my $fileb = substr $file, 0, -3; print LIJST "\\subsection{$file}\n"; print LIJST "\\label{$fileb}\n"; print LIJST "\\lstinputlisting[language=Perl]{scripts/$file}\n"; print LIJST "\\newpage\n\n";
14 15
}
16 17
close (LIJST);
82
14.9 LongitudeLatitude.pl
1
#!/usr/bin/env perl
2 3 4 5
use lib ("/etc/scripts"); require dbScriptje; use Time::Stamp;
6 7 8 9 10 11
12 13 14 15 16 17 18 19
dbScriptje::ConnectToMySql(); @ips = ("10.98.250.197","10.98.250.198"); foreach $ip(@ips) { $res = ‘sshpass -p Wolk ssh -o UserKnownHostsFile=/dev/null -o ←StrictHostKeyChecking=no -l ubnt -p 22 $ip mca-status | egrep -e←’latitude|longitude’‘; @resultaat = split("\n",$res); foreach $item(@resultaat) { @resultaat2 = split(/=/,$item); push(@resultaat3,$resultaat2[1]); } dbScriptje::InsertLocatie($ip,$resultaat3[0],$resultaat3[1]); }
83
14.10 MaakScripts.pl
1
#!/usr/bin/env perl
2 3 4
use lib ("/etc/scripts"); require dbScriptje;
5 6
dbScriptje::ConnectToMySql();
7 8 9 10 11 12 13 14
@range=("96","97","98"); foreach $r(@range) { @ips=dbScriptje::returnMikroWirelessEnabledIpRange($r);; foreach $ip(@ips) { open(MYFILE, ">>/etc/munin/plugins/snmp_CCQ_$ip.pl");
15 16 17 18 19
print print print print
MYFILE MYFILE MYFILE MYFILE
"#!/usr/bin/env perl\n"; "use lib (\"/etc/scripts\");\n"; "require dbScriptje;\n"; "require MuninFuncties;\n";
20 21 22
print MYFILE "\$woord=\"a\";\n"; print MYFILE "\$ipp=\"$ip\";\n";
23 24
print MYFILE "MuninFuncties::createSingleGraph(\"CCQ - $ip\",\"CCQ ←10.$r.0.0 16\");\n";
25 26 27
28 29 30 31 32 33 34
35 36 37 38 39 40 41
42 43 44 45 46
print MYFILE "\$out = ‘/usr/bin/snmpwalk -v2c -c public $ip ←1.3.6.1.4.1.14988.1.1.1.3.1.10 -t 2 2>/dev/null‘;\n"; print MYFILE "if (length(\$out) > 55){\n"; print MYFILE "\@splitss=split(\"\\n\",\$out);\n"; print MYFILE "\$teller=0;\n"; print MYFILE "foreach \$item(\@splitss){\n"; print MYFILE "\@splits = split(/: /,\$item);\n"; print MYFILE "\$labelname = \"\$ipp - \$teller\";\n"; print MYFILE "MuninFuncties::createGraphLabel(\$woord,\$splits←[1],\$labelname);\n"; print MYFILE "\$woord.=\"a\";\n"; print MYFILE "\$teller++;\n"; print MYFILE "}\n"; print MYFILE "}else{\n"; print MYFILE "\@splits = split(/: /,\$out);\n"; print MYFILE "\$res = \@splits[1];\n"; print MYFILE "MuninFuncties::createGraphLabel(\$woord,\$res,\$ipp);\←n"; print MYFILE "\$woord.=\"a\";\n"; print MYFILE "}\n"; close(MYFILE); } @ips=();
84
47
}
85
14.11 MacsPerAPFinale.pl
1
#!/usr/bin/env perl
2 3 4 5 6 7
use lib ("/etc/scripts"); require dbScriptje; use Net::MAC::Vendor; use Data::Dumper; use Time::Stamp;
8 9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32 33 34 35
36 37 38 39 40 41 42 43 44 45
46
dbScriptje::ConnectToMySql(); @ips = dbScriptje::returnMikroWirelessEnabledIp(); $teller=1; foreach $ip(@ips) { $teller2=0; dbScriptje::InsertAPIP($teller,$ip); $clients = ‘/usr/bin/snmpwalk -v2c -c public $ip ←1.3.6.1.4.1.14988.1.1.1.3.1.6 2>/dev/null‘; if($clients ne ’’) { @splitsEnter2 = split("\n",$clients); foreach $item2(@splitsEnter2){ @splitsClient = split(/: /,$item2); if ($splitsClient[1] > 0) { $out = ‘/usr/bin/snmpwalk -v2c -c public $ip ←1.3.6.1.4.1.14988.1.1.1.2.1.1 2>/dev/null‘; @splitsEnter = split("\n",$out); foreach $item(@splitsEnter) { @splitsDubbelePunt = split(/: /,$item); $splitsDubbelePunt[1] =~ s/ /:/g; $output = substr $splitsDubbelePunt[1],0,17; print $output; print "\t"; @computer = Net::MAC::Vendor::lookup($output); @output3 = split(" ",$computer[0][0]); $output2 = $output3[0]; $output2 = lc($output2); $komma = substr $output2,length($output2)-1,length(←$output2); if($komma eq ’,’) { $output2 = substr $output2,0,length($output2)-1; } if(length($output2) > 49 || $output2 eq ’’) { $output2 = "Niet gevonden"; } print $output2; dbScriptje::InsertUniekVerbondenMacAddressen($teller←,$output,$output2); print "\n";
86
$teller2++;
47
}
48
} } #Teller wordt ook verhoogd als er geen clients zijn
49 50 51 52
}
53
dbScriptje::InsertAantalCurrent($teller,$teller2); $teller++;
54 55
}
87
14.12 mail_notificatie_wireless_clients.pl
1
#!/usr/bin/env perl
2 3
#Dit hebben we verbeterd door gebruik te maken van de read only user en ←zo de pagina status.cgi op te vragen
4 5
6 7 8 9 10 11
12
$out = ‘sshpass -p Wolk ssh -o UserKnownHostsFile=/dev/null -o ←StrictHostKeyChecking=no -l ubnt -p 22 10.98.250.198 mca-status | ←grep wlanConnection‘; @splits = split(/=/,$out); $res = @splits[1]; $resultaat=$res; if($resultaat > 1) { system(’perl /etc/scripts/munin-sendmail.pl wim.caudenbergh@student.←khleuven.be boe test’); }
88
14.13 MuninFuncties.pm
1
#!/usr/bin/env perl
2 3
package MuninFuncties;
4 5 6
require 5; require Exporter;
7 8 9
our @ISA = qw(Exporter); our @EXPORT = qw(readIpsFromFile snmpGetV2c snmpWalkV2c snmpGetV1 ←snmpWalkV1 cleanString createSingleGraph createMultiGraph ←createGraphLabel curl);
10 11 12 13 14
#Eerste argument = File naam sub readIpsFromFile { $filename = $_[0];
15
open(MYFILE, "/etc/scripts/bestanden/$filename"); while ($line = <MYFILE>) { push(@ips,$line); } close(MYFILE); return @ips;
16 17 18 19 20 21 22 23
}
24 25 26 27 28 29 30 31
#Eerste argument = IP #Tweede argument = OID sub snmpGetV2c { $ip = $_[0]; $ip = $_[1]; $snmp = "/usr/bin/snmpget -v2c -c public";
32
$query = "$snmp $ip " . $oid . " 2>/dev/null";
33 34
return $query;
35 36
}
37 38 39 40 41 42 43 44
#Eerste argument = IP #Tweede argument = OID sub snmpWalkV2c { $ip = $_[0]; $ip = $_[1]; $snmp = "/usr/bin/snmpwalk -v2c -c public";
45 46
$query = "$snmp $ip " . $oid . " 2>/dev/null";
47 48
return $query;
89
49
}
50 51 52 53 54 55 56 57
#Eerste argument = IP #Tweede argument = OID sub snmpGetV1 { $ip = $_[0]; $ip = $_[1]; $snmp = "/usr/bin/snmpget -v1 -c public";
58
$query = "$snmp $ip " . $oid . " 2>/dev/null";
59 60
return $query;
61 62
}
63 64 65 66 67 68 69 70
#Eerste argument = IP #Tweede argument = OID sub snmpWalkV1 { $ip = $_[0]; $ip = $_[1]; $snmp = "/usr/bin/snmpwalk -v1 -c public";
71
$query = "$snmp $ip " . $oid . " 2>/dev/null";
72 73
return $query;
74 75
}
76 77 78 79 80 81 82
#Deze functie haalt de spaties ervoor en erachter weg sub cleanString { $string = $_[0]; $string =~ s/^\s+//; $string =~ s/\s+$//;
83
return $string;
84 85
}
86 87 88 89 90 91 92 93 94
#Arg1 = Titel grafiek #Arg2 = Categorie naam #Arg3 = Naam plugin index pagina sub createMultiGraph { $title = $_[0]; $category = $_[1]; $munincat = $_[2];
95 96 97 98
$title = cleanString($title); $category = cleanString($category); $munincat = cleanString($munincat);
99 100 101 102
print "multigraph $munincat\n"; print "graph_title $title\n"; print "graph_category $category\n";
90
print "graph_args --base 1000 -l 0\n";
103 104 105
}
106 107 108 109 110 111 112
#Arg1 = Titel grafiek #Arg2 = Categorie naam sub createSingleGraph { $title = $_[0]; $category = $_[1];
113
$title = cleanString($title); $category = cleanString($category);
114 115 116
print "graph_title $title\n"; print "graph_category $category\n"; print "graph_args --base 1000 -l 0\n";
117 118 119 120
}
121 122 123 124 125 126 127 128 129
#Arg1 = Naam label #Arg2 = value label #Arg3 = Beschrijving label sub createGraphLabel { $name = $_[0]; $val = $_[1]; $description = $_[2];
130
$name = cleanString($name); $val = cleanString($val); $description = cleanString($description);
131 132 133 134
print $name.".type GAUGE\n"; print $name.".label $description\n"; print $name.".draw LINE1\n";
135 136 137 138
print $name.".value $val\n";
139 140
}
141 142 143 144 145 146 147 148 149 150
#Arg1 = IP #Arg2 Pagina.cgi sub curl { $ip = $_[0]; $pagina = $_[1]; $out = ‘perl /etc/scripts/hans.pl $ip $pagina‘; return $out; }
91
14.14 NeighborDiscoveryTest1.pl
1 2 3 4 5
6 7 8 9 10 11 12
$ip = ’10.98.250.195’; &zoek; sub zoek { $out = ‘/usr/bin/snmpwalk -v2c -c public $ip ←1.3.6.1.4.1.14988.1.1.11.1.1.2 2>/dev/null‘; @splits = split(/: /,$out); splice @splits,0,1; foreach $item (@splits){ @splits1 = split(/\n/,$item); print "@splits1[0]\n"; } }
92
14.15 NeighborDiscoveryTest2.pl
1 2 3
use warnings; use IO::Socket; my $start_run = time();
4 5 6 7
$ip = ’10.98.250.195’; %gebruikt;
8 9
zoek($ip);
10 11 12 13 14
15
sub zoek { $a = $_[0]; $out = ‘/usr/bin/snmpwalk -v2c -c public $a ←1.3.6.1.4.1.14988.1.1.11.1.1.2 2>/dev/null‘; $mk = ‘/usr/bin/snmpwalk -v2c -c public $a ←1.3.6.1.4.1.14988.1.1.11.1.1.5 2>/dev/null‘;
16 17 18 19 20 21
@a = split(/\n/,$out); foreach $adres(@a){ @ipad=split(/: /, $adres); push(@adressen,$ipad[1]); }
22 23 24 25 26 27 28
@a = split(/\n/,$mk); foreach $id(@a){ @ipad=split(/: /, $id); push(@b,$ipad[1]); }
29 30 31 32
#$tel = -1; $tel = 0; foreach $val(@adressen){
33 34 35 36
$end_run = time(); $run_time = $end_run - $start_run;
37 38 39 40 41 42 43 44 45
if($b[$tel] eq ’"MikroTik"’){ if(!exists $gebruikt{$val}){ $gebruikt{$val}=’’; $aantal++; print "$aantal \t $val \t \t \t $run_time\n"; zoek($val); } }
46 47 48
if($b[$tel] eq ’"N5N"’){ if(!exists $antenne{$val}){
93
#push(@c,$val); $antenne{$val}=’’; print "Antenne \t \t $val \t $run_time\n";
49 50 51
}
52
}
53 54
$tel++; print "\n$tel\n";
55 56 57
}
58 59 60 61
# @splits = split(/: /,$out); # splice @splits,0,1; # foreach $item (@splits){ # @splits1 = split(/\n/,$item); # $ip = $splits1[0];
62 63 64 65 66 67
# if(!exists $gebruikt{$ip}){
68 69 70
# $gebruikt{$ip}=’’; # print "$ip\n"; # zoek($ip);
71 72 73 74 75
# }
76 77
# }
78 79
}
80 81 82 83 84 85 86 87
sub schrijf(){ open FILE, ">mikrotik-snmp.txt" or die $!; foreach my $key ( sort keys %gebruikt ) { print FILE $key . "\n"; } close(FILE);
88
open FILE, ">nano-snmp.txt" or die $!; foreach my $key ( sort keys %antenne) { print FILE $key . "\n"; } close(FILE);
89 90 91 92 93 94 95
}
96 97
schrijf();
98 99 100 101
my $end_run = time(); my $run_time = $end_run - $start_run; print "Job took $run_time seconds\n";
94
14.16 NeighborDiscoveryTest3.pl
1 2 3
use warnings; use IO::Socket; my $start_run = time();
4 5 6 7 8 9
$ip = ’10.98.250.195’; my @adressen; my @b; zoek($ip);
10 11 12 13 14
15
sub zoek { $a = $_[0]; $out = ‘/usr/bin/snmpwalk -v2c -c public $a ←1.3.6.1.4.1.14988.1.1.11.1.1.2 2>/dev/null‘; $mk = ‘/usr/bin/snmpwalk -v2c -c public $a ←1.3.6.1.4.1.14988.1.1.11.1.1.5 2>/dev/null‘;
16 17 18 19 20 21
@a = split(/\n/,$out); foreach $adres(@a){ @ipad=split(/: /, $adres); push(@adressen,$ipad[1]); }
22 23 24 25 26 27 28
@a = split(/\n/,$mk); foreach $id(@a){ @ipad=split(/: /, $id); push(@b,$ipad[1]); }
29 30 31 32
#$tel = -1; my $tel = 0; foreach $val(@adressen){
33 34 35 36
$end_run = time(); $run_time = $end_run - $start_run;
37 38 39 40 41 42 43 44 45
if($b[$tel] ne ’’){ if($b[$tel] eq ’"MikroTik"’){ if(!exists $gebruikt{$val}){ $gebruikt{$val}=’’; $aantal++; print "$aantal \t $val \t \t \t $run_time\n"; zoek($val); }
46 47
}
48
95
if($b[$tel] eq ’"N5N"’){ if(!exists $antenne{$val}){ #push(@c,$val); $antenne{$val}=’’; print "Antenne \t \t $val \t $run_time\n"; } }
49 50 51 52 53 54 55
} $tel++;
56 57 58
}
59 60 61 62
# @splits = split(/: /,$out); # splice @splits,0,1; # foreach $item (@splits){ # @splits1 = split(/\n/,$item); # $ip = $splits1[0];
63 64 65 66 67 68
# if(!exists $gebruikt{$ip}){
69 70 71
# $gebruikt{$ip}=’’; # print "$ip\n"; # zoek($ip);
72 73 74 75 76
# }
77 78
# }
79 80
}
81 82 83 84 85 86 87 88
sub schrijf(){ open FILE, ">mikrotik-snmp.txt" or die $!; foreach my $key ( sort keys %gebruikt ) { print FILE $key . "\n"; } close(FILE);
89
open FILE, ">nano-snmp.txt" or die $!; foreach my $key ( sort keys %antenne) { print FILE $key . "\n"; } close(FILE);
90 91 92 93 94 95 96
}
97 98
schrijf();
99 100 101 102
my $end_run = time(); my $run_time = $end_run - $start_run; print "Job took $run_time seconds\n";
96
97
14.17 snmp-getbulk.pl
1
use Net::SNMP;
2 3 4 5 6
# requires a hostname and a community string as its arguments ($session,$error) = Net::SNMP->session(Hostname => $ARGV[0], Community => $ARGV[1], Version => ’snmpv2c’);
7 8
die "session error: $error" unless ($session);
9 10 11 12
# iso.org.dod.internet.mgmt.mib-2.interfaces.ifNumber.0 = # 1.3.6.1.2.1.2.1.0 $result = $session->get_bulk_request("1.3.6.1.4.1.14988.1.1.11.1.1.2");
13 14
die "request error: ".$session->error unless (defined $result);
15 16
$session->close;
17 18
print "Number of interfaces: ".$result->{"1.3.6.1.4.1.14988.1.1.11.1.1.2←"}."\n";
98
14.18 snmpneighbors.pl
1 2 3
use warnings; use IO::Socket; my $start_run = time();
4 5 6 7 8 9
$ip = ’10.98.250.195’; my @adressen; my @b = null; zoek($ip);
10 11 12 13 14
15
sub zoek { $a = $_[0]; $out = ‘/usr/bin/snmpwalk -v2c -c public $a ←1.3.6.1.4.1.14988.1.1.11.1.1.2 2>/dev/null‘; $mk = ‘/usr/bin/snmpwalk -v2c -c public $a ←1.3.6.1.4.1.14988.1.1.11.1.1.5 2>/dev/null‘;
16 17 18 19 20 21
@a = split(/\n/,$out); foreach $adres(@a){ @ipad=split(/: /, $adres); push(@adressen,$ipad[1]); }
22 23 24 25 26 27 28
@a = split(/\n/,$mk); foreach $id(@a){ @ipad=split(/: /, $id); push(@b,$ipad[1]); }
29 30 31 32
#$tel = -1; my $tel = 0; foreach $val(@adressen){
33 34 35 36
$end_run = time(); $run_time = $end_run - $start_run;
37 38 39 40 41 42 43
44 45
if($b[$tel] ne ’’){ if(!exists $gebruikt{$val}){ $gebruikt{$val}=$b[$tel]; $aantal++; print "$aantal \t $val \t $gebruikt{$val}\t \t ←$run_time\n"; zoek($val); }
46 47
}
99
$tel++;
48 49
}
50 51 52 53
}
54 55 56 57 58 59 60 61
sub schrijf(){ open FILE, ">mikrotik-snmp.txt" or die $!; foreach my $key ( sort keys %gebruikt ) { print FILE $key . "\n"; } close(FILE);
62
open FILE, ">nano-snmp.txt" or die $!; foreach my $key ( sort keys %antenne) { print FILE $key . "\n"; } close(FILE);
63 64 65 66 67 68 69
}
70 71
schrijf();
72 73 74 75
my $end_run = time(); my $run_time = $end_run - $start_run; print "Job took $run_time seconds\n";
100
14.19 snmpneighbors2.pl
1 2 3 4 5 6 7 8 9
use warnings; use IO::Socket; my $start_run = time();
10 11 12 13 14 15
$ip = ’10.98.250.195’; my @adressen; my @b = null; zoek($ip);
16 17 18 19 20
21
sub zoek { $a = $_[0]; $out = ‘/usr/bin/snmpbulkget -v2c -c public $a ←1.3.6.1.4.1.14988.1.1.11.1.1.2 2>/dev/null‘; $mk = ‘/usr/bin/snmpbulkget -v2c -c public $a ←1.3.6.1.4.1.14988.1.1.11.1.1.5 2>/dev/null‘;
22 23 24 25 26 27
@a = split(/\n/,$out); foreach $adres(@a){ @ipad=split(/: /, $adres); push(@adressen,$ipad[1]); }
28 29 30 31 32 33 34
@a = split(/\n/,$mk); foreach $id(@a){ @ipad=split(/: /, $id); push(@b,$ipad[1]); }
35 36 37 38
#$tel = -1; my $tel = 0; foreach $val(@adressen){
39 40 41 42
$end_run = time(); $run_time = $end_run - $start_run;
43 44 45 46 47 48
if($b[$tel] ne ’’){ if(!exists $gebruikt{$val}){ $gebruikt{$val}=$b[$tel]; $aantal++;
101
print "$aantal \t $val \t $gebruikt{$val}\t \t ←$run_time\n"; if ( $b[$tel] eq "MikroTik"){ zoek($val);
49
50 51
}
52
}
53 54
} $tel++;
55 56 57
}
58 59 60 61
}
62 63 64 65 66 67 68 69
sub schrijf(){ open FILE, ">mikrotik-snmp.txt" or die $!; foreach my $key ( sort keys %gebruikt ) { print FILE $key . "\n"; } close(FILE);
70
open FILE, ">nano-snmp.txt" or die $!; foreach my $key ( sort keys %antenne) { print FILE $key . "\n"; } close(FILE);
71 72 73 74 75 76 77
}
78 79
schrijf();
80 81 82 83
my $end_run = time(); my $run_time = $end_run - $start_run; print "Job took $run_time seconds\n";
102
14.20 snmpwalkloop.pl
1 2
$ips=$ARGV[0]; $oids=$ARGV[1];
3 4 5
$var = 0; @iplist;
6 7 8
open(IPS, "<$ips") or die "IPS file not found!";
9 10 11 12 13 14
while(
){ push(@iplist,"$_"); $var++; }
15 16
for ($count = 0; $count < $var; $count++) { open(OIDS, "<$oids") or die "OIDS file not found!"; while(){ $oid = $_; $ip = $iplist[$count]; chomp($ip); $out = ‘snmpwalk -v2c -c public $ip $oid ‘; @splits = split(/: /,$out); $out = @splits[1]; print"$ip\t\t$out"; } close OIDS;
17 18 19 20 21 22 23 24 25 26 27 28 29
}
103
14.21 snmp_CCQ_10.96.6.15.pl
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#!/usr/bin/env perl use lib ("/etc/scripts"); require dbScriptje; require MuninFuncties; $woord="a"; $ipp="10.96.6.15"; MuninFuncties::createSingleGraph("CCQ - 10.96.6.15","CCQ 10.96.0.0 16"); $out = ‘/usr/bin/snmpwalk -v2c -c public 10.96.6.15 ←1.3.6.1.4.1.14988.1.1.1.3.1.10 -t 2 2>/dev/null‘; if (length($out) > 55){ @splitss=split("\n",$out); $teller=0; foreach $item(@splitss){ @splits = split(/: /,$item); $labelname = "$ipp - $teller"; MuninFuncties::createGraphLabel($woord,$splits[1],$labelname); $woord.="a"; $teller++; } }else{ @splits = split(/: /,$out); $res = @splits[1]; MuninFuncties::createGraphLabel($woord,$res,$ipp); $woord.="a"; }
104
14.22 snmp_Curl_AantalMacsPerMode.pl
1
#!/usr/bin/env perl
2 3 4 5 6 7
open(MYFILE, "/etc/scripts/bestanden/WirelessIp.txt"); while ($line = <MYFILE>){ push(@ips,$line); } close(MYFILE);
8 9 10 11 12 13
14 15
foreach $ip(@ips){ $ip = substr $ip,0,length($ip)-1; $mode=‘perl /etc/scripts/hans.pl $ip status.cgi | grep ’"mode"’‘; push(@modes,$mode); $aantal = ‘perl /etc/scripts/hans.pl $ip status.cgi | grep count | ←grep -o [0-9]*‘; push(@aantallen,$aantal); }
16 17
#Create the graph
18 19 20 21 22
print print print print
"graph_title Aantal WlanConnections Via Curl\n"; "graph_category Wireless Connections NanoStation M5\n"; "graph_args --base 1000 -l 0\n"; "graph scale no\n";
23 24 25 26
$woord="b"; $teller=0; &zoek;
27 28 29 30 31 32 33 34 35 36
sub zoek{ foreach $item(@modes){ $getal=$aantallen[$teller]; $x=$ips[$teller]; @splits = split(/: /,$item); $res = $splits[1]; $lengte=length($res); $res = substr $res,1,$lengte-4; #print "$x\t$res\t$getal\n";
37 38
#create the label ( line in the graph ) print "$woord.type GAUGE\n"; print "$woord.label $x\n"; print "$woord.draw LINE1\n";
39 40 41 42 43
#give the label a value print "$woord.value $getal";
44 45 46
$teller++; $woord.="a";
47 48 49
}
105
50
}
106
14.23 snmp_Curl_Ccq.pl
1
#!/usr/bin/env perl
2 3 4 5 6 7
open(MYFILE, "/etc/scripts/bestanden/WirelessIp.txt"); while ($line = <MYFILE>){ push(@ips,$line); } close(MYFILE);
8 9 10 11 12 13
foreach $ip(@ips){ $ip = substr $ip,0,length($ip)-1; $ccq=‘perl /etc/scripts/hans.pl $ip status.cgi | grep ’"ccq"’‘; push(@ccqs,$ccq); }
14 15
#Create the graph
16 17 18 19 20
print print print print
"graph_title CCQ Via Curl\n"; "graph_category CCQ NanoStation M5\n"; "graph_args --base 1000 -l 0\n"; "graph scale no\n";
21 22 23 24
$woord="b"; $teller=0; &zoek;
25 26 27 28 29 30 31
sub zoek{ foreach $item(@ccqs){ @splits = split(/: /,$item); $res = $splits[1]; $lengte=length($res); $res = substr $res,0,$lengte-2;
32
#create the label ( line in the graph ) print "$woord.type GAUGE\n"; print "$woord.label $ips[teller]\n"; print "$woord.draw LINE1\n";
33 34 35 36 37
#give the label a value print "$woord.value $res\n";
38 39 40
$teller++; $woord.="a";
41 42
}
43 44
}
107
14.24 snmp_Curl_Distance.pl
1
#!/usr/bin/env perl
2 3
#Foreach over alle IPS
4 5 6 7 8 9
open(MYFILE, "/etc/scripts/bestanden/WirelessIp.txt"); while ($line = <MYFILE>){ push(@ips,$line); } close(MYFILE);
10 11 12 13
14 15 16 17 18
foreach $ip(@ips){ $ip = substr $ip,0,length($ip)-1; $mode=‘perl /etc/scripts/hans.pl $ip status.cgi | grep ’"distance"’←‘; @splits = split(/: /,$mode); $splitt=$splits[1]; $res = substr $splitt,0,$lengte-2; push(@modes,$res); }
19 20
#Create the graph
21 22 23 24 25
print print print print
"graph_title Aantal Distance Via Curl\n"; "graph_category Distance NanoStation M5\n"; "graph_args --base 1000 -l 0\n"; "graph scale no\n";
26 27 28 29
$woord="b"; $teller=0; &zoek;
30 31 32
sub zoek{ foreach $item(@modes){
33
$x=$ips[$teller];
34 35
#create the label ( line in the graph ) print "$woord.type GAUGE\n"; print "$woord.label $x\n"; print "$woord.draw LINE1\n";
36 37 38 39 40
#give the label a value print "$woord.value $item\n";
41 42 43
$teller++; $woord.="a";
44 45
}
46 47
}
108
14.25 snmp_Curl_SignalStrength.pl
1
#!/usr/bin/env perl
2 3 4 5 6 7
open(MYFILE, "/etc/scripts/bestanden/WirelessIp.txt"); while ($line = <MYFILE>){ push(@ips,$line); } close(MYFILE);
8 9 10 11
12 13
foreach $ip(@ips){ $ip = substr $ip,0,length($ip)-1; $resultaat = ‘perl /etc/scripts/hans.pl $ip status.cgi | grep ’"←signal"’‘; push(@resultaten,$resultaat); }
14 15
#Create the graph
16 17 18 19 20
print print print print
"graph_title Signal Strength Via Curl\n"; "graph_category Signal Strength NanoStation M5\n"; "graph_args --base 1000 -l 0\n"; "graph scale no\n";
21 22 23 24
$woord="b"; $teller=0; &zoek;
25 26 27 28 29 30 31 32 33
sub zoek{ foreach $item(@resultaten){ $getal=$aantallen[$teller]; $x=$ips[$teller]; @splits = split(/, /,$item); $res = $splits[0]; @splits2 = split(/: /,$res); $res2 = $splits2[1];
34
#create the label ( line in the graph ) print "$woord.type GAUGE\n"; print "$woord.label $x\n"; print "$woord.draw LINE1\n";
35 36 37 38 39
#give the label a value print "$woord.value $res2\n";
40 41 42
$teller++; $woord.="a";
43 44
}
45 46
}
109
14.26 snmp_Curl_TxRx.pl
1
#!/usr/bin/env perl
2 3 4 5 6 7
open(MYFILE, "/etc/scripts/bestanden/WirelessIp.txt"); while ($line = <MYFILE>){ push(@ips,$line); } close(MYFILE);
8 9 10 11 12 13
foreach $ip(@ips){ $ip = substr $ip,0,length($ip)-1; $tx=‘perl /etc/scripts/hans.pl $ip status.cgi | grep ’"txrate"’‘; push(@txs,$tx); }
14 15 16 17 18 19 20
foreach $item(@txs) { @splits = split(/, /,$item); push(@rx,$splits[0]); push(@tx,$splits[1]); }
21 22 23 24 25 26
foreach $item2(@rx) { @splitss = split(/: /,$item2); push(@rxx,substr $splitss[1],1,length($splitss[1])-2); }
27 28 29 30 31 32
foreach $item3(@tx) { @splitsss = split(/: /,$item3); push(@txx,substr $splitsss[1],1,length($splitsss[1])-4); }
33 34
#Create the graph
35 36 37 38 39
print print print print
"graph_title TxRx Via Curl\n"; "graph_category TxRx via Curl\n"; "graph_args --base 1000 -l 0\n"; "graph scale no\n";
40 41 42 43
$woord="b"; $teller=0; &zoek;
44 45 46
sub zoek{ foreach $ip(@ips){
47 48 49 50
#create the label ( line in the graph ) print "$woord.type GAUGE\n"; print "$woord.label TX $ip\n";
110
print "$woord.draw LINE1\n";
51 52
#give the label a value print "$woord.value $txx[$teller]\n";
53 54 55
$woord.="z";
56 57
#create the label ( line in the graph ) print "$woord.type GAUGE\n"; print "$woord.label RX $ip\n"; print "$woord.draw LINE1\n";
58 59 60 61 62
#give the label a value print "$woord.value $rxx[$teller]\n";
63 64 65
$teller++; $woord.="a";
66 67
}
68 69
}
111
14.27 snmp_download2vreemdenanostations.pl
1
#!/usr/bin/env perl
2 3 4
$ip = ’10.97.245.93’; $ip2= ’10.96.253.17’;
5 6
7 8 9
$out = ‘/usr/bin/snmpwalk -v1 -c public $ip 1.3.6.1.2.1.2.2.1.10.5 2>/←dev/null‘; @splits = split(/: /,$out); $res = @splits[1]/1024/1024; $resultaat = sprintf "%.2f", $res;
10 11
12 13 14
$out2 = ‘/usr/bin/snmpwalk -v1 -c public $ip2 1.3.6.1.2.1.2.2.1.10.5 2>/←dev/null‘; @splits2 = split(/: /,$out2); $res2 = @splits2[1]/1024/1024; $resultaat2 = sprintf "%.2f", $res2;
15 16 17
#Create the graph
18 19 20 21 22
print print print print
"graph_title Download vreemde AP\n"; "graph_category Wireless Points Vreemde\n"; "graph_args --base 1000 -l 0\n"; "graph scale no\n";
23 24 25 26 27
#create the first label ( line in the graph ) print "dl.type GAUGE\n"; print "dl.label Download AP 10.97.245.93\n"; print "dl.draw LINE1\n";
28 29 30
#give the label a value print "dl.value $resultaat\n";
31 32 33 34 35
#create the second label ( line in the graph ) print "up.type GAUGE\n"; print "up.label Download AP 10.96.253.17\n"; print "up.draw LINE1\n";
36 37 38
#give the label a value print "up.value $resultaat2\n"
112
14.28 snmp_MikroTikMetWifi_CCQ.pl
1
#!/usr/bin/env perl
2 3 4 5 6 7
open(MYFILE, "/etc/scripts/bestanden/WirelessIpMikroTikMetWifi.txt"); while ($line = <MYFILE>){ push(@ips,$line); } close(MYFILE);
8 9
$woord="a";
10 11 12 13 14 15
foreach $ip(@ips) { $ip = substr $ip,0,length($ip)-1; splice(@uitkomsten); #Create the graph
16 17 18 19 20
print print print print
"graph_title CCQ Wiresless MikroTik $ip\n"; "graph_category CCQ Wiresless MikroTiks\n"; "graph_args --base 1000 -l 0\n"; "graph scale no\n";
21 22
23 24 25 26 27 28 29 30 31 32 33 34 35 36
$out = ‘/usr/bin/snmpwalk -v2c -c public $ip ←1.3.6.1.4.1.14988.1.1.1.3.1.10 2>/dev/null‘; if (length($out) > 55) { @splitss=split("\n",$out); foreach $item(@splitss) { @splits = split(/: /,$item); push(@uitkomsten,$splits[1]); } foreach $item2(@uitkomsten) { #create the first label ( line in the graph ) print "$woord.type GAUGE\n"; print "$woord.label $ip\n"; print "$woord.draw LINE1\n";
37 38 39 40 41 42 43 44 45 46 47 48 49
#give the label a value print "$woord.value $item2\n"; $woord.="a"; } } else { @splits = split(/: /,$out); $res = @splits[1]; #create the first label ( line in the graph ) print "$woord.type GAUGE\n"; print "$woord.label $ip\n";
113
print "$woord.draw LINE1\n";
50 51
#give the label a value print "$woord.value $res\n"; $woord.="a";
52 53 54
}
55 56
}
114
14.29 snmp_MikroTikMetWifi_CCQ2.pl
1 2 3
4 5 6 7 8
#!/usr/bin/env perl use lib("/etc/scripts"); use MuninFuncties qw(createMultiGraph createSingleGraph ←createGraphLabel); open(MYFILE, "/etc/scripts/bestanden/WirelessIpMikroTikMetWifi.txt"); while ($line = <MYFILE>){ push(@ips,$line); } close(MYFILE);
9 10
$woord="a";
11 12 13 14 15
foreach $ip(@ips){ $ip = substr $ip,0,length($ip)-1; splice(@uitkomsten); #Create the graph
16 17
#
createMultiGraph("CCQ Wireless Mikrotik $ip","CCQ Wiresless ←MikroTiks van uw ma","CCQ $ip");
18 19
20 21
#
22
23 24 25 26 27 28 29 30
31
#
32 33
$out = ‘/usr/bin/snmpwalk -v2c -c public $ip ←1.3.6.1.4.1.14988.1.1.1.3.1.10 2>/dev/null‘; if (length($out) > 55){ createSingleGraph("CCQ Wireless Mikrotik $ip","CCQ Wiresless ←MikroTiks van $ip"); createMultiGraph("CCQ Wireless Mikrotik $ip","CCQ Wiresless ←MikroTiks van $ip","CCQ $ip"); @splitss=split("\n",$out); foreach $item(@splitss){ @splits = split(/: /,$item); createGraphLabel($woord,$splits[1],$ip); $woord.="a"; } }else{ createSingleGraph("CCQ Wireless Mikrotik $ip","CCQ Wiresless ←MikroTiks van $ip"); createMultiGraph("CCQ Wireless Mikrotik $ip","CCQ Wiresless ←MikroTiks van $ip","CCQ $ip"); @splits = split(/: /,$out); $res = @splits[1];
34
createGraphLabel($woord,$res,$ip);; $woord.="a";
35 36
}
37 38
}
115
14.30 snmp_MikroTikMetWifi_TxRx.pl
1
#!/usr/bin/env perl
2 3
$ip = ’10.98.251.241’;
4 5 6
7 8
#TX $out = ‘/usr/bin/snmpwalk -v2c -c public $ip ←1.3.6.1.4.1.14988.1.1.1.3.1.2.10 2>/dev/null‘; @splits = split(/: /,$out); $res = @splits[1];
9 10 11
12 13
#RX $out2 = ‘/usr/bin/snmpwalk -v2c -c public $ip ←1.3.6.1.4.1.14988.1.1.1.3.1.3.10 2>/dev/null‘; @splits2 = split(/: /,$out2); $res2 = @splits2[1];
14 15
#Create the graph
16 17 18 19 20
print print print print
"graph_title TxRx MikroTik met Wifi\n"; "graph_category TxRx MikroTik Wifi\n"; "graph_args --base 1000 -l 0\n"; "graph scale no\n";
21 22 23 24 25 26 27 28
#create the label ( line in the graph ) print "tx.type GAUGE\n"; print "tx.label TX $ip\n"; print "tx.draw LINE1\n"; #give the label a value print "tx.value $res\n";
29 30 31 32 33
#create the label ( line in the graph ) print "rx.type GAUGE\n"; print "rx.label RX $ip\n"; print "rx.draw LINE1\n";
34 35 36
#give the label a value print "rx.value $res2\n";
116
14.31 snmp_MikroTikMetWifi_WifiStats.pl
1
#!/usr/bin/env perl
2 3
$ip = ’10.98.251.241’;
4 5
6 7
$out = ‘/usr/bin/snmpwalk -v2c -c public $ip ←1.3.6.1.4.1.14988.1.1.1.3.1.6.10 2>/dev/null‘; @splits = split(/: /,$out); $res = @splits[1];
8 9
#Create the graph
10 11 12 13 14
print print print print
"graph_title Aantal Wiresless Clients MikroTik .98.251.241\n"; "graph_category Wiresless Clients MikroTik\n"; "graph_args --base 1000 -l 0\n"; "graph scale no\n";
15 16 17 18 19
#create the first label ( line in the graph ) print "dl.type GAUGE\n"; print "dl.label $ip\n"; print "dl.draw LINE1\n";
20 21 22
#give the label a value print "dl.value $res\n";
117
14.32 snmp_MikroTik_Voltage.pl
1
#!/usr/bin/env perl
2 3
$ip = ’10.98.248.34’;
4 5
6 7
$out = ‘/usr/bin/snmpwalk -v2c -c public $ip .1.3.6.1.2.1.33.1.2.5 2>/←dev/null‘; @splits = split(/: /,$out); $res = @splits[1];
8 9
#Create the graph
10 11 12 13 14
print print print print
"graph_title Voltage MikroTik .98.251.241\n"; "graph_category Voltage MikroTik\n"; "graph_args --base 1000 -l 0\n"; "graph scale no\n";
15 16 17 18 19
#create the first label ( line in the graph ) print "dl.type GAUGE\n"; print "dl.label $ip\n"; print "dl.draw LINE1\n";
20 21 22
#give the label a value print "dl.value $res\n";
118
14.33 snmp_SignalStrengthPerApPerMac.pl
1
#!/usr/bin/env perl
2 3
$ip = ’10.98.248.218’;
4 5
6
$out = ‘/usr/bin/snmpwalk -v2c -c public $ip ←1.3.6.1.4.1.14988.1.1.1.2.1.1 2>/dev/null‘; @splitsEnter = split("\n",$out);
7 8 9 10 11 12 13
foreach $item(@splitsEnter) { @splitsDubbelePunt = split(/: /,$item); $splitsDubbelePunt[1] =~ s/ /:/g; push(@macs,substr $splitsDubbelePunt[1],0,17); }
14 15
16
$out2 = ‘/usr/bin/snmpwalk -v2c -c public $ip ←1.3.6.1.4.1.14988.1.1.1.2.1.3 2>/dev/null‘; @splitsEnter2 = split("\n",$out2);
17 18 19 20 21 22 23
foreach $item2(@splitsEnter2) { @splitsDubbelePunt2 = split(/: /,$item2); $splitsDubbelePunt2[1] =~ s/ /:/g; push(@strengths,$splitsDubbelePunt2[1]); }
24 25
#Create the graph
26 27 28 29 30
print print print print
"graph_title SignalStrength Wireless $ip\n"; "graph_category SignalStrenth Wireless\n"; "graph_args --base 1000 -l 0\n"; "graph scale no\n";
31 32 33 34
$woord="b"; $teller=0; &zoek;
35 36 37 38 39 40 41
sub zoek{ foreach $item(@macs){ #create the label ( line in the graph ) print "$woord.type GAUGE\n"; print "$woord.label $item\n"; print "$woord.draw LINE1\n";
42
#give the label a value print "$woord.value $strengths[$teller]\n";
43 44 45
$teller++; $woord.="a";
46 47 48
}
119
49
}
120
14.34 VendorDef.pl
1
#!/usr/bin/env perl
2 3 4
use lib ("/etc/scripts"); require dbScriptje;
5 6 7
dbScriptje::ConnectToMySql(); %test = dbScriptje::returnAantalVendors();
8 9
$tot = dbScriptje::returnAantalClients();
10 11 12 13 14
print "graph_title Procentueel aantal clients per vendor\n"; print "graph_category Vendor Def\n"; print "graph_args -l 0 -u 1\n"; #print "graph scale no\n";
15 16 17 18
$woord="a"; $waardeTot=0; $teller=1;
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
foreach $key (keys %test) { #create the first label ( line in the graph ) print "$woord.type GAUGE\n"; print "$woord.label $key\n"; if($teller>1) { print "$woord.draw STACK\n"; } else { print "$woord.draw AREA\n"; } #give the label a value $waarde = $test{$key}/$tot*100; $waardeTot = $waardeTot + $waarde; print "$woord.value $waardeTot\n"; $woord.="a"; $teller++; }
121
14.35 VendorSchaal.pl
1
#!/usr/bin/env perl
2 3 4
use lib ("/etc/scripts"); require dbScriptje;
5 6 7
dbScriptje::ConnectToMySql(); %test = dbScriptje::returnAantalVendors();
8 9
$tot = dbScriptje::returnAantalClients();
10 11 12 13 14 15
print "graph_title Procentueel aantal clients per vendor\n"; print "graph_category Vendor Schaal\n"; print "graph_args --base 1000 -l 0 -u 100 -r\n"; #print "graph_args -l 0 -u 1\n"; print "graph_scale no\n";
16 17 18 19
$woord="a1"; $waardeTot=0; $teller=1;
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
foreach $key (sort{ $test{$a}<=>$test{$b} } keys %test) { #create the first label ( line in the graph ) print "$woord.type GAUGE\n"; print "$woord.label $key\n"; if($teller>1) { print "$woord.draw STACK\n"; } else { print "$woord.draw AREA\n"; } #give the label a value $waarde = $test{$key}/$tot*100; print "$woord.value $waarde\n"; $teller++; $woord="a$teller";
38 39
}
122
14.36 werkend.pl
1 2 3 4 5 6
use use use use use use
dbScriptje; Data::Dumper; IO::Socket; Mtik ; List::MoreUtils qw(uniq); warnings;
7 8 9 10 11 12 13
$mtik_host = "10.98.250.195"; $mtik_username = "api_user"; $mtik_password = "api_user_pass"; %gebruikt = (); %devs = (); @devices = ();
14 15
sub zoek{
16 17 18 19
20
$mtik_host = $_[0]; if (Mtik::login($mtik_host,$mtik_username,$mtik_password)){ my @cmd = ("/ip/neighbor/getall", "=.proplist=identity,software-←id,platform,interface,board,address"); my($retval,@results) = Mtik::raw_talk(\@cmd);
21 22
foreach my $result (@results) {
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46
if($result eq "!re"){ if(!exists $devs{$currentline}){ $devs{$currentline}=’’; push @devices, { %devicevalues }; } %devicevalues=(); }else{ $result =~ m/=(.*?)=/; my $index = $1; $devicevalues{$index}=${^POSTMATCH}; #print "${^POSTMATCH}\n"; } if($result =~ m/(\d+\.\d+\.\d+\.\d+)/){ $currentline=$1; if (!exists $gebruikt{$currentline}){ $gebruikt{$currentline}=’’; $socket = IO::Socket::INET->new(Proto=>"tcp", ←PeerPort=>"8728", PeerAddr=>"$currentline", ←Timeout=>1); if($socket){ print "\n"; $aantal++; print $aantal."\n"; zoek($currentline); }
123
#Voor zoeken : Checken port open, en pingen of ←antwoord; #Voor port was er ’openport’;
47
48 49
}
50
}
51 52
} Mtik::logout;
53 54
}
55 56
}
57 58 59
zoek($mtik_host); schrijfweg();
60 61 62 63
sub schrijfweg{ dbScriptje::ConnectToMySql(); @list = uniq(@devices);
64
foreach $device(@list){
65 66
$address = ""; $macaddress = ""; $interface = ""; $identity = ""; $platform = ""; $softwareid = ""; $board = "";
67 68 69 70 71 72 73 74
while ( my ($key, $value) = each(%$device) ) { $key =~ s/-//; ${$key}=$value; print ${$key}; }
75 76 77 78 79 80
#print $address."\t"; #print $macaddress."\t"; #print $interface."\t"; #print $identity."\t"; #print $platform."\t"; #print $softwareid."\t"; #print $board."\t";
81 82 83 84 85 86 87 88 89
dbScriptje::InsertInInterfaces($address,$macaddress, $interface,←$identity, $platform, $softwareid, $board); print "\n --------------------------------------- \n";
90
91
} #print Dumper(\@list);
92 93 94 95
}
124
14.37 zoekinfo.pl
1 2 3 4
use IO::Socket; use Mtik; use warnings;
5 6 7 8 9 10
$mtik_host = "10.98.250.195"; $mtik_username = "api_user"; $mtik_password = "api_user_pass"; $nr=0; %gebruikt;
11 12
sub zoek{
13
$mtik_host = $_[0]; open(MYFILE, ’>>adressen.txt’); if (Mtik::login($mtik_host,$mtik_username,$mtik_password)){ my @cmd = ("/ip/neighbor/getall", "=.proplist=address,board,←identity"); my($retval,@results) = Mtik::raw_talk(\@cmd);
14 15 16 17
18 19
foreach my $result (@results) { print "$result \t"; if($result =~ m/(\d+\.\d+\.\d+\.\d+)/){ $currentline=$1; if (!exists $gebruikt{$currentline}){ $gebruikt{$currentline}=’’; $socket = IO::Socket::INET->new(Proto=>"tcp", ←PeerPort=>"8728", PeerAddr=>"$currentline", ←Timeout=>1); if($socket){ $nr++; print MYFILE "$currentline\n"; print "$nr \t $result \n"; zoek($currentline); } } }
20 21 22 23 24 25 26
27 28 29 30 31 32 33 34 35
} close MYFILE; Mtik::logout;
36 37 38
}
39 40
}
41 42
zoek($mtik_host);
125