Sep
06
2013

DHCP-Server mit CSV-Datenbank abgleichen über VBS

Ziel des Projektes war es, dass jeder unserer 1.400 User über ein Web-Formular eine MAC-Adresse selbst registrieren kann. Diese wird dann am DHCP-Server als Reservierung hinterlegt. Damit kann ein User nur ein Arbeits-Gerät im WLAN registrieren und nicht zusätzlich die Smartphones, Tablets, MP3-Player, Smartwatches,…

Am DHCP Server wird nun alle 15 Minuten folgendes VBS-Skript abgearbeitet. Dabei werden zuerst alle Reservierungen aus dem DHCP in eine Textdatei ausgelesen, diese dann sortiert und anschließend mit einer CSV-Datei abgegleichen. Die CSV-Datei stammt vom Webserver, der diese alle 15 Minuten über einen CRON-Job aus den gespeicherten registrierten MAC- und dadurch auch eindeutig zugewiesenen IP-Adressen erstellt.

Format der beiden Textdateien:

IPWert;IP-Adresse;MAC-Adresse

Der IPWert erreichnet sich aus 3.. Teil der Ip-Adresse * 256 + 4. Teil, die MAC-Adresse muss ohne Bindestriche oder Doppelpunkte angegeben werden.

Das VBS-Skript:

'=======================================================================================
'dhcp_reserverdips_ablgeichen.vbs
'=======================================================================================
'
' Version: 1
' Datum: 03.09.2013
'
' (1) Liest am DHCP Server in einem definierten Scope/Bereich IPs und MAC aus und
'     speichert diese sortiert in der Datei "DHCP_reservedIPs.txt"
' (2) Vergleicht die Werte in den Dateien "DHCP_reservedIPs.txt" und
'     "mySQL_reserverdIPs.txt" und löscht dabei nicht mehr gewünschte Reservierungen,
'     ändert oder ergänzt Reservierungen
'
'=======================================================================================

' TODO
'Usernamen auslesen aus Tabelle

'Variablendefinition
dim anz
dim Zeilen()
dim ZeilenSortiert
dim debug
dim scope
dim mysqlfile_pfad
dim mysql_neu_einlesen

'Vorbelegte Werte
debug=false
scope="10.192.0.0"
mysqlfile_pfad="c:\dhcpscript\"

function bubblesort(arrSortieren)
	'Argument: Array von Textzeilen der Form IP-ZahlenWert;IP;Mac
	'sortiert das Arry nach der Spalte "IP-ZahlenWert"
	if debug=true then wscript.echo "Anzahl der zu sortierenden Zeilen: "&ubound(arrSortieren)

	for i = 0 to ubound(arrSortieren)
		for j = i + 1 to ubound(arrSortieren)
			var_i=split(arrSortieren(i),";")
			var_j=split(arrSortieren(j),";")
			if cint(var_i(0)) > cint(var_j(0)) then
				arrTemp = arrSortieren(i)
				arrSortieren(i) = arrSortieren(j)
				arrSortieren(j) = arrTemp
			end if
		next
	next
	bubblesort = arrSortieren
end function

sub ReservierungLoeschen (IP,Mac)
	'Argument: IP und MAC-Adresse des zu löschenden Eintrags

	wscript.echo " "
	wscript.echo "Reservierung löschen: " & IP & ", " & Mac
	wscript.echo "----------------------------------------------------------"
	set obj = oshell.exec("netsh dhcp server scope " &scope & " delete reservedip " & IP & " " & Mac )
	ausgabe = obj.stdout.readall()
	wscript.echo ausgabe
end sub

sub ReservierungAendern(IP,Macalt,MacNeu,User)
	'Argument: IP-Adresse, alte MAC-Adresse und neue MAC-Adresse und Username

	wscript.echo " "
	wscript.echo "Reservierung ändern: " & IP & ", " & Macalt & ", " & Macneu
	wscript.echo "---------------------------------------------------------------------------"
	set obj = oshell.exec("netsh dhcp server scope " &scope & " delete reservedip " & IP & " " & Macalt )
	ausgabe = obj.stdout.readall()
	wscript.echo ausgabe
	set obj = oshell.exec("netsh dhcp server scope " &scope & " add reservedip " & IP & " " & MacNeu & " " & User  & " " & User)
	ausgabe = obj.stdout.readall()
	wscript.echo ausgabe

	end sub

sub ReservierungHinzufuegen (IP,MAC,User)
	'Argument: IP-Adresse, MAC und Usernamen für neuen Eintrag

	wscript.echo " "
	wscript.echo "Reservierung hinzufügen: " & IP & ", " & Mac & ", " & User
	wscript.echo "------------------------------------------------------------------------------"
	set obj = oshell.exec("netsh dhcp server scope " &scope & " add reservedip " & IP & " " & Mac & " " & User  & " " & User)
	ausgabe = obj.stdout.readall()
	wscript.echo ausgabe
end sub

' ========= MAIN =========

' TEIL (1): Datei mit den Reservierungen erstellen

' netsh-Ausgabe in Datei tempfile zwischenspeichern
wscript.echo "Start dhcp_reserverdips_ablgeichen.vbs"
wscript.echo "--------------------------------------"
wscript.echo "Startzeit " & date & " " & time

