Wim Caudenbergh Ilco Vermeulen Jarrik Nys Wouter Mouton 3 Toegepaste informatica, reeks 6 Eindwerk Wireless België Monitoring



Vergelijkbare documenten
ISW Presents Debian Homeserver Workshop

Installeer Apache2: Landstede februari 2009 versie 3 1 Bertil Hoentjen

Chapter 4. eenvoudige webserver opzetten

Les 4 Installeren Apache2 Php MySQL

Denit Backup instellen op een Linux server

IAAS HANDLEIDING - SOPHOS FIREWALL

Hands-on TS adapter IE advanced

Raspberry Pi Plex server installeren

Zonnepanelen Hoe krijg je de data op je website?

SQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database.

Elfde-Liniestraat Hasselt Schooljaar TINFO POKER GAME Oracle Scripts

Aanmelden Na installatie wordt de service automatisch gestart en kunt u meteen aanmelden van op afstand:

Domein API Handleiding

We moeten de accommodaties selecteren die 3 sterren hebben, en in land met ID 10 zitten.

MULTIFUNCTIONELE DIGITALE SYSTEMEN. Instellen en gebruiken van LDAP met Active Directory

Configureren van een VPN L2TP/IPSEC verbinding

Howto make Exim work with Freesco 0.2.7

Sparse columns in SQL server 2008

vroeger: 15 jaar unix systeem beheer/software development en 5 jaar infrastructuur architect (unix/blades)

De MySQL C API. Variabelen in C Functies in C Pointers in C

Temperatuurbewaking met Linux (Deel 2)

API geolocation. Ying-Hing Lam Tjebbe Marchand DP31T

VPN Remote Dial In User. DrayTek Smart VPN Client

Solcon Online Backup. Aan de slag handleiding voor Linux

Aandachtspunten voor installatie suse in vmware server

Netwerkprinter Dell 1320C installeren op Ubuntu LTS - Lucid Lynx

9. MYSQL. Daarin zien we het administratie paneel van mysql.

Configureren van een VPN L2TP/IPSEC verbinding. In combinatie met:

Veel gestelde vragen nieuwe webloginpagina

Een website maken met databasetoegang.

Linux Server Installatie

1 Installatie van de server... 2

Technote. EnGenius Senao EOM Mesh Layer 2 configuratie Transparant netwerk

VPN Remote Dial In User. DrayTek Smart VPN Client

Raspberry Pi VPN-server. Auteur: Ger Stok

icafe Project Joeri Verdeyen Stefaan De Spiegeleer Ben Naim Tanfous

Handleiding installatie Enecsys uitlezen op een Synology NAS

Linux Gevorderden Basis installatie Linux. Elektronica-ICT. Selina Oudermans 2ICT4. Academiejaar

Micro Computer Service Center. Installatie

ENH900EXT VLAN WITH 5GHZ

PHP & MySQL. Studievaardigheden Frank Takes (ftakes@liacs.nl) LIACS, Universiteit Leiden

DBMS. DataBase Management System. Op dit moment gebruiken bijna alle DBMS'en het relationele model. Deze worden RDBMS'en genoemd.

Javascript oefenblad 1

Linux Quickstart Cygwin

Minecraft server op Linux (Debian)

ipact Installatiehandleiding CopperJet 816-2P / P Router

Secure Application Roles

Analyse probleem remote execution

Installatie van WerkMeester

Hoe bouw ik een component? Drs. Arjan Burger

Huiswerk Linux: Installatie phpmyadmin

Belangrijk: Voordat u een VPN tunnel creëert dient u ervoor te zorgen dat de datum en tijd instellingen van de router juist staan ingesteld.

API...1 Identificatie...1 Opties...2 Acties...3 Webserver...6 Heartbeat...6 Buffer groottes...8

PHP & MySQL. Studievaardigheden Jan van Rijn (j.n.van.rijn@liacs.leidenuniv.nl) LIACS, Universiteit Leiden

Bestand: /home/karel/scripts/nas Pagina 1 van 8

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd.

Object Oriented Programming

Configureren en installeren OPENOB op Raspberry PI

Gegevens uit een database tonen

SQL SERVER Werking van Database Snapshots

