[pyar] Alto consumo de swap
Nicolas Rebagliati
nicolas.rebagliati en aenima-x.com.ar
Jue Oct 28 16:37:22 ART 2010
si aca va, no soy lo mas pro codeando, pero espero que se entienda.
Para que se entienda mejor esto es lo que hace.
Hay otro programa en python que es un cliente de ssh en curses, que esta
puesto como shell de los usuarios en este equipo.
Por lo cual al logearse automáticamente lo ejecutan.
Al momento de ejecutarse se conecta por RPC a este programa, y le manda el
objeto usuario que el otro genera.
Este programa lo que hace es almacenar en el diccionario el objeto y como
indice usa el PID del otro proceso.
Como el otro programa es un cliente de SSH, cuando se conectan a algun
equipo, le manda el equipo al que se conecto.
Para lo cual se busca en el diccionario el objeto (usando el PID como
referencia) y se guarda en que equipo esta logeado.
Aclaro en el diccionario lo que guardo es una lista, conteniendo el objeto y
a donde esta logeado.
Tambien hay un timer que lo que hace es cada X tiempo chekea que todos los
PID que estan cargados aun esten vivos, en caso de que no lo esten los
borra. Ya que puede pasar que por algo el el cliente ssh muera y nunca le
avise que se desconecto.
No creo que en el diccionario se guarde info de mas, ya que el contenido se
muestra por una web..y nunca hay gente logeada en el diccionario que no este
realmente logeada en el equipo.
Espero que se entienda.
######################
import sys
import os
import datetime
sys.path.append('/home/bastion-dev/lib')
import bastion
import bastion_user
import psutil
from threading import Event, Thread
PYRO_PORT = 9990
LOG = '/var/log/bastionManager.log'
class bastionManager(object):
bastionClients = {} # Es un Diccionario que contiene listas de
[objBastion,Equipo Actual]
banned_users = ['tid_']
window = [0,1,2,3,4,5]
#file = open(LOG, 'w')
def checkPid(self,pid):
try:
os.kill(pid,0)
except OSError:
return False
else:
return True
def cleanUp(self):
self.msg("Running CleanUp...")
found = False
cleanUp = []
for client in self.bastionClients:
if not self.checkPid(self.bastionClients[client][0].pid):
found = True
self.msg("Found: %s" %
self.bastionClients[client][0])
cleanUp.append(self.bastionClients[client][0].sessionID)
if found:
for ID in cleanUp:
del self.bastionClients[ID]
def monitor(self):
print("Running Monitor...")
found = False
cleanUp = []
for client in self.bastionClients:
for i in self.banned_users:
if i in
self.bastionClients[client][0].User.getUser():
found = True
if
self.bastionClients[client][0].User.getUser() not in cleanUp:
cleanUp.append(self.bastionClients[client][0].User.getUser())
print("Banned User Logged: %s" %
self.bastionClients[client][0])
if not found:
print("Users OK")
else:
print("Doning Clean Up...")
for user in cleanUp:
self.killUser(user)
def startTimer(self):
print("Starting Timer...")
t = RepeatTimer(600.0, self.cleanUp)
t.start()
def msg(self,MSG):
now = datetime.datetime.now()
message = "[%s] %s" % (now.strftime("%Y-%m-%d %H:%M"),MSG)
print(message)
# Agregar clientes al Manager
def addClient(self,bastionObject):
if bastionObject.sessionID not in self.bastionClients:
self.msg("Adding %s" % (bastionObject))
self.bastionClients[bastionObject.sessionID] = [bastionObject,
None]
else:
self.msg("Client with sessionId %s already load..." %
bastionObject.sessionID)
def removeClient(self, bastionObject):
if bastionObject.sessionID in self.bastionClients:
self.msg("Removing %s..." % (bastionObject))
del self.bastionClients[bastionObject.sessionID]
else:
self.msg("Client %s not found to remove" %
bastionObject.sessionID)
def listClients(self):
return self.bastionClients
def clientSshStarted(self,bastionObject, host):
if bastionObject.sessionID in self.bastionClients:
self.msg("Client %s with sessionID %s connect to: %s" %
(bastionObject.User.getUser(),bastionObject.sessionID, host))
self.bastionClients[bastionObject.sessionID][1] = host
else:
self.msg("No existe la sessionID %s" %
bastionObject.sessionID)
def clientSshStoped(self,bastionObject):
if bastionObject.sessionID in self.bastionClients:
self.msg("Client %s with sessionID %s disconnect from: %s" %
(bastionObject.User.getUser(),bastionObject.sessionID,
self.bastionClients[bastionObject.sessionID][1]))
self.bastionClients[bastionObject.sessionID][1] = None
else:
self.msg("No existe la sessionID %s" %
bastionObject.sessionID)
def killClient(self, PID):
self.msg("Killing PID %s" % PID)
os.kill(PID,9)
def killUser(self, user):
found = False
deleteList = []
for client in self.bastionClients:
if self.bastionClients[client][0].User.getUser() == user:
found = True
try:
self.killClient(self.bastionClients[client][0].pid)
except:
pass
deleteList.append(client)
if found:
for client in deleteList:
self.msg("Deleting sessionID %s of user %s" %
(self.bastionClients[client][0].sessionID,self.bastionClients[client][0].User.getUser()))
del self.bastionClients[client]
return(0)
else:
return(1)
def quit(self):
sys.exit()
class RepeatTimer(Thread):
def __init__(self, interval, function, iterations=0, args=[],
kwargs={}):
Thread.__init__(self)
self.interval = interval
self.function = function
self.iterations = iterations
self.args = args
self.kwargs = kwargs
self.finished = Event()
def run(self):
count = 0
while not self.finished.is_set() and (self.iterations <= 0 or count
< self.iterations):
self.finished.wait(self.interval)
if not self.finished.is_set():
self.function(*self.args, **self.kwargs)
count += 1
def cancel(self):
self.finished.set()
2010/10/28 Gustavo Campanelli <gedece en gmail.com>
> ¿Podrías mostrar el código?
>
> Gedece
>
> 2010/10/28 Nicolas Rebagliati <nicolas.rebagliati en aenima-x.com.ar>
>
>> Si para mi tambien seguramente el diccionario ese por mas que le hago el
>> del debe estar dejando memoria tomada..y se va haciendo una bola
>> gigante...alguien tiene idea de como poder manejarlo de una mejor manera??
>>
>> 2010/10/28 Gustavo Campanelli <gedece en gmail.com>
>>
>> Me suena que el problema puede estar en la parte de delete.
>>>
>>> Gedece
>>>
>>> 2010/10/28 Nicolas Rebagliati <nicolas.rebagliati en aenima-x.com.ar>
>>>
>>>> Hola tengo hecho un pequeño script con python y pyro, que lo que hace es
>>>> mantener un diccionario con objetos que son usuarios conectados por ssh al
>>>> equipo.
>>>> El tema es que después de unas semanas de correr el proceso me empieza a
>>>> consumir mucha swap..y no tengo idea del porque.
>>>> Al principio pense que era por el log que deja, pero me acorde que el
>>>> script en si no escribe, solo tira los mensajes por consola y el script de
>>>> bash que lo ejecuta es el que tira la salida al log..asique eso no es.
>>>> Puede ser que el tema sea el diccionario que esta siempre en memoria y
>>>> constantemente se va modificando???
>>>> cada vez que alguien se logea agrega al diccionario el objeto y al
>>>> logout hace un del
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> pyar mailing list pyar en python.org.ar
>>>> http://listas.python.org.ar/listinfo/pyar
>>>>
>>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>>>
>>>
>>>
>>> _______________________________________________
>>> pyar mailing list pyar en python.org.ar
>>> http://listas.python.org.ar/listinfo/pyar
>>>
>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>>
>>
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20101028/8a76dd0b/attachment.html>
More information about the pyar
mailing list