Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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 BeautifulSoup

class 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 wink
    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'affichage


if __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 OptionParser

usage = """
                    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 optparse

noms_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'envoi

print 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 smile

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