Set oShell = CreateObject("WScript.Shell")
Set oScriptExec = oShell.Exec("netsh dhcp server scope " & scope & " show reservedip")
outpsource = oScriptExec.stdout.readall()

'Ausgabe der Anzeige aller ReservedIPs in Datei tempfile.txt schreiben
set fso = createobject("Scripting.FileSystemObject")
Set tempfile = fso.CreateTextFile("tempfile.txt")
tempfile.writeline(outpsource)
tempfile.close

'Anzahl Reservierungen auslesen
Set tempfile = fso.openTextFile("tempfile.txt")
do While not tempfile.AtEndOfStream
	line = tempfile.ReadLine
	if(instr(line,"Anzahl der")=1) then
		str = split(line)
		t=str(7)         'taking no. of reservations into t
		if debug=true then wscript.echo "Anzahl an gefundenen reservierten IPs: "&t
		exit do
	end if
loop
tempfile.close

' IP und MAC zeilenweise auslesen und in das Array Zeilen() ausgeben
if t=0 then
	Set finalfile = fso.CreateTextFile("DHCP_reservedIPs.txt")
	finalfile.close

	wscript.echo "Keine reservierten IPs im DHCP Server gefunden."
else
	Set tempfile = fso.openTextFile("tempfile.txt")
	'Leerzeilen überspringen
	for i=1 to 7
		tempfile.skipline
	next

	' Zeilen mit ReservedIPs auslesen, IP und MAC herausholen und Dezimalzahl für IP berechnen
	' alle 3 Werte zusammen durch ; getrennt in einem Array zeilen() abspeichern
	for i=1 to t
		string1=split(trim(tempfile.readline))
		ip = split(string1(0),".")
		ipZahl = cint(ip(2)) * 256 + cint(ip(3))
		if debug=true then  wscript.echo string1(0) & "---" & replace(string1(ubound(string1)),"-","")
		REDIM preserve zeilen(i-1)
		zeilen(i-1) = ipZahl & ";" & string1(0) & ";" & replace(string1(ubound(string1)),"-","")
	next
	tempfile.close

	' Array Zeilen() sortieren
	ZeilenSortiert=bubblesort(Zeilen)

	' Array Zeilen() in Datei ausgeben
	Set finalfile = fso.CreateTextFile("DHCP_reservedIPs.txt")
	For i = 0 To UBound(ZeilenSortiert)
		Finalfile.Writeline ZeilenSortiert(i)
	Next
	finalfile.close

end if

' TEIL (2): Dateien vergleichen und Aktionen setzen

' Datei dhcpfile gesamt durchlaufen
Set dhcpfile = fso.openTextFile("DHCP_reservedIPs.txt")
Set mysqlfile = fso.openTextFile(mysqlfile_pfad & "mySQL_reservedIPs.txt")

mysql_neu_einlesen=true
do While not dhcpfile.AtEndOfStream
	z_dhcp = split(dhcpfile.ReadLine,";")
	wertip_dhcp=cint(z_dhcp(0))
	ip_dhcp=z_dhcp(1)
	mac_dhcp=z_dhcp(2)

	do
		if mysqlfile.AtEndOfStream=false then 'in 2. Datei (mySql) nur dann neu einlesen, wenn nicht die Reservierung gelöscht wurde
			if mysql_neu_einlesen=true then z_mysql = split(mysqlfile.ReadLine,";")
			wertip_mysql=cint(z_mysql(0))
			ip_mysql=z_mysql(1)
			mac_mysql=z_mysql(2)
		else
			wertip_mysql=99999 'DHCP hat noch Einträge, mySQL aber nicht
		end if

		mysql_neu_einlesen=true

		if debug=true then wscript.echo wertip_dhcp & " - " & ip_dhcp & " - " & mac_dhcp & " ------ " & wertip_mysql & " - " & ip_mysql & " - " & mac_mysql

		if wertip_dhcp<wertip_mysql then
			call ReservierungLoeschen (ip_dhcp,mac_dhcp)
			mysql_neu_einlesen=false
			exit do
		end if

		if wertip_dhcp=wertip_mysql and mac_dhcp<>mac_mysql then
			call ReservierungAendern(ip_dhcp,mac_dhcp,mac_mysql,"Usernamen")
			exit do
		end if

		if wertip_dhcp>wertip_mysql then
			call ReservierungHinzufuegen (ip_mysql,mac_mysql,"Usernamen")
		end if

	loop while wertip_dhcp>wertip_mysql 'es gibt neue Einträge am mySql

loop

do While not mysqlfile.AtEndOfStream  'mySQL hat noch Einträge, DHCP aber nicht
	z_mysql = split(mysqlfile.ReadLine,";")
	wertip_mysql=cint(z_mysql(0))
	ip_mysql=z_mysql(1)
	mac_mysql=z_mysql(2)

	call ReservierungHinzufuegen (ip_mysql,mac_mysql,"Usernamen")
loop

dhcpfile.close
mysqlfile.close

wscript.echo ""
WScript.Echo "fertig um " & date & " " & time
Written by markus.strobl in: Programmierung | Schlagwörter:, ,

Keine Kommentare

Comments are closed.

RSS feed for comments on this post.


Powered by WordPress | Theme: Aeros 2.0 by TheBuckmaker.com