Praktijk opdrachten VMware

ASRemote WebService. Via deze webservice kunt u:

Databases - Inleiding

802.1x instellen op een Trapeze MX

Standard Parts Installatie Solid Edge ST3

DrICTVoip.dll v 2.1 Informatie en handleiding

Drupal lokale installatie op Linux Mint 17.1 Cinnamon.

Linux Quickstart Cygwin via HTTP

SSL VPN. In deze handleiding zullen wij onderstaande SSL mogelijkheden aan u uitleggen. - SSL VPN account/groep creëren.

Quickstart ewon Cosy 131

Hoe stel ik een Alfa router in voor gebruik met een UBNT Bullet als Gateway?

MULTIFUNCTIONELE DIGITALE SYSTEMEN

Toon TITEL, JAAR en PLATVORM van GAMES die voor het jaar 2000 uitkwamen op Nintendo 64

HowTo => OpenBSD => Local Caching DNS + DNSSEC (BIND)

Multi user Setup. Firebird database op een windows (server)

Security Pentest. 18 Januari Uitgevoerde Test(s): 1. Blackbox Security Pentest 2. Greybox Security Pentest

Als je klaar bent druk op: Save/Apply. Daarna ook even herstarten. TELE 2 : Davolink DV-201AMR

EM6250 Firmware update V030507

Installatiehandleiding 2.x

Automail voor fli4l. Korte beschrijving van de Omgeving. Het Probleem. LinuxFocus article number 308

Gebruikers handleiding. Lizard Configuration Manager ToolTip. Installatie. Instellen. Initieel instellen

Kleine cursus PHP5. Auteur: Raymond Moesker

LES 11: VAN LOKAAL NAAR ONLINE. Lesoverzicht: Aan de slag Domeinnaam Web hosting FTP gegevens FTP programma s Database exporteren Samenvatting

Sick Beard installeren en configureren voor gebruik in combinatie met SABnzbd+...

3Com 4500G instellen voor Qmanage

Handleiding DirectAdmin

Inhoudsopgave Disclaimer... 3 Voorwoord... 4 Inleiding... 5 Het downloaden van XAMPP... 7 Het installeren van XAMPP... 8 Joomla installeren op

CLOUD4WI ALCATEL-LUCENT IAP CONFIGURATIE V2

Boutronic. MSSQL Express server voor Log functie. >> Installatie handleiding << 23 april 2014, versie 1.0d

1945, eerste DC. Eigen logo

Intramed OnLine instellen en gebruiken. Voor Android tablet of telefoon

ProjectHeatmap. Onderzoeksrapport v Dennis Wagenaar

Secure File Sync - Quick Start Guide

Thinking of development

1. Controleren van de aansluiting op de splitter

Die vraag krijg ik regelmatig. De meest voorkomende situaties zijn deze:

Handleiding NodeMCU. Handleiding NodeMCU l Pagina 1

Kies File>New>Blank Page>PHP. Je kunt eventueel nog een stylesheet koppelen. Definieer nu eerst een site! Dat betekent: Site>New Site

Transcriptie:

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 server 3 3.1 Debian...................................... 3 3.2 Ubuntu..................................... 4 3.3 Problemen.................................... 4 4 Wireless Opstelling 5 4.1 VPN....................................... 5 4.2 MikroTik.................................... 5 4.3 Ubiquity..................................... 5 4.4 Access Point................................... 5 5 SNMP 6 5.1 Waarom SNMP gebruiken........................... 6 5.2 OID....................................... 6 6 Munin 7 6.1 Standaard plugins............................... 7 6.2 Custom plugins................................. 7 6.3 Graph types................................... 7 6.4 Eigen plugins.................................. 7 6.5 Problemen.................................... 8 6.6 Oplossing.................................... 9 7 Scripts 10 7.1 Discovery script................................. 10 7.2 Curl Script................................... 16 7.3 CCQ script................................... 18 7.4 Installatie script................................ 19 8 Database 22 9 Locatiebepaling 24 9.1 ophalen locaties van devices.......................... 24 9.2 Pagina...................................... 24 9.3 Ophalen van locaties uit de database..................... 25 9.4 Markers op de map plaatsen.......................... 26 9.5 Resultaat.................................... 27 9.6 Uiteindelijke pagina.............................. 27 ii

