|
' Gambas class file
|
|
|
|
' This program IS free software; you can redistribute it AND/OR
|
|
' modify it under the terms of the GNU General PUBLIC License AS
|
|
' published by the Free Software Foundation; either version 2 of the
|
|
' License, OR (at your option) any later version.
|
|
'
|
|
' This program IS distributed IN the hope that it will be useful, but
|
|
' IS provided AS IS, WITHOUT ANY WARRANTY; without even the implied
|
|
' warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
|
|
' NON-INFRINGEMENT. See the GNU General PUBLIC License FOR more details.
|
|
'
|
|
' You should READ the GNU General PUBLIC License
|
|
' IF you have non, WRITE TO the Free Software
|
|
' Foundation, INC., 59 Temple Place - Suite 330, Boston,
|
|
' # MA 02111-1307, USA.
|
|
' ----------------------------------------------------------------------------
|
|
' ################################################
|
|
' # file name : fprincipal.class
|
|
' # created in project : scanies
|
|
' # created by : Francisco Paniagua Sánchez
|
|
' # mail : adminies.franciscodeorellana@edu.juntaextremadura.net
|
|
' # created at : 12/11/2006
|
|
' # last test with : gambas-2.7-1
|
|
' ################################################
|
|
|
|
PRIVATE hset AS Settings
|
|
PUBLIC servidordns AS String
|
|
PUBLIC rango AS String
|
|
PUBLIC datosldap AS Boolean
|
|
PRIVATE aula AS String
|
|
PRIVATE indice AS Integer
|
|
PRIVATE nequipos AS Integer
|
|
|
|
|
|
PUBLIC SUB Form_Open()
|
|
DIM fichero AS String
|
|
|
|
fichero = user.Home & "/.scanies4"
|
|
ME.Center
|
|
|
|
IF NOT comprobar_configuracion() THEN
|
|
frmconfiguracion.ShowModal
|
|
|
|
'ELSE
|
|
' cargar_datos()
|
|
ENDIF
|
|
hset = NEW Settings(fichero)
|
|
rango = hset["Rango de Red"]
|
|
datosldap = hset["ldap"]
|
|
|
|
IF (datosldap) THEN
|
|
cargar_datos()
|
|
ELSE
|
|
deshabilitar_ldap(FALSE)
|
|
ENDIF
|
|
|
|
iniciar_programa()
|
|
END
|
|
|
|
|
|
PUBLIC SUB deshabilitar_ldap(valor AS Boolean)
|
|
|
|
frame2.enabled = valor
|
|
btnprofon.enabled = valor
|
|
btnproftodoson.Enabled = valor
|
|
cmbaulas.Enabled = valor
|
|
|
|
END
|
|
|
|
|
|
|
|
PUBLIC SUB Form_Close()
|
|
|
|
|
|
END
|
|
|
|
|
|
PUBLIC FUNCTION comprobar_configuracion() AS Boolean
|
|
DIM fichero AS String
|
|
DIM retorno AS Boolean
|
|
|
|
fichero = user.Home & "/.scanies4"
|
|
|
|
IF NOT Exist(fichero) THEN
|
|
SHELL "touch " & fichero WAIT
|
|
message.Info("La aplicación no está configurada")
|
|
retorno = FALSE
|
|
ELSE
|
|
hset = NEW Settings(fichero)
|
|
rango = hset["Rango de Red"]
|
|
datosldap = hset["ldap"]
|
|
retorno = TRUE
|
|
ENDIF
|
|
RETURN retorno
|
|
|
|
END
|
|
|
|
|
|
PUBLIC SUB iconos()
|
|
|
|
btnrefrescar.Picture = stock["16/refresh"]
|
|
btnsalir.Picture = stock["16/quit"]
|
|
mnusalir.picture = stock["16/quit"]
|
|
mnurefrescar.Picture = stock["16/refresh"]
|
|
mnuconfiguracion2.Picture = stock["16/properties"]
|
|
mnuayuda2.Picture = stock["16/help"]
|
|
|
|
END
|
|
|
|
|
|
|
|
|
|
PUBLIC SUB cargar_datos()
|
|
DIM fichero AS file
|
|
DIM fauxiliar AS File
|
|
DIM temporal AS String
|
|
DIM fprofesores AS String
|
|
DIM linea AS String
|
|
DIM nombre AS String
|
|
DIM mac AS String
|
|
|
|
|
|
'realizar un fichero mediante ldapsearch con los nombres de los equipos de profesor
|
|
temporal = "/tmp/datos-prof"
|
|
TRY SHELL "ldapsearch -xLLL -h ldap -b dc=instituto,dc=extremadura,dc=es \"(&(objectClass=dhcpHost)(cn=a*-pro))\" | egrep \"cn:|ethernet\" | awk '{ print $2 $3 }' > " & temporal WAIT
|
|
|
|
fprofesores = "/tmp/profesores-ldap"
|
|
cmbaulas.add("Elige un equipo ...")
|
|
|
|
TRY OPEN fprofesores FOR CREATE AS #fauxiliar
|
|
|
|
TRY OPEN temporal FOR READ AS #fichero
|
|
WHILE NOT Eof(fichero)
|
|
|
|
LINE INPUT #fichero, linea
|
|
nombre = linea
|
|
LINE INPUT #fichero, linea
|
|
mac = Right(linea, 17)
|
|
|
|
cmbaulas.Add(nombre)
|
|
PRINT #fauxiliar, nombre & " " & mac
|
|
|
|
WEND
|
|
CLOSE #fichero
|
|
|
|
CLOSE #fauxiliar
|
|
|
|
habilitar_botones(FALSE)
|
|
|
|
|
|
CATCH
|
|
message.Error("No se puedieron obtener los datos de los equipos de profesor")
|
|
|
|
END
|
|
|
|
|
|
PUBLIC SUB iniciar_programa()
|
|
|
|
'cargamos la lista de equipos encendidos
|
|
iconos()
|
|
inicia_lista()
|
|
btnRefrescar_click()
|
|
|
|
END
|
|
|
|
|
|
PUBLIC SUB habilitar_botones(valor AS Boolean)
|
|
|
|
btnprofon.Enabled = valor
|
|
|
|
END
|
|
|
|
|
|
|
|
PUBLIC SUB cmbaulas_Click()
|
|
|
|
IF (cmbaulas.Text = "Elige un equipo ...") THEN
|
|
habilitar_botones(FALSE)
|
|
lblaula.text = "No hay ningún equipo seleccionado"
|
|
ELSE
|
|
aula = cmbaulas.Text
|
|
habilitar_botones(TRUE)
|
|
lblaula.text = "Esta seleccionado el equipo " & aula
|
|
ENDIF
|
|
|
|
END
|
|
|
|
|
|
PUBLIC SUB habilitar(valor AS Boolean)
|
|
|
|
' frame1.Enabled = valor
|
|
frame2.Enabled = valor
|
|
listapcs.Enabled = valor
|
|
IF (valor) THEN
|
|
ME.Mouse = mouse.Default
|
|
ELSE
|
|
ME.mouse = mouse.Wait
|
|
ENDIF
|
|
|
|
END
|
|
|
|
PUBLIC SUB inicia_lista()
|
|
|
|
listapcs.Columns.Count = 4
|
|
listapcs.Columns[0].Width = 200
|
|
listapcs.Columns[1].Width = 125
|
|
listapcs.Columns[2].width = 180
|
|
listapcs.Columns[0].Text = "Nombre"
|
|
listapcs.Columns[1].Text = "Dirección IP"
|
|
listapcs.Columns[2].text = "MAC"
|
|
listapcs.Columns[3].text = " "
|
|
|
|
END
|
|
|
|
|
|
'****************************************************************************************************
|
|
'****************************************************************************************************
|
|
' opciones menu y botones
|
|
'****************************************************************************************************
|
|
'****************************************************************************************************
|
|
|
|
|
|
PUBLIC FUNCTION obtener_mac(cadena AS String[]) AS String
|
|
|
|
RETURN Right(cadena[2], 2) & ":" & Right(cadena[3], 2) & ":" & Right(cadena[4], 2) & ":" & Right(cadena[5], 2) & ":" & Right(cadena[6], 2) & ":" & Right(cadena[7], 2)
|
|
|
|
END
|
|
|
|
|
|
PUBLIC SUB btnrefrescar_Click()
|
|
DIM fichero1 AS String
|
|
DIM fichero2 AS String
|
|
DIM fichero3 AS String
|
|
DIM ficherounion AS String
|
|
DIM fencendidos AS File
|
|
DIM linea AS String
|
|
DIM tratalinea01 AS String[]
|
|
DIM tratalinea02 AS String[]
|
|
DIM nombre AS String
|
|
DIM ip AS String
|
|
DIM mac AS String
|
|
DIM contador AS Integer
|
|
DIM tipo AS String
|
|
|
|
|
|
IF (listapcs.Exist(0)) THEN listapcs.Clear
|
|
|
|
inicia_lista()
|
|
contador = 0
|
|
habilitar(FALSE)
|
|
fichero1 = "/tmp/equipos-workstation"
|
|
fichero2 = "/tmp/equipos-scanies"
|
|
|
|
|
|
'Se crea un fichero con los pc's que están encendidos
|
|
SHELL "avahi-browse _workstation._tcp -fkprt | grep = | grep IPv4 > " & fichero1 WAIT
|
|
SHELL "avahi-browse _scanies._tcp -fkprt | grep = | grep IPv4 > " & fichero2 WAIT
|
|
|
|
'Uno los dos ficheros y los ordeno por nombre
|
|
ficherounion = "/tmp/equipos-union"
|
|
SHELL "cat " & fichero1 & " " & fichero2 & " > " & ficherounion WAIT
|
|
fichero3 = "/tmp/encendidos"
|
|
SHELL "sort -t\";\" -k 4 " & ficherounion & " > " & fichero3 WAIT
|
|
|
|
|
|
'Saco los datos de los pc's encendidos
|
|
TRY OPEN fichero3 FOR READ AS #fencendidos
|
|
WHILE NOT Eof(fencendidos)
|
|
LINE INPUT #fencendidos, linea
|
|
|
|
tratalinea01 = Split(linea, ";") 'dividimos linea en campos
|
|
|
|
'diferenciamos si es workstation o scanies
|
|
tipo = tratalinea01[4]
|
|
|
|
'workstation
|
|
IF (tipo = "_workstation._tcp") THEN
|
|
tratalinea02 = Split(tratalinea01[3], "\\") 'dividimos campo 3 que contiene el nombre y la mac"
|
|
nombre = tratalinea02[0]
|
|
mac = obtener_mac(tratalinea02)
|
|
ip = tratalinea01[7]
|
|
ENDIF
|
|
|
|
'scanies
|
|
IF (tipo = "_scanies._tcp") THEN
|
|
nombre = tratalinea01[3]
|
|
tratalinea02 = Split(tratalinea01[9], "#")
|
|
ip = Replace(tratalinea02[0], "\"", "")
|
|
mac = Replace(tratalinea02[1], "\"", "")
|
|
ENDIF
|
|
|
|
listapcs.Add(contador, nombre)
|
|
listapcs[contador][1] = ip
|
|
listapcs[contador][2] = mac
|
|
|
|
IF (tipo = "_workstation._tcp") THEN
|
|
listapcs[contador][3] = "x"
|
|
ELSE
|
|
listapcs[contador][3] = " "
|
|
ENDIF
|
|
|
|
contador = contador + 1
|
|
|
|
WEND
|
|
|
|
CLOSE #fencendidos
|
|
lblnequipos.text = "Numero de equipos encendidos: " & contador
|
|
habilitar(TRUE)
|
|
|
|
END
|
|
|
|
|
|
PUBLIC SUB mnuConfiguracion2_Click()
|
|
|
|
frmconfiguracion.Show
|
|
|
|
END
|
|
|
|
PUBLIC SUB btnsalir_Click()
|
|
|
|
ME.Close
|
|
|
|
END
|
|
|
|
PUBLIC SUB mnuRefrescar_Click()
|
|
|
|
btnrefrescar_click()
|
|
|
|
END
|
|
|
|
PUBLIC SUB mnuSalir_Click()
|
|
|
|
btnsalir_Click()
|
|
|
|
END
|
|
|
|
PUBLIC SUB mnuAyuda2_Click()
|
|
|
|
frmayuda.Show
|
|
|
|
END
|
|
|
|
PUBLIC SUB listapcs_Click()
|
|
|
|
indice = listapcs.Current.Key
|
|
|
|
END
|
|
|
|
|
|
PUBLIC SUB listapcs_Menu()
|
|
'DIM tocado AS Boolean
|
|
|
|
' TRY tocado = LAST.current.selected
|
|
' IF NOT ERROR THEN
|
|
mnupopup.Popup
|
|
' indice = LAST.item.key
|
|
' ENDIF
|
|
|
|
END
|
|
|
|
PUBLIC SUB mnuconectar_Click()
|
|
DIM direccion AS String
|
|
|
|
IF (listapcs[indice][3] = " ") THEN
|
|
message.Info("No hay conexión a esa red")
|
|
ELSE
|
|
direccion = listapcs[indice][1]
|
|
SHELL "gnome-terminal -x ssh root@" & direccion
|
|
ENDIF
|
|
|
|
END
|
|
|
|
|
|
PUBLIC SUB mnupdf_Click()
|
|
DIM fecha AS String
|
|
DIM fichero AS String
|
|
DIM ficheropdf AS String
|
|
DIM x AS Integer
|
|
DIM y AS Integer
|
|
DIM yinc1 AS Integer
|
|
DIM yinc2 AS Integer
|
|
DIM xinc1 AS Integer
|
|
DIM xinc2 AS Integer
|
|
DIM i AS Integer
|
|
DIM snombre AS String
|
|
DIM sdireccionip AS String
|
|
DIM smac AS String
|
|
DIM npagina AS Integer
|
|
|
|
'generar un fichero con los datos de los equipos
|
|
|
|
fecha = Now() 'Format(Now, "dd-mm-yyyy")
|
|
fichero = "/tmp/scanies-report.ps"
|
|
ficheropdf = User.home & "/Desktop/scanies-report.pdf"
|
|
npagina = 1
|
|
Printer.copies = 1
|
|
Printer.name = ""
|
|
Printer.size = "A4"
|
|
Printer.file = fichero
|
|
|
|
Draw.Begin(printer)
|
|
Draw.Font.name = "FreeSans"
|
|
|
|
'cabecera *****************************************************************
|
|
x = 250
|
|
y = 200
|
|
|
|
Draw.Font.size = 6
|
|
Draw.Text("Documento generado: " & fecha & " --- Página " & npagina, x + 3250, y - 100)
|
|
|
|
Draw.Font.size = 24
|
|
Draw.Font.Bold = TRUE
|
|
Draw.Text("*** ScanIES ***", x + 1500, y)
|
|
Draw.Font.size = 10
|
|
|
|
yinc1 = 200
|
|
xinc1 = 1800
|
|
xinc2 = 3700
|
|
y = y + yinc1 + yinc1
|
|
|
|
Draw.Font.size = 16
|
|
Draw.Text("Nombre", x, y)
|
|
Draw.Text("Dirección IP", x + xinc1, y)
|
|
Draw.Text("MAC", x + xinc2, y)
|
|
|
|
|
|
'cuerpo *************************************************************
|
|
y = y + yinc1
|
|
yinc2 = 100
|
|
Draw.Font.size = 10
|
|
Draw.Font.bold = FALSE
|
|
|
|
FOR i = 0 TO listapcs.Count
|
|
|
|
IF (listapcs.Exist(i)) THEN
|
|
snombre = listapcs[i][0]
|
|
sdireccionip = listapcs[i][1]
|
|
smac = listapcs[i][2]
|
|
|
|
Draw.Text(snombre, x, y)
|
|
Draw.Text(sdireccionip, x + xinc1, y)
|
|
Draw.Text(smac, x + xinc2, y)
|
|
|
|
y = y + yinc2
|
|
|
|
IF (y > 6400) THEN 'debemos comenzar una nueva página *******************************
|
|
'incluimos la cabecera y modificamos el valor de y **********************************
|
|
printer.NewPage
|
|
npagina = npagina + 1
|
|
Draw.Font.size = 6
|
|
Draw.Text("Documento generado: " & fecha & " --- Página " & npagina, x + 3250, 100)
|
|
y = 400
|
|
Draw.Font.size = 16
|
|
Draw.Font.Bold = TRUE
|
|
Draw.Text("Nombre", x, y)
|
|
Draw.Text("Dirección IP", x + xinc1, y)
|
|
Draw.Text("MAC", x + xinc2, y)
|
|
Draw.Font.size = 10
|
|
Draw.Font.bold = FALSE
|
|
y = y + yinc1
|
|
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
NEXT
|
|
|
|
Draw.End
|
|
|
|
'convertimos el fichero ps a pdf
|
|
SHELL "ps2pdf " & fichero & " " & ficheropdf WAIT
|
|
Message.Info("Fichero generado en el escritorio")
|
|
|
|
END
|
|
|
|
|
|
PUBLIC SUB btnnmap_Click()
|
|
|
|
frmnmap.ShowModal
|
|
|
|
END
|
|
|
|
PUBLIC SUB btnproftodoson_Click()
|
|
DIM profesores AS String
|
|
DIM temporal AS String
|
|
|
|
temporal = Temp()
|
|
profesores = "/tmp/profesores-ldap"
|
|
SHELL "awk '{ print $2 }' " & profesores & " > " & temporal WAIT
|
|
SHELL "wakeonlan -f " & temporal WAIT
|
|
message.Info("Enviada señal de encendido a todos los equipos de profesor")
|
|
|
|
END
|
|
|
|
|
|
PUBLIC SUB btnprofon_Click()
|
|
DIM profesores AS String
|
|
DIM temporal AS String
|
|
DIM mac AS String
|
|
|
|
temporal = Temp()
|
|
profesores = "/tmp/profesores-ldap"
|
|
SHELL "grep " & cmbaulas.text & " " & profesores & " | cut -f2 -d\" \" > " & temporal WAIT
|
|
|
|
TRY mac = file.Load(temporal)
|
|
SHELL "wakeonlan " & mac
|
|
message.Info("Enviada señal de encendido al equipo " & cmbaulas.text)
|
|
|
|
END
|