#1 Le 20/06/2007, à 23:52
- Infinity
PyLiveBox
Bonsoir tout le monde!
Je m'adresse surtout aux possesseurs de LiveBox... il y en a certainement plein dans le coin
J'ai commencé un petit projet, PyLiveBox, qui offrira une fois fini une interface graphique de gestion de la table de routage de la livebox Inventel.
Pourquoi fais-je donc ça, me demanderez-vous.
Eh bien tout d'abord pour la curiosité et pour m'entrainer en Python.
Mais aussi parce que je trouve l'interface web qui permet de gérer le routage de la LiveBox assez limité... Si on veut modifier une entrée, il faut la supprimer puis la recréer...
J'en suis pour le moment seulement à l'étape ligne de commande...
C'est à dire que j'ai deux scripts, qui permettent chacun d'afficher la table de routage(j'ai encore un problème d'affichage dans le cas où une colonne serait trop grande) et d'ajouter une entrée. (Il n'y aurait rien de plus facile que d'en faire un pour en supprimer une, mais je l'ai pas encore fait).
Alors je cherche des testeurs pour trouver les éventuels bugs et m'aider à l'améliorer avant de passer à l'étape interface graphique (d'ailleurs, faudra que je me mette à apprendre PyGTK)
Pour ceux que ça intéresse, voici donc les deux scripts déjà existants:
getServices.py
#! /usr/bin/python
# -*- coding: latin1 -*-##########################################################
# Affiche la table de redirection de la LiveBox #
# Par David Wagner aka Deubeuliou aka Gheekaru #
# deubeuliou@gmail.com #
# #
# Ce script fait partie d'un projet visant à fournir #
#Une interface graphique pour gérer la table de routage #
#de la LiveBox. #
# Sous licence GPLv2 #
##########################################################import urllib, BeautifulSoup
from BeautifulSoup import BeautifulSoupclass Service:
"Une classe pour sotcker les infos sur chaque service"
def __init__(self, nom='', protocole='', port_in='', port_serveur='', ip='0.0.0.0'):
self.nom = nom
self.protocole = protocole
self.port_in = port_in
self.port_serveur = port_serveur
self.ip = ip
def __getitem__(self,attr):
return getattr(self,attr)liste_attributs = ['nom', 'protocole', 'port_in', 'port_serveur', 'ip']
def afficher_services(password=''):
"Affiche la table de redirection de la LiveBox"
if not password:
password = raw_input('Mot de passe:')
print 'connexion'
url = urllib.urlopen('http://admin:%s@192.168.1.1/router.html' % password)html = url.read()
soup = BeautifulSoup(html)liste_tr = soup.findAll('tr')[1:]
dico_services = {}for service in liste_tr: #Cette boucle permet de virer les '<td>' et '</td>' et de créer une classe pour chaque service. L'instance a le nom du service et contient toutes les infos sur le service(dont le nom!)
l_service = service.findAll('td', align=None)
l_infos = [ str(element)[4:-5] for element in l_service ]
dico_services[l_infos[0]] = Service(l_infos[0], l_infos[1], l_infos[2],l_infos[3],l_infos[4])
#print l_infos
#------A partir d'ici, tout sert à afficher le résultat en colonne(d'ailleurs, c'est pas encore parfait...)
longueurs = {'nom':0, 'protocole':0, 'port_in':0, 'port_serveur':0, 'ip':0}
dico_entete = {'nom':"Nom du service",'protocole':"Protocole",'port_in':"Port d'entree",'port_serveur':"Port du serveur",'ip':"IP du serveur"}
#Il manque volontairement un accent à "entrée" car le 'é' compte pour 2 caractères, ça fout le bordel ds la mise en page... mais il est quand même affiché, car l'affichage des en-têtes n'utilise pas ce dico
for service in dico_services.values(): # Cette double boucle crée un dico contenant la plus grande longueur de chaque attribut. Permet de mettre en forme l'afichage.
for attr in longueurs.keys():
longueurs[attr] = max(len(service[attr]), longueurs[attr])
liste_longueurs = [longueurs[attr]-len(dico_entete[attr])+1 for attr in liste_attributs] #On transforme le dico en liste triée en soustrayant en passage la longueur de l'en-tête
#Si un en-tête est plus long que les attributs dont il est l'entete, on met 1(un espace) dans la liste des longueurs
liste_longueurs = [max(1, liste_longueurs[i]) for i in range(0,5)]
#Remarque: On peut certainement améliorer la lisibilité et la rapidité du code pour la mise en forme...
print("Nom du service"+' '*liste_longueurs[0]+"Protocole"+' '*liste_longueurs[1]+"Port d'entrée"+' '*liste_longueurs[2]+"Port du serveur"+' '*liste_longueurs[3]+"IP du serveur")
for service in dico_services.values():
chaine = ''
for attr in liste_attributs:
#print attr, service[attr], type(service[attr])
chaine += service[attr] + ' '*( len(dico_entete[attr])-len(service[attr])+liste_longueurs[liste_attributs.index(attr)] )
print chaine
#print( '\t'.join([i[attr] for attr in liste_attributs]) )
#------Fin du code qui sert juste à l'affichageif __name__ == "__main__":
afficher_services('')
addService.py
#! /usr/bin/python
# -*- coding: latin1 -*-##########################################################
#Ajout de redirection à la table de routage de la LiveBox#
# Par David Wagner aka Deubeuliou aka Gheekaru #
# deubeuliou@gmail.com #
# #
# Ce script fait partie d'un projet visant à fournir #
#Une interface graphique pour gérer la table de routage #
#de la LiveBox. #
# Sous licence GPLv2 #
##########################################################import sys, urllib, getServices#, getopt
from optparse import OptionParserusage = """
Aide:
Vous devez spécifier les options comme suit(sans espaces!):Mot de passe de connexion: --password=<votre mot de passe>
Nom du service: --nom=<le nom du service>
Protocole: --protocole=<TCP ou UDP>
Port d'entrée: --port-in=<le numéro du port que la LiveBox ouvrira>
Port du serveur: --port-server=<le numéro du port que le serveur écoute>
IP du serveur: --ip-serveur=<l'ip de la machine où tourne le serveur>
S'il manque des paramètres, ils vous seront demandés
"""
#Nom de connexion(toujours 'admin'): --user=admin# try: # Récuppérer les options de la ligne de commande
# opts, args = getopt.getopt(sys.argv[1:], 'h',['password=','nom=','protocole=','port-in=','port-serveur=','ip-serveur=','help'])
# except getopt.GetoptError:
# print usage
# sys.exit(2)
#---getopt remplacé par optparsenoms_parametres=['user', 'password', 'nom', 'protocole', 'port_in', 'port_serveur', 'ip_serveur']
parser = OptionParser()
#parser.add_option("-u","--user", dest='user',metavar="UTILISATEUR")
parser.add_option("-p","--password", dest='password',metavar="PASSWORD")
parser.add_option("-n","--nom", dest='nom',metavar="NOM")
parser.add_option("-P","--protocole", dest='protocole',metavar="PROTOCOLE")
parser.add_option("-i","--port-in",dest='port_in' ,metavar="PORT D'ENTRÉE")
parser.add_option("-o","--port-serveur", dest='port_serveur',metavar="PORT D'ÉCOUTE")
parser.add_option("-s","--ip-serveur", dest='ip_serveur',metavar="IP DU SERVEUR")
(option, arguments) = parser.parse_args()dico_parametres={'user':'admin', 'password':option.password, 'nom':option.nom, 'protocole':option.protocole, 'port_in':option.port_in, 'port_serveur':option.port_serveur, 'ip_serveur':option.ip_serveur}
print dico_parametres
# for opt, val in opts: #On récuppère les pamramètres
# if opt in ('--password','--nom','--protocole','--port-in','--port-serveur','--ip-serveur'):
# dico_parametres[ opt[2:] ] = val
# elif opt in ("-h","--help"):
# print usage
# sys.exit()
# else:
# print usage
# sys.exit(2)for i in noms_parametres: #S'il manque des paramètres, on les demande
if str(dico_parametres[i]).strip() in ('None',''):
dico_parametres[i] = raw_input(i+':')parametres_envoi = []
for i in noms_parametres: #On réunit les paramètres dans une liste
parametres_envoi.append(dico_parametres[i]) #
PARAMS=tuple(i for i in parametres_envoi) #Et on la transforme en tuple pour faciliter l'envoiprint dico_parametres
urllib.urlopen('http://%s:%s@192.168.1.1/scvrtsrv.cmd?action=add&srvName=%s&protocol=%s&inPrt=%s&srvPrt=%s&srvAddr=%s' % PARAMS) #On envoie la requête, ce qui a pour effet la création d'une nouvelle redirection
print "Vérification:"
getServices.afficher_services(dico_parametres['password'])
en espérant avoir des retour!
A bientôt
Dernière modification par Infinity (Le 21/06/2007, à 17:44)
Hors ligne
#2 Le 21/06/2007, à 10:53
- obibann
Re : PyLiveBox
Si toi tu trouves cela utile, d'autres personnes trouveront cela utile. Donc le projet l'est automatiquement. Combler des lacunes et créer des interfaces est toujours intéressant et formateur (j'en sais quelque chose je suis développeur Web ^^).
Je n'ai pas de Livebox mais te souhaite bon courage dans ton projet. C'est grâce à toutes les initiatives de personnes comme toi que le libre avance.
Bon courage !
Ubuntu 16.04
Avec Windows, on fait ce qu'on peut... Avec Linux, on fait ce qu'on veut !! :p
Hors ligne
#3 Le 21/06/2007, à 12:36
- brizou
Re : PyLiveBox
Petite question c'est pour la livebox sagem ou inventel ?
parce que j'ai la sagem et je crois que je n'ai pas besoin de supprimer les entrées je peux les modifier
Dernière modification par brizou (Le 21/06/2007, à 12:36)
Hors ligne
#4 Le 21/06/2007, à 17:44
- Infinity
Re : PyLiveBox
Merci beaucoup de ton soutient obibann !
J'avais zappé qu'il y avait 2 LiveBoxes...j'ai une inventel moi...
Bon, j'édite pour spécifier qu'il s'agit de l'inventel. Si tu vois qqchà améliorer pour la Sagem, fait moi signe, ça ne devrait pas être très dur de modifier les scripts.. la structure est en place.
Merci de t'y intéresser en tout cas !
Dernière modification par Infinity (Le 21/06/2007, à 17:45)
Hors ligne