10 Back-up 29 11 Presentatie 30 11.1 Voorbereidingen................................. 30 11.2 Presentatie................................... 30 12 Slotwoord 31 13 Bronnen 32 14 Bijlagen 33 14.1 Presentatie in PDF............................... 33 14.2 ApiNeighborDiscovery.pl............................ 67 14.3 CheckScripts.pl................................. 70 14.4 createdb.sql................................... 71 14.5 dbscriptje.pm.................................. 72 14.6 fetch_curl_nanostations.pl.......................... 78 14.7 installatiescript.sh............................... 80 14.8 lijstje.pl..................................... 82 14.9 LongitudeLatitude.pl.............................. 83 14.10MaakScripts.pl................................. 84 14.11MacsPerAPFinale.pl.............................. 86 14.12mail_notificatie_wireless_clients.pl..................... 88 14.13MuninFuncties.pm............................... 89 14.14NeighborDiscoveryTest1.pl........................... 92 14.15NeighborDiscoveryTest2.pl........................... 93 14.16NeighborDiscoveryTest3.pl........................... 95 14.17snmp-getbulk.pl................................. 98 14.18snmpneighbors.pl................................ 99 14.19snmpneighbors2.pl............................... 101 14.20snmpwalkloop.pl................................ 103 14.21snmp_CCQ_10.96.6.15.pl........................... 104 14.22snmp_Curl_AantalMacsPerMode.pl..................... 105 14.23snmp_Curl_Ccq.pl............................... 107 14.24snmp_Curl_Distance.pl............................ 108 14.25snmp_Curl_SignalStrength.pl........................ 109 14.26snmp_Curl_TxRx.pl.............................. 110 14.27snmp_download2vreemdenanostations.pl................... 112 14.28snmp_MikroTikMetWifi_CCQ.pl...................... 113 14.29snmp_MikroTikMetWifi_CCQ2.pl...................... 115 14.30snmp_MikroTikMetWifi_TxRx.pl...................... 116 14.31snmp_MikroTikMetWifi_WifiStats.pl.................... 117 14.32snmp_MikroTik_Voltage.pl.......................... 118 14.33snmp_SignalStrengthPerApPerMac.pl.................... 119 iii

14.34VendorDef.pl.................................. 121 14.35VendorSchaal.pl................................. 122 14.36werkend.pl.................................... 123 14.37zoekinfo.pl.................................... 125 iv

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 use lib ("/etc/scripts"); 4 require dbscriptje; 5 6 dbscriptje::connecttomysql(); 7 8 @range=("96","97","98"); 9 foreach $r(@range) 10 { 11 @ips=dbscriptje::returnmikrowirelessenablediprange($r);; 12 foreach $ip(@ips) 13 { 14 print $ip; print "\t"; 15 $out = perl /etc/munin/plugins/snmp_ccq_$ip.pl ; 16 @splits = split("\n",$out); 17 if($splits[6] eq "a.value ") 18 { 19 print "slecht en verwijderd"; 20 print "\n"; 21 $verwijder = rm /etc/munin/plugins/snmp_ccq_$ip.pl ; 22 } 23 else 24 { 25 print "goed"; 26 print "\n"; 27 } 28 } 29 @ips=(); 30 } 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

