Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Miguel Ángel González Gallardo
/
AnalizadorLogs
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
8755363f
authored
Mar 31, 2021
by
Miguel Ángel González Gallardo
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Tabla registros GUI funcionando
parent
75e9b958
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
131 additions
and
73 deletions
codigo/AnalisisDuracionSesion.py
codigo/AnalisisPaginasVisitadas.py
codigo/Cesta.py
codigo/Dato.py
codigo/Filtros.py
codigo/Gestor.py
codigo/Gui.py
codigo/Gui_Utils.py
codigo/ObtencionRegistro.py
codigo/idsUsuarioSesion.py
codigo/AnalisisDuracionSesion.py
View file @
8755363f
...
...
@@ -8,14 +8,14 @@ def getDuracionSesion(id, registrosOrdenados):
iMin
=
-
1
iMax
=
-
1
for
i
in
range
(
len
(
registrosOrdenados
)):
if
registrosOrdenados
[
i
]
.
id
Sesion
==
id
:
if
registrosOrdenados
[
i
]
.
ID_
Sesion
==
id
:
if
iMin
==
-
1
:
iMin
=
i
else
:
iMax
=
i
if
-
1
==
iMax
:
# Si solo se ha hecho un acceso en la sesion, devolvemos None para ignorar la sesion
return
None
return
abs
(
registrosOrdenados
[
iMax
]
.
marcaTiempo
-
registrosOrdenados
[
iMin
]
.
marca
Tiempo
)
return
abs
(
registrosOrdenados
[
iMax
]
.
Marca_Tiempo
-
registrosOrdenados
[
iMin
]
.
Marca_
Tiempo
)
def
estadisticasDuracionSesiones
(
registros
):
...
...
codigo/AnalisisPaginasVisitadas.py
View file @
8755363f
...
...
@@ -13,8 +13,8 @@ def getEstadisticasPaginasVisitadas(registros):
for
p
in
paginas
:
sesiones
=
set
()
for
r
in
registros
:
if
r
.
url
==
p
:
sesiones
.
add
(
r
.
id
Sesion
)
if
r
.
URL_Solicitada
==
p
:
sesiones
.
add
(
r
.
ID_
Sesion
)
cantidad
=
len
(
sesiones
)
ocurrencias
.
append
(
cantidad
)
if
max
<
cantidad
:
...
...
codigo/Cesta.py
View file @
8755363f
...
...
@@ -26,12 +26,12 @@ def obtenerDirectorios(registros, umbral):
# Obtenemos los registros diferentes con sus contadores
for
r
in
registros
:
if
r
.
url
not
in
directorios
:
directorios
.
append
(
r
.
url
)
if
r
.
URL_Solicitada
not
in
directorios
:
directorios
.
append
(
r
.
URL_Solicitada
)
contadores
.
append
(
1
)
sesiones
.
append
(
r
.
id
Sesion
)
sesiones
.
append
(
r
.
ID_
Sesion
)
else
:
pos
=
directorios
.
index
(
r
.
url
)
pos
=
directorios
.
index
(
r
.
URL_Solicitada
)
contadores
[
pos
]
+=
1
directorios
,
contadores
,
sesiones
=
quitarExcluidos
(
directorios
,
contadores
,
sesiones
,
umbral
)
...
...
codigo/Dato.py
View file @
8755363f
...
...
@@ -3,24 +3,27 @@ from datetime import datetime
# Definimos la clase dato con: Host Remoto, fecha, metodo de petición, url, protocolo, etc...
class
Dato
:
#Constructor por defecto para instanciarlo en GUI (No tocar)
def
__init__
(
self
,
cadena
):
# Atributos
self
.
host
Remoto
=
None
self
.
f
echa
=
None
self
.
metodo
Peticion
=
None
self
.
url
=
None
self
.
v
Protocolo
=
None
self
.
status
Code
=
None
self
.
volumenTransf
=
None
self
.
marca
Tiempo
=
None
self
.
Host_
Remoto
=
None
self
.
F
echa
=
None
self
.
Metodo_
Peticion
=
None
self
.
URL_Solicitada
=
None
self
.
V_
Protocolo
=
None
self
.
Status_
Code
=
None
self
.
V_Transferencia
=
None
self
.
Marca_
Tiempo
=
None
# Otros atributos que se agregaran posteriormente en gestor
self
.
id
Usuario
=
None
self
.
id
Sesion
=
None
self
.
ID_
Usuario
=
None
self
.
ID_
Sesion
=
None
# Se obtienen todos los datos
self
.
obtenerDatos
(
cadena
)
try
:
self
.
obtenerDatos
(
cadena
)
except
:
pass
# Funcion que asigna los valores debidos a la clase
def
obtenerDatos
(
self
,
cadena
):
...
...
@@ -29,44 +32,44 @@ class Dato:
aux
=
""
# Obtenemos todos los valores necesarios, hostRemoto, fecha
self
.
host
Remoto
,
c
=
sacarLinea
(
cadena
,
c
,
aux
,
' '
)
self
.
f
echa
,
c
=
leerFecha
(
cadena
,
c
,
aux
)
self
.
Host_
Remoto
,
c
=
sacarLinea
(
cadena
,
c
,
aux
,
' '
)
self
.
F
echa
,
c
=
leerFecha
(
cadena
,
c
,
aux
)
# Obtenemos modo de petición, url y protocolo
c
=
leerLinea
(
cadena
,
c
,
'"'
)
self
.
metodo
Peticion
,
c
=
sacarLinea
(
cadena
,
c
,
aux
,
' '
)
self
.
url
,
c
=
sacarLinea
(
cadena
,
c
,
aux
,
' '
)
self
.
v
Protocolo
,
c
=
sacarLinea
(
cadena
,
c
,
aux
,
'"'
)
self
.
Metodo_
Peticion
,
c
=
sacarLinea
(
cadena
,
c
,
aux
,
' '
)
self
.
URL_Solicitada
,
c
=
sacarLinea
(
cadena
,
c
,
aux
,
' '
)
self
.
V_
Protocolo
,
c
=
sacarLinea
(
cadena
,
c
,
aux
,
'"'
)
# Obtenemos estado del código y el volumen de tranferencia
c
+=
1
self
.
status
Code
,
c
=
sacarLinea
(
cadena
,
c
,
aux
,
' '
)
self
.
volumenTransf
,
c
=
sacarLinea
(
cadena
,
c
,
aux
,
' '
)
self
.
Status_
Code
,
c
=
sacarLinea
(
cadena
,
c
,
aux
,
' '
)
self
.
V_Transferencia
,
c
=
sacarLinea
(
cadena
,
c
,
aux
,
' '
)
# Obtenemos la marca de tiempo segun al primer dia de agosto de 1995 (priemera entrada) y la fecha del registro
fechaRegistro
=
self
.
f
echa
.
timestamp
()
fechaRegistro
=
self
.
F
echa
.
timestamp
()
fechaBase
=
datetime
.
strptime
(
"01/08/1995:00:00:00"
,
'
%
d/
%
m/
%
Y:
%
H:
%
M:
%
S'
)
.
timestamp
()
self
.
marca
Tiempo
=
int
(
fechaRegistro
-
fechaBase
)
self
.
Marca_
Tiempo
=
int
(
fechaRegistro
-
fechaBase
)
# Se consideran valores erroneos, anomalos o nulos para descartarse este dato (se ignora
def
isPerdido
(
self
):
if
self
.
host
Remoto
is
None
:
if
self
.
Host_
Remoto
is
None
:
return
True
if
self
.
f
echa
is
None
:
if
self
.
F
echa
is
None
:
return
True
if
self
.
metodo
Peticion
is
None
:
if
self
.
Metodo_
Peticion
is
None
:
return
True
if
self
.
url
is
None
:
if
self
.
URL_Solicitada
is
None
:
return
True
if
self
.
v
Protocolo
is
None
:
if
self
.
V_
Protocolo
is
None
:
return
True
if
self
.
status
Code
is
None
:
if
self
.
Status_
Code
is
None
:
return
True
if
self
.
volumenTransf
is
None
:
if
self
.
V_Transferencia
is
None
:
return
True
if
self
.
marca
Tiempo
is
None
:
if
self
.
Marca_
Tiempo
is
None
:
return
True
if
self
.
marca
Tiempo
<
0
:
if
self
.
Marca_
Tiempo
<
0
:
return
True
return
False
...
...
codigo/Filtros.py
View file @
8755363f
...
...
@@ -3,7 +3,7 @@ UMBRAL_T=1#<<Parametrizar esto
def
ordenarPorSesion
(
registros
):
for
i
in
range
(
len
(
registros
)):
for
j
in
range
(
len
(
registros
)):
if
registros
[
i
]
.
idSesion
<
registros
[
j
]
.
id
Sesion
:
if
registros
[
i
]
.
ID_Sesion
<
registros
[
j
]
.
ID_
Sesion
:
registros
[
i
],
registros
[
j
]
=
registros
[
j
],
registros
[
i
]
return
registros
...
...
@@ -11,14 +11,14 @@ def ordenarPorSesion(registros):
def
getDistintasSesiones
(
registros
):
s
=
set
()
for
r
in
registros
:
s
.
add
(
r
.
id
Sesion
)
s
.
add
(
r
.
ID_
Sesion
)
return
list
(
s
)
def
getDistintasPaginas
(
registros
):
paginas
=
set
()
for
r
in
registros
:
paginas
.
add
(
r
.
url
)
paginas
.
add
(
r
.
URL_Solicitada
)
return
list
(
paginas
)
...
...
@@ -27,8 +27,8 @@ def getDistintasPaginas(registros):
def
getTiempoEnPagina
(
id
,
pagina
,
registros
):
s
=
0
# <-- Suma de los tiempos pasados entre paginas
for
i
in
range
(
len
(
registros
)
-
1
):
if
registros
[
i
]
.
url
==
pagina
and
registros
[
i
]
.
idSesion
==
id
and
registros
[
i
+
1
]
.
id
Sesion
==
id
:
s
+=
abs
(
registros
[
i
+
1
]
.
marcaTiempo
-
registros
[
i
]
.
marca
Tiempo
)
if
registros
[
i
]
.
URL_Solicitada
==
pagina
and
registros
[
i
]
.
ID_Sesion
==
id
and
registros
[
i
+
1
]
.
ID_
Sesion
==
id
:
s
+=
abs
(
registros
[
i
+
1
]
.
Marca_Tiempo
-
registros
[
i
]
.
Marca_
Tiempo
)
return
s
...
...
@@ -36,25 +36,25 @@ def getTiempoEnPagina(id, pagina, registros):
def
eliminarComportamientoAutomatico
(
registros
):
# Ordeno por sesion
reg
=
ordenarPorSesion
(
registros
)
sesionActual
=
reg
[
0
]
.
id
Sesion
sesionActual
=
reg
[
0
]
.
ID_
Sesion
iMin
=
-
1
iMax
=
-
1
idSesionesNoValidas
=
set
()
for
i
in
range
(
len
(
reg
)):
if
reg
[
i
]
.
id
Sesion
==
sesionActual
:
if
reg
[
i
]
.
ID_
Sesion
==
sesionActual
:
if
iMin
==
-
1
:
iMin
=
i
else
:
iMax
=
i
else
:
if
iMin
!=
iMax
:
# <--- Si ha visitado mas de dos paginas en la sesion miro el tiempo
tiempo
=
abs
(
reg
[
iMax
]
.
marcaTiempo
-
reg
[
iMin
]
.
marca
Tiempo
)
tiempo
=
abs
(
reg
[
iMax
]
.
Marca_Tiempo
-
reg
[
iMin
]
.
Marca_
Tiempo
)
if
tiempo
<
UMBRAL_T
:
idSesionesNoValidas
.
add
(
sesionActual
)
sesionActual
=
reg
[
i
]
.
id
Sesion
sesionActual
=
reg
[
i
]
.
ID_
Sesion
# Me quedo con los registros con ids validos
ret
=
[]
for
r
in
reg
:
if
r
.
id
Sesion
not
in
idSesionesNoValidas
:
if
r
.
ID_
Sesion
not
in
idSesionesNoValidas
:
ret
.
append
(
r
)
return
ret
codigo/Gestor.py
View file @
8755363f
...
...
@@ -25,8 +25,8 @@ def printRegistro(registros):
i
=
0
for
reg
in
registros
:
i
+=
1
print
(
informe
.
format
(
i
,
reg
.
hostRemoto
,
reg
.
fecha
,
reg
.
metodoPeticion
,
reg
.
url
,
reg
.
v
Protocolo
,
reg
.
statusCode
,
reg
.
volumenTransf
,
reg
.
marcaTiempo
,
reg
.
idUsuario
,
reg
.
id
Sesion
)
print
(
informe
.
format
(
i
,
reg
.
Host_Remoto
,
reg
.
Fecha
,
reg
.
Metodo_Peticion
,
reg
.
URL_Solicitada
,
reg
.
V_
Protocolo
,
reg
.
Status_Code
,
reg
.
V_Transferencia
,
reg
.
Marca_Tiempo
,
reg
.
ID_Usuario
,
reg
.
ID_
Sesion
)
)
...
...
@@ -78,12 +78,3 @@ printDirectorios(d, cont, num_dir, num_reg)
cesta = obtenerCestaTransformada(d, ses)
printCestaTransformada(cesta)
'''
histograma
,
max
,
min
,
moda
,
media
,
desviacionTipica
=
getEstadisticasPaginasVisitadas
(
r
)
print
(
"Max:"
+
str
(
max
)
+
"
\n
"
)
print
(
"Min:"
+
str
(
min
)
+
"
\n
"
)
print
(
"Moda:"
+
str
(
moda
)
+
"
\n
"
)
print
(
"Media:"
+
str
(
media
)
+
"
\n
"
)
print
(
"DV:"
+
str
(
desviacionTipica
)
+
"
\n
"
)
print
(
histograma
)
\ No newline at end of file
codigo/Gui.py
0 → 100644
View file @
8755363f
from
tkinter
import
*
from
tkinter
import
ttk
from
tkinter
import
messagebox
from
Gui_Utils
import
rellenarTablaRegistros
from
ObtencionRegistro
import
obtenerRegistros
from
Dato
import
Dato
from
Gestor
import
*
r
=
obtenerRegistros
(
RUTA_ARCHIVO
,
E_SPIDERING
,
EXTENSIONES_ADMITIDAS
,
EXTENSIONES_NOADMITIDAS
,
UMBRAL_SESIONES
)
#Creo la ventana
ventana
=
Tk
()
ventana
.
state
(
'zoomed'
)
ventana
.
title
(
"Analizador de Logs"
)
#Obtengo los atributos de la clase dato
atributos
=
Dato
(
""
)
.
__dict__
nombresAtributos
=
[]
for
n
in
atributos
:
nombresAtributos
.
append
(
n
)
#Creo la tabla y relleno las cabeceras
tabla
=
ttk
.
Treeview
(
ventana
,
height
=
100
,
columns
=
[
f
"#{n}"
for
n
in
range
(
0
,
len
(
nombresAtributos
))])
tabla
.
grid_propagate
(
True
)
tabla
.
config
(
show
=
'headings'
)
tabla
.
grid
(
row
=
0
,
column
=
0
,
sticky
=
'ns'
)
c
=
0
ventana
.
update
()
x
=
ventana
.
winfo_width
()
for
i
in
nombresAtributos
:
tabla
.
heading
(
'#'
+
str
(
c
)
+
''
,
text
=
i
)
tabla
.
column
(
'#'
+
str
(
c
)
+
''
,
width
=
(
x
//
len
(
nombresAtributos
)),
anchor
=
CENTER
)
c
+=
1
tabla
.
heading
(
'#'
+
str
(
c
)
+
''
,
text
=
nombresAtributos
[
0
])
rellenarTablaRegistros
(
r
,
tabla
,
nombresAtributos
)
ventana
.
mainloop
()
\ No newline at end of file
codigo/Gui_Utils.py
0 → 100644
View file @
8755363f
from
tkinter
import
*
def
getDatosRegistro
(
registro
,
atributos
):
ret
=
[]
for
a
in
atributos
:
ret
.
append
(
getattr
(
registro
,
a
))
aux
=
[]
for
i
in
range
(
1
,
len
(
ret
)):
aux
.
append
(
ret
[
i
])
aux
.
append
(
ret
[
0
])
return
aux
def
rellenarTablaRegistros
(
registros
,
tabla
,
atributos
):
index
=
iid
=
0
for
r
in
registros
:
tabla
.
insert
(
""
,
END
,
values
=
getDatosRegistro
(
r
,
atributos
))
codigo/ObtencionRegistro.py
View file @
8755363f
...
...
@@ -36,7 +36,7 @@ def obtenerDato(ret, extensionesAdmitidas, extensionesNoAdmitidas, aux):
# Compruebo si el dato pertenece a una extension NO admitida
admitir
=
True
for
ext
in
extensionesNoAdmitidas
:
if
ext
in
aux
.
url
:
if
ext
in
aux
.
URL_Solicitada
:
admitir
=
False
# Si no se corresponde con ninguna extension NO admitida, compruebo si hay que filtrar con las admitidas
...
...
@@ -46,7 +46,7 @@ def obtenerDato(ret, extensionesAdmitidas, extensionesNoAdmitidas, aux):
else
:
# Filtro con las admitidas
for
ext
in
extensionesAdmitidas
:
if
ext
in
aux
.
url
:
if
ext
in
aux
.
URL_Solicitada
:
ret
.
append
(
aux
)
return
ret
...
...
@@ -58,7 +58,7 @@ def eSpidering(reg):
c
=
0
for
r
in
reg
:
for
q
in
aQuitar
:
if
q
in
r
.
host
Remoto
.
lower
():
if
q
in
r
.
Host_
Remoto
.
lower
():
reg
.
pop
(
c
)
c
+=
1
return
reg
codigo/idsUsuarioSesion.py
View file @
8755363f
...
...
@@ -5,14 +5,14 @@ def identificaciones(registros, umbral):
# Se obtienen todos los usuarios
for
reg
in
registros
:
ip
=
reg
.
host
Remoto
ip
=
reg
.
Host_
Remoto
# Si todavia no se le ha dado un id, se le da y se agrega a la lista de identificados
if
ip
not
in
idsUsados
:
cont
+=
1
reg
.
id
Usuario
=
cont
reg
.
ID_
Usuario
=
cont
idsUsados
.
append
(
ip
)
else
:
# Si no, simplemente se agrega el id del que ya disponía
reg
.
id
Usuario
=
idsUsados
.
index
(
ip
)
+
1
reg
.
ID_
Usuario
=
idsUsados
.
index
(
ip
)
+
1
return
ordenaRegistros
(
registros
,
umbral
)
...
...
@@ -27,11 +27,11 @@ def ordenaRegistros(registros, umbral):
reg2
=
registros
[
j
+
i
]
# Se organiza por id usuario si son diferentes
if
reg2
.
idUsuario
<
reg1
.
id
Usuario
:
if
reg2
.
ID_Usuario
<
reg1
.
ID_
Usuario
:
registros
[
i
]
=
reg2
registros
[
j
+
i
]
=
reg1
else
:
# Se organiza por marca de tiempo si son iguales
if
reg2
.
idUsuario
is
reg1
.
idUsuario
and
reg2
.
marcaTiempo
<
reg1
.
marca
Tiempo
:
if
reg2
.
ID_Usuario
is
reg1
.
ID_Usuario
and
reg2
.
Marca_Tiempo
<
reg1
.
Marca_
Tiempo
:
registros
[
i
]
=
reg2
registros
[
j
+
i
]
=
reg1
...
...
@@ -41,17 +41,17 @@ def ordenaRegistros(registros, umbral):
# Identifica las sesiones de los usuarios
def
identificacionSesiones
(
registros
,
umbral
):
tam
=
len
(
registros
)
registros
[
0
]
.
id
Sesion
=
1
registros
[
0
]
.
ID_
Sesion
=
1
for
i
in
range
(
1
,
tam
):
reg2
=
registros
[
i
]
reg1
=
registros
[
i
-
1
]
# Si se supera el umbral o son diferentes usuarios se crea nueva sesion
dif
=
reg2
.
marcaTiempo
-
reg1
.
marca
Tiempo
if
dif
>
umbral
or
reg1
.
idUsuario
is
not
reg2
.
id
Usuario
:
reg2
.
idSesion
=
reg1
.
id
Sesion
+
1
dif
=
reg2
.
Marca_Tiempo
-
reg1
.
Marca_
Tiempo
if
dif
>
umbral
or
reg1
.
ID_Usuario
is
not
reg2
.
ID_
Usuario
:
reg2
.
ID_Sesion
=
reg1
.
ID_
Sesion
+
1
else
:
# Si no se asigna la sesion antigua
reg2
.
idSesion
=
reg1
.
id
Sesion
reg2
.
ID_Sesion
=
reg1
.
ID_
Sesion
return
registros
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment