147 lines
3.5 KiB
Python
147 lines
3.5 KiB
Python
# coding=utf-8
|
|
|
|
import re
|
|
import sys
|
|
import socket
|
|
import time
|
|
from datetime import datetime
|
|
from datetime import date
|
|
from datetime import timedelta
|
|
from urllib.parse import unquote
|
|
from xml.dom.minidom import parse
|
|
from xml.dom.minidom import parseString
|
|
from xml.dom.minidom import getDOMImplementation
|
|
|
|
NS_SERVER = 'ns-server.epita.fr'
|
|
NS_PORT = 4242
|
|
|
|
class UpdatedStorage:
|
|
def __init__(self):
|
|
sock = connect_to_ns(NS_SERVER, NS_PORT)
|
|
self.users = dict()
|
|
for l in list_users(sock):
|
|
u = User(l)
|
|
self.users[u.login] = u
|
|
sock.close()
|
|
self.lastUpdate = datetime.now ()
|
|
|
|
def update(self):
|
|
if datetime.now () - self.lastUpdate < timedelta(minutes=10):
|
|
return self
|
|
else:
|
|
return None
|
|
|
|
|
|
class User(object):
|
|
def __init__(self, line):
|
|
fields = line.split()
|
|
self.login = fields[1]
|
|
self.ip = fields[2]
|
|
self.location = fields[8]
|
|
self.promo = fields[9]
|
|
|
|
@property
|
|
def sm(self):
|
|
if self.ip.startswith('10.200'):
|
|
return 'en SM' + self.ip.split('.')[2]
|
|
elif self.ip.startswith('10.247'):
|
|
return 'en pasteur'
|
|
elif self.ip.startswith('10.248'):
|
|
return 'en srlab'
|
|
elif self.ip.startswith('10.249'):
|
|
return 'en midlab'
|
|
elif self.ip.startswith('10.250'):
|
|
return 'en cisco'
|
|
elif self.ip.startswith('10'):
|
|
return 'quelque part sur le PIE (%s)'%self.ip
|
|
else:
|
|
return "chez lui"
|
|
|
|
@property
|
|
def poste(self):
|
|
if self.sm is None:
|
|
if self.ip.startswith('10'):
|
|
return 'quelque part sur le PIE (%s)'%self.ip
|
|
else:
|
|
return "chez lui"
|
|
else:
|
|
return self.sm + " rangée " + self.ip.split('.')[2] + " poste " + self.ip.split('.')[3]
|
|
|
|
def __cmp__(self, other):
|
|
return cmp(self.login, other.login)
|
|
|
|
def __hash__(self):
|
|
return hash(self.login)
|
|
|
|
def connect_to_ns(server, port):
|
|
s = socket.socket()
|
|
s.connect((server, port))
|
|
s.recv(8192) # salut ...
|
|
return s
|
|
|
|
def list_users(sock):
|
|
sock.send('list_users\n'.encode())
|
|
buf = ''
|
|
while True:
|
|
tmp = sock.recv(8192).decode()
|
|
buf += tmp
|
|
if '\nrep 002' in tmp or tmp == '':
|
|
break
|
|
return buf.split('\n')[:-2]
|
|
|
|
|
|
def load_module(datas_path):
|
|
"""Load this module"""
|
|
return
|
|
|
|
def save_module():
|
|
"""Save the module state"""
|
|
return
|
|
|
|
def help_tiny ():
|
|
"""Line inserted in the response to the command !help"""
|
|
return "Find a user on the PIE"
|
|
|
|
def help_full ():
|
|
return "!whereis /who/: gives the position of /who/."
|
|
|
|
datas = None
|
|
|
|
def parseanswer (msg):
|
|
global datas
|
|
if msg.cmd[0] == "whereis" or msg.cmd[0] == "ouest":
|
|
if datas is not None:
|
|
datas = datas.update ()
|
|
if datas is None:
|
|
datas = UpdatedStorage()
|
|
|
|
if len(msg.cmd) >= 2:
|
|
name = msg.cmd[1]
|
|
else:
|
|
name = msg.sender
|
|
|
|
if name in datas.users:
|
|
msg.send_chn ("%s est %s (%s)." %(name, datas.users[name].poste, unquote(datas.users[name].location)))
|
|
else:
|
|
msg.send_chn ("%s n'est pas connecté sur le PIE." % name)
|
|
|
|
return True
|
|
elif msg.cmd[0] == "ip":
|
|
if len(msg.cmd) >= 2:
|
|
name = msg.cmd[1]
|
|
else:
|
|
name = msg.sender
|
|
|
|
if name in datas.users:
|
|
msg.send_chn ("L'ip de %s est %s." %(name, datas.users[name].ip))
|
|
else:
|
|
msg.send_chn ("%s n'est pas connecté à netsoul." % name)
|
|
return True
|
|
return False
|
|
|
|
def parseask (msg):
|
|
return False
|
|
|
|
def parselisten (msg):
|
|
return False
|