4 use Net::SSH::Perl; 5 6 sub zoekneighbors { 7 my $host = "$_[0]"; 8 my $user = api_user ; 9 my $pass = api_user_pass ; 10 my $cmd = /ip neighbor print ; 11 12 my $ssh = new Net::SSH::Perl($host); 13 $ssh->login($user, $pass); 14 15 my ($stdout, $stderr, $exit) = $ssh->cmd($cmd); 16 $output = $stdout; 17 18 open (MYFILE, >>ipadressen.txt ); 19 for ($output =~ /(\d+\.\d+\.\d+\.\d+)/g) { 20 $currentline = $_; 21 $x= grep /$currentline/,@gebruikteip; 22 if($x == 0){ 23 print MYFILE "$_\n"; 24 push(@gebruikteip, "$_"); 25 } 26 } 27 28 close (MYFILE); 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 use warnings; 3 use IO::Socket; 4 my $start_run = time(); 5 6 7 $ip = 10.98.250.195 ; 8 my @adressen; 9 my @b = null; 10 zoek($ip); 11 12 sub zoek 11

13 { 14 $a = $_[0]; 15 $out = /usr/bin/snmpbulkget -v2c -c public $a 1.3.6.1.4.1.14988.1.1.11.1.1.2 2>/dev/null ; 16 $mk = /usr/bin/snmpbulkget -v2c -c public $a 1.3.6.1.4.1.14988.1.1.11.1.1.5 2>/dev/null ; 17 18 @a = split(/\n/,$out); 19 foreach $adres(@a){ 20 @ipad=split(/: /, $adres); 21 push(@adressen,$ipad[1]); 22 } 23 24 25 @a = split(/\n/,$mk); 26 foreach $id(@a){ 27 @ipad=split(/: /, $id); 28 push(@b,$ipad[1]); 29 } 30 31 #$tel = -1; 32 my $tel = 0; 33 foreach $val(@adressen){ 34 35 36 $end_run = time(); 37 $run_time = $end_run - $start_run; 38 39 40 if($b[$tel] ne ){ 41 if(!exists $gebruikt{$val}){ 42 $gebruikt{$val}=$b[$tel]; 43 $aantal++; 44 print "$aantal \t $val \t $gebruikt{$val}\t \t $run_time\n"; 45 zoek($val); 46 } 47 48 } 49 $tel++; 50 } 51 } 52 53 sub schrijf(){ 54 open FILE, ">mikrotik-snmp.txt" or die $!; 55 foreach my $key ( sort keys %gebruikt ) 56 { 57 print FILE $key. "\n"; 58 } 59 close(file); 60 61 open FILE, ">nano-snmp.txt" or die $!; 62 foreach my $key ( sort keys %antenne) 63 { 12

64 print FILE $key. "\n"; 65 } 66 close(file); 67 } 68 69 schrijf(); 70 71 my $end_run = time(); 72 my $run_time = $end_run - $start_run; 73 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 ($session,$error) = Net::SNMP->session(Hostname => $ARGV[0], 4 Community => $ARGV[1], 5 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 use dbscriptje; 2 use IO::Socket; 3 use Mtik ; 4 use List::MoreUtils qw(uniq); 5 6 13

7 #Er bestaat een universele guest-login over de MikroTik-bakjes; 8 $mtik_host = *********; 9 $mtik_username = **********; 10 $mtik_password = ************; 11 %gebruikt = (); 12 %devs = (); 13 @devices = (); 14 15 16 sub zoek{ 17 18 $mtik_host = $_[0]; #Host meegegeven aan de subroutine; 19 if (Mtik::login($mtik_host,$mtik_username,$mtik_password)){ # Inloggen op MikroTik-device; 20 21 my @wmd= ("/interface/wireless/getall", "=.proplist=frequency"); 22 my($retval1,@results1) = Mtik::raw_talk(\@wmd); #Command om te kijken of er een frequency wordt geretourneerd (Wifi-kaart of niet); 23 24 25 if(@results1[1]){ 26 if(@results1[1] =~ m/frequency/){ #Boolean-value setten afhankelijk van wifi-kaart of niet; 27 $gebruikt{$mtik_host}=1; 28 }else{ 29 $gebruikt{$mtik_host}=0; 30 } 31 } 32 33 my @cmd = ("/ip/neighbor/getall", "=.proplist=identity,software- id,platform,interface,board,address"); 34 my($retval,@results) = Mtik::raw_talk(\@cmd); #Command dat informatie over het MikroTik-device terug zal geven; 35 36 foreach my $result (@results) { #Elke regel uit de ip-neighbor- list overlopen; 37 38 if($result eq "!re"){ #Wanneer regel gelijk aan!re begint er een nieuwe entry; 39 if(!exists $devs{$currentline}){ 40 $devs{$currentline}= ; 41 push @devices, { %devicevalues }; 42 } 43 %devicevalues=(); #Array terug leegmaken; 44 }else{ #Regel niet gelijk aan!re; 45 $result =~ m/=(.*?)=/; #Match de waarden tussen 2 = - tekens; 46 my $index = $1; #Steek match in $index; 47 $devicevalues{$index}=${^postmatch}; #POSTMATCH geeft alles na de gevonden match terug; 48 49 } 50 if($result =~ m/(\d+\.\d+\.\d+\.\d+)/){ #Indien de gevonden 14

waarde overeen komt met een IP-adres; 51 $currentline=$1; #Currentline = ipadres; 52 if (!exists $gebruikt{$currentline}){ #Indien men deze device nog niet eerder gebruikt heeft; 53 $gebruikt{$currentline}= ; 54 $socket = IO::Socket::INET->new(Proto=>"tcp", PeerPort=>"8728", PeerAddr=>"$currentline", Timeout=>1); 55 if($socket){ #Kijken of de API-poort voor MikroTik openstaat. 56 $aantal++; 57 print $aantal."\n"; 58 zoek($currentline); #Recursief opnieuw de subroutine aanroepen met het volgende ip- adres. 59 } 60 61 } 62 } 63 64 } 65 Mtik::logout; #Uitloggen van het device; 66 } 67 } 68 69 zoek($mtik_host); 70 schrijfweg(); 71 72 sub schrijfweg{ 73 dbscriptje::connecttomysql(); #Connectie maken met de DB 74 @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 $address = ""; 79 $macaddress = ""; 80 $interface = ""; 81 $identity = ""; 82 $platform = ""; 83 $softwareid = ""; 84 $board = ""; 85 $tempplatform = ""; 86 87 while ( my ($key, $value) = each(%$device) ) { #Voor elk key- value pair per hash 88 $key =~ s/-//; 89 if($key eq "platform"){ #Indien key = platform 90 if(length($value)==3){ #Wanneer de value bij platform een lengte heeft van 3, is dit een AirOS-device; 91 ${$key}="airos"; 92 $tempplatform = $value; #Tijdelijk AirOS opslaan; 93 }else{ 94 ${$key}=$value; 15

95 } 96 }else{ 97 ${$key}=$value; 98 } 99 100 if($tempplatform ne ""){ #Wanneer tempplatform leeg en het dus een AirOS-device is, moet de boardname veranderd worden naar waarde die 101 $board = $tempplatform; #hiervoor bij platform stond 102 } 103 104 print ${$key}; 105 } 106 107 $wireless = $gebruikt{$address}; #De $wireless boolean veranderen naar de true/false voorafgaang geset; 108 dbscriptje::insertininterfaces($address,$macaddress, $interface, $identity, $platform, $softwareid, $board, $wireless); 109 print "\n --------------------------------------- \n"; #Alle waarden wegschrijven naar de DB; 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 use strict; 3 use IO::Socket::PortState qw(check_ports); 4 use WWW::Curl::Easy; 5 use WWW::Curl::Form; 6 7 my $ip = shift; 8 my $page = shift; 9 my $username = "usr"; 10 my $password = "Wouter"; 11 12 &get_airos_page($ip,$page); 13 14 sub get_airos_page { 15 16 my $https_port = 443; 17 18 my $proto = "http://"; 19 if(check_port($ip,$https_port)) { 20 $proto = "https://"; 21 } 16

22 23 my $curl = WWW::Curl::Easy->new; 24 25 $curl->setopt(curlopt_url, $proto.$ip); 26 # $curl->setopt(curlopt_verbose, 1); 27 $curl->setopt(curlopt_followlocation, 1); 28 $curl->setopt(curlopt_ssl_verifypeer, 0); 29 $curl->setopt(curlopt_ssl_verifyhost, 0); 30 $curl->setopt(curlopt_cookiejar, cookie.txt ); 31 my $dummyresponse_body; 32 my $response_headers; 33 $curl->setopt(curlopt_writedata,\$dummyresponse_body); 34 $curl->setopt(curlopt_writeheader,\$response_headers); 35 36 my $retcode = $curl->perform; 37 if ($retcode!= 0) { 38 die("airos Error while fetching page: $retcode ".$curl-> strerror($retcode)." ".$curl->errbuf."\n"); 39 } 40 41 42 my $form; 43 my @hdrs = ( Expect: ); 44 45 46 if ($response_headers =~ /WWW-Authenticate: Basic/s) { 47 # old AirOS firmware with HTTP auth 48 49 $curl->setopt(curlopt_url, $proto.$ip. /.$page); 50 $curl->setopt(curlopt_httpauth, CURLAUTH_BASIC ) ; 51 $curl->setopt(curlopt_userpwd, $username.":".$password); 52 } else { 53 #newer AirOS firmware with cookie auth 54 55 $curl->setopt(curlopt_url, $proto.$ip. /login.cgi ); 56 $form = WWW::Curl::Form->new; 57 $form->formadd( uri, /.$page); 58 $form->formadd( username, $username); 59 $form->formadd( password, $password); 60 $curl->setopt(curlopt_httppost, $form); 61 62 $curl->setopt(curlopt_httpheader, \@hdrs); 63 64 $curl->setopt(curlopt_cookiefile, cookie.txt ); 65 } 66 67 68 69 my $response_body; 70 my $response_headers2; 71 $curl->setopt(curlopt_writedata,\$response_body); 72 $curl->setopt(curlopt_writeheader,\$response_headers2); 73 $retcode = $curl->perform; 74 17

75 if ($retcode!= 0) { 76 die("airos Error while fetching page: $retcode ".$curl-> strerror($retcode)." ".$curl->errbuf."\n"); 77 } 78 79 print $response_body; 80 } 81 82 sub check_port() { 83 my $host = $_[0]; 84 my $portc = $_[1]; 85 my $protoc = "tcp"; 86 my %port_hash = ( 87 $protoc => { 88 $portc => {}, 89 } 90 ); 91 my $timeout = 5; 92 my $host_hr = check_ports($host,$timeout,\%port_hash); 93 for my $port (sort {$a <=> $b} keys %{$host_hr->{tcp}}) { 94 my $yesno = $host_hr->{tcp}{$port}{open}? 1 : 0; 95 return $yesno; 96 } 97 } 7.3 CCQ script 1 2 #!/usr/bin/env perl 3 4 open(myfile, "/etc/scripts/bestanden/wirelessipmikrotikmetwifi.txt"); 5 while ($line = <MYFILE>){ 6 push(@ips,$line); 7 } 8 close(myfile); 9 10 $woord="a"; 11 12 foreach $ip(@ips) 13 { 14 $ip = substr $ip,0,length($ip)-1; 15 splice(@uitkomsten); 16 #Create the graph 17 18 print "graph_title CCQ Wiresless MikroTik $ip\n"; 19 print "graph_category CCQ Wiresless MikroTiks\n"; 20 print "graph_args --base 1000 -l 0\n"; 21 print "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

24 if (length($out) > 55) 25 { 26 @splitss=split("\n",$out); 27 foreach $item(@splitss) 28 { 29 @splits = split(/: /,$item); 30 push(@uitkomsten,$splits[1]); 31 } 32 foreach $item2(@uitkomsten) 33 { 34 #create the first label ( line in the graph ) 35 print "$woord.type GAUGE\n"; 36 print "$woord.label $ip\n"; 37 print "$woord.draw LINE1\n"; 38 39 #give the label a value 40 print "$woord.value $item2\n"; 41 $woord.="a"; 42 } 43 } 44 else 45 { 46 @splits = split(/: /,$out); 47 $res = @splits[1]; 48 #create the first label ( line in the graph ) 49 print "$woord.type GAUGE\n"; 50 print "$woord.label $ip\n"; 51 print "$woord.draw LINE1\n"; 52 53 #give the label a value 54 print "$woord.value $res\n"; 55 $woord.="a"; 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 wget -O /etc/hosts2 -r https://512335.webontwerp.khleuven.be/eindwerk/ hosts/hosts 7 cp /etc/hosts2 /etc/hosts 8 /etc/init.d/networking restart 9 10 #Ip adres veranderen# 11 12 wget -O /etc/network/interfaces2 -r https://512335.webontwerp.khleuven. be/eindwerk/interfaces/interfaces 13 cp /etc/network/interfaces2 /etc/network/interfaces 14 /etc/init.d/networking restart 15 16 #Sources.list aanpassen# 17 18 wget -O /etc/apt/sourcess.list -r https://512335.webontwerp.khleuven.be/ Eindwerk/sources/sources.list 19 cp /etc/apt/sourcess.list /etc/apt/sources.list 20 21 #Installatie packages# 22 23 apt-get update 24 25 apt-get install unzip 26 apt-get install make 27 apt-get install ssh 28 apt-get install apache2 29 apt-get install mysql-server mysql-client 30 apt-get install munin munin-node 31 apt-get install snmp 32 apt-get install snmpd 33 apt-get install libcurl4-gnutls-dev 34 35 #Installatie munin plugins# 36 37 mkdir /etc/zips 38 wget -O /etc/zips/plugins.tar -r --cut-dirs=3 https://512335.webontwerp. khleuven.be/eindwerk/munin-plugins/plugins.tar 39 tar -xvf /etc/zips/plugins.tar -C /etc/munin/plugins 40 chmod 777 /etc/munin/plugins/snmp_* 41 chmod 777 /etc/munin/plugins/vendordef.pl 42 chmod 777 /etc/munin/plugins/vendorschaal.pl 43 chmod 777 /etc/munin/plugins/vendorschaaltest.pl 44 45 #Installatie scripts /etc/scripts/# 46 47 mkdir /etc/scripts 48 wget -O /etc/zips/scripts.zip -r --cut-dirs=3 https://512335.webontwerp. khleuven.be/eindwerk/scripts/scripts.zip 49 unzip /etc/zips/scripts.zip -d /etc/scripts/ 50 51 #Installatie Perl Library s# 52 53 perl -MCPAN -e install IO::Socket::PortState 54 perl -MCPAN -e install Net::MAC::Vendor 20

55 perl -MCPAN -e install Data::OptList 56 perl -MCPAN -e install Email::Date::Format 57 perl -MCPAN -e install MIME::Lite 58 perl -MCPAN -e install MIME::Types 59 perl -MCPAN -e install Net::SNMP 60 perl -MCPAN -e install Params::Util 61 perl -MCPAN -e install Sub::Exporter 62 perl -MCPAN -e install Sub::Install 63 perl -MCPAN -e install WWW::Curl::Easy 64 perl -MCPAN -e install WWW::Curl::Form 65 perl -MCPAN -e install IO::Socket::PortState 66 perl -MCPAN -e install DBI 67 perl -MCPAN -e install DBD::mysql 68 69 #Config snmp aanpassen# 70 71 rm /etc/snmp/snmpd.conf 72 wget -O /etc/snmp/snmpd.conf -r https://512335.webontwerp.khleuven.be/ Eindwerk/snmp-config/snmpd.conf 73 74 #Config apache2 aanpassen# 75 76 rm /etc/apache2/sites-enabled/000-default 77 wget -O /etc/apache2/sites-enabled/000-default -r https://512335. webontwerp.khleuven.be/eindwerk/apache-config/000-default 78 service apache2 restart 79 80 #Installtie Database server# 81 82 echo "Gelieve het wachtwoord in te geven dat u daarstraks hebt gekozen bij MYSQL (wirelessbelgium)" 83 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 #Munin node herstarten# 90 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 use lib ("/etc/scripts"); 5 require dbscriptje; 6 use Time::Stamp; 7 8 dbscriptje::connecttomysql(); 9 @ips = ("10.98.250.197","10.98.250.198"); 10 foreach $ip(@ips) 11 { 12 $res = sshpass -p Wolk ssh \ 13 -o UserKnownHostsFile=/dev/null \ 14 -o StrictHostKeyChecking=no \ 15 -l ubnt \ 16 -p 22 $ip \ 17 mca-status egrep -e latitude longitude ; 18 @resultaat = split("\n",$res); 19 foreach $item(@resultaat) 20 { 21 @resultaat2 = split(/=/,$item); 22 push(@resultaat3,$resultaat2[1]); 23 } 24 dbscriptje::insertlocatie($ip,$resultaat3[0],$resultaat3[1]); 25 } 9.2 Pagina We zetten een pagina op met een lege map. zoomlevel en ons default maptype. Deze centeren we op België, kiezen ons 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 <html> 2 <head> 3 <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 4 <style type="text/css"> 5 html { height: 100% } 6 body { height: 100%; margin: 0; padding: 0 } 7 </style> 8 <script type="text/javascript" 9 src="https://maps.googleapis.com/maps/api/js?key= AIzaSyBVcbjD4Kxvl2slCVrpCDKvgXY8TmFGPPw&sensor=true"> 10 </script> 11 12 13 14 <script type="text/javascript"> 15 function initialize() { 16 var mapoptions = { 17 center: new google.maps.latlng(50.88085, 4.67379), 18 zoom: 12, 19 maptypeid: google.maps.maptypeid.roadmap 20 }; 21 var map = new google.maps.map(document.getelementbyid(" map_canvas"), 22 mapoptions); 23 24 25 } 26 </script> 27 </head> 28 <body onload="initialize()"> 29 <div id="map_canvas" style="width:100%; height:100%"></div> 30 </body> 31 </html> 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 <?php 2 3 $dbhandle = mysql_connect( localhost, user, password ) or die ( error connecting to mysql ); 4 $selected = mysql_select_db("wirelessbelgium",$dbhandle) or die(" Could not select examples"); 5 25

6 $result = mysql_query("select * FROM wirelessbelgium.locatie"); 7 8 $locaties=array(); 9 10 while ($row = mysql_fetch_array($result)) { 11 array_push($locaties, $row[ LONGITUDE ]); 12 array_push($locaties, $row[ LATITUDE ]); 13 } 14 15 mysql_close($dbhandle); 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 <?php 3 $index = 0; 4 foreach($locaties as $a){ 5 6 if($index % 2==0){ 7 8 $var1 = $a; 9 $var2 = $locaties[$index+1]; 10 print "var location = new google.maps.latlng(". $var2. ",". $var1.");\n"; 11?> 12 13 var marker = new google.maps.marker({ 14 position: location, 15 map: map 16 }); 17 18 <?php 19 20 } 21 $index++; 22 } 23 24?> 26

9.5 Resultaat 9.6 Uiteindelijke pagina 1 <?php 2 3 $dbhandle = mysql_connect( localhost, user, password ) or die ( error connecting to mysql ); 4 $selected = mysql_select_db("wirelessbelgium",$dbhandle) or die(" Could not select examples"); 5 6 $result = mysql_query("select * FROM wirelessbelgium.locatie"); 7 8 $locaties=array(); 9 10 while ($row = mysql_fetch_array($result)) { 11 array_push($locaties, $row[ LONGITUDE ]); 12 array_push($locaties, $row[ LATITUDE ]); 13 } 14 15 mysql_close($dbhandle); 16?> 17 18 <html> 19 <head> 20 <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 21 <style type="text/css"> 22 html { height: 100% } 23 body { height: 100%; margin: 0; padding: 0 } 24 #map_canvas { height: 100% } 25 </style> 26 <script type="text/javascript" 27

27 src="https://maps.googleapis.com/maps/api/js?key= AIzaSyBVcbjD4Kxvl2slCVrpCDKvgXY8TmFGPPw&sensor=true"> 28 </script> 29 30 31 <script type="text/javascript"> 32 function initialize() { 33 var mapoptions = { 34 center: new google.maps.latlng(50.88085, 4.67379), 35 zoom: 12, 36 maptypeid: google.maps.maptypeid.roadmap 37 }; 38 var map = new google.maps.map(document.getelementbyid(" map_canvas"), 39 mapoptions); 40 41 <?php 42 $index = 0; 43 foreach($locaties as $a){ 44 45 if($index % 2==0){ 46 47 $var1 = $a; 48 $var2 = $locaties[$index+1]; 49 print "var location = new google.maps.latlng(". $var2. ",". $var1.");\n"; 50?> 51 52 var marker = new google.maps.marker({position: location,map: map }); 53 54 <?php 55 56 } 57 $index++; 58 } 59 60?> 61 62 } 63 </script> 64 </head> 65 <body onload="initialize()"> 66 <div id="map_canvas" style="width:100%; height:100%"></div> 67 </body> 68 </html> 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