p-dor / LiveboxMonitor

Interface graphique de contrôle d'une Livebox 4, 5, 6 ou 7
https://p-dor.github.io/LiveboxMonitor/
MIT License
298 stars 16 forks source link

Echec récupération icones en admin distante en v1.1 #39

Closed matrixbx closed 1 year ago

matrixbx commented 1 year ago

Salut, sur une LB4.

Cannot request device icon e_liveplug_cpl.png. Cannot request device icon e_camera_ip.png. Cannot request device icon e_ordibureau_Linux.png. Cannot request device icon e_default_device.png. Cannot request device icon e_smart_plug.png. Cannot request device icon e_pointacceswifi.png. ...

p-dor commented 1 year ago

Bonjour, hélas malgré plusieurs tentatives je n'ai jamais réussi à faire fonctionner cet accès à distance à la Livebox avec ma configuration. Ce qui fait que je ne peux pas tester...

Pour accéder aux icônes le programme reprend l'URL de base de la Livebox, y rajoute le chemin vers les icônes assets/common/images/app_conf/ puis le nom du fichier correspondant. Par exemple en accès local standard, l'URL de la première icône dans votre liste est http://livebox.home/assets/common/images/app_conf/e_liveplug_cpl.png

En accès distant votre URL devient quelque chose comme ceci : https://monIP:monPort/ ou https://monNomDeDomaine.com:monPort/. Vous pouvez tester avec n'importe quel navigateur si vous pouvez accéder aux icônes. Déjà quelle erreur voyez vous avec : https://monIP:monPort/assets/common/images/app_conf/e_liveplug_cpl.png et qu'est ce que cela donne en http ? http://monIP:monPort/assets/common/images/app_conf/e_liveplug_cpl.png

matrixbx commented 1 year ago

Re salut, Attention livebox.home ne fonctionne que si on utilise le relais dns de la box ! les icônes sont bien affichées en http://192.168.1.1 ou https://monNomDeDomaine.ddns.net:monPort (sans authentification). Note, il y a un bug sur la lb4 en v4.65, après un reboot, l'admin distante n'est plus fonctionnelle, il faut la déconfigurer/reconfigurer.

p-dor commented 1 year ago

Ce que je voulais dire c'est que le programme se contente de "coller" l'URL de la Livebox indiqué dans la configuration avec le chemin de l'icône. Donc si votre URL en distant est du type https://monnomdedomaine.ddns.net:monPort/ et que https://monnomdedomaine.ddns.net:monPort/assets/common/images/app_conf/e_liveplug_cpl.png fonctionne, alors je n'ai aucune explication sur pourquoi le programme n'y arrive pas car il utilise exactement la même URL...

matrixbx commented 1 year ago

Ce bout de code désactive aussi la vérif de sécurité due au certificat de la box ? J'ai la même erreur avec une LB5.

p-dor commented 1 year ago

Oui tout comme pour vos scripts je n'ai pas trouvé d'autres solutions que désactiver la vérification de ce certificat... Voir la discussion dans ce ticket : https://github.com/p-dor/LiveboxMonitor/issues/29 Si cela provient de cela je n'ai malheureusement pas d'idée mais j'ai quelques doutes quand même... Et cela ne m'étonne pas que cela retourne la même erreur avec une LB5 ou LB6, elles sont très semblables à bien des égards.

Sinon pour aller plus loin pourriez vous afficher les logs que vous voyez quand l'erreur de chargement des icônes apparait ? Mettez le niveau 2 et on devrait en savoir plus sur les erreurs exactes retournées.

matrixbx commented 1 year ago

Rien d'explicite malheureusement. $ ./LiveboxMonitor.py 2>&1 | grep -v -E "InsecureRequestWarning|warnings.warn("

DEBUG-L1: Loading saved cookies

DEBUG-L1: Request: ws with {'parameters': {}, 'service': 'sysbus.DeviceInfo', 'method': 'get'}

DEBUG-L2: Request duration: 0:00:00.047817

DEBUG-L1: Reply: {'status': {'Manufacturer': 'Sercomm', 'ManufacturerOUI': '2C0823', 'ModelName': 'SercommVD836_Livebox4', 'Description': 'Sercom...

DEBUG-L1: -------------------------

DEBUG-L1: Request: ws with {'parameters': {'expression': 'physical and !self and !voice'}, 'service': 'sysbus.Devices', 'method': 'get'}

DEBUG-L2: Request duration: 0:00:00.693497

DEBUG-L1: Reply: {'status': [{'Key': 'xx:xx:xx:xx:xx:xx', 'DiscoverySource': 'bridge', 'Name': 'Intellon HomePlug AV Device', 'DeviceType': 'Home...

DEBUG-L1: -------------------------

DEBUG-L1: Request: ws with {'parameters': {'SendXmlFile': 'false'}, 'service': 'sysbus.TopologyDiagnostics', 'method': 'buildTopology'}

DEBUG-L2: Request duration: 0:00:00.428324

DEBUG-L1: Reply: {'status': [{'LastUpdate': '2023-05-07T14:56:34Z', 'DiagnosticMode': 'LocalRequestFromGUI', 'APIVersion': '1.0.2', 'Key': 'HGW',...

DEBUG-L1: -------------------------

Cannot request device icon e_liveplug_cpl.png. Cannot request device icon e_camera_ip.png. Cannot request device icon e_ordibureau_Linux.png.

DEBUG-L1: JSON DUMP: {"events": ["Devices.Device", "HomeLan"]}

DEBUG-L1: Request: ws with {'events': ['Devices.Device', 'HomeLan']}

DEBUG-L1: Event request timeout error: HTTPSConnectionPool(host='xxxxxxx.ddns.net', port=xxxxx): Read timed out. (read timeout=2)

DEBUG-L1: JSON DUMP: {"events": ["Devices.Device", "HomeLan"]}

DEBUG-L1: Request: ws with {'events': ['Devices.Device', 'HomeLan']}

...

p-dor commented 1 year ago

En regardant mon code de plus près je pense avoir une piste. Je pensais que j'utilisais la session en cours (via LmSession) pour aller chercher les icônes, mais en fait comme il n'y a pas besoin du tout d'être signé je fais un appel direct. Ce qui explique non seulement le manque de logs (tous les appels à LmSession sont très loggés) mais probablement aussi pourquoi cela ne fonctionne pas car ce ne sont QUE les appels via LmSession qui ont le check de certificat désactivé, pas cet appel direct.

Est-il possible pour vous de lancer le programme via les sources avec Python ? Si je vous passe une nouvelle version du module LmConfig.py vous sera-t'il possible de le tester ?

matrixbx commented 1 year ago

yep

p-dor commented 1 year ago

Ok super, si vous modifiez le la fonction getDeviceIcon() dans le fichier LmConfig.py comme ceci qu'est ce que cela donne ? Si une erreur se produit vous devriez aussi voir plus de détails dans les logs.

    ### Get a device icon
    @staticmethod
    def getDeviceIcon(iDevice):
        if LmConf.AllDeviceIconsLoaded:
            return iDevice['PixMap']
        else:
            aIconPixMap = iDevice.get('PixMap', None)
            if aIconPixMap is None:
                aIconPixMap = QtGui.QPixmap()

                try:
                    aIconData = requests.get(LmConf.LiveboxURL + ICON_URL + iDevice['Icon'], verify = LmConf.LiveboxURL.startswith('http://'))
                    if not aIconPixMap.loadFromData(aIconData.content):
                        LmTools.Error('Cannot load device icon ' + iDevice['Icon'] + '.')
                except BaseException as e:
                    LmTools.Error('Error: {}. Cannot request device icon ' + iDevice['Icon'] + '.'.format(e))

                iDevice['PixMap'] = aIconPixMap

            return aIconPixMap
matrixbx commented 1 year ago

C'est mieux. J'ai bien les icônes dans l'onglet "Appareils", mais si j’essaie d'assigner un type dans 'Infos appareils", ça mouline dans le vide ("chargement des icônes .."), rien dans les logs et je dois tuer l'appli qui fige. Et toujours beaucoup de :

DEBUG-L1: Event request timeout error: HTTPSConnectionPool(host='xxxxxxx.ddns.net', port=xxxxx): Read timed out. (read timeout=2)

p-dor commented 1 year ago

Ok merci. Alors c'est simplement dû au fait que cette requête n'a pas de timeout (erreur classique que j'avais corrigé aussi dans LmSession d'ailleurs), mais il n'est pas normal tout de même qu'aucune réponse ne revienne dans certains cas. En fait ce qui se passe quand vous cliquez sur "Assigner type..." c'est d'abord de provoquer le chargement de toutes les icônes restantes, qui n'ont pas été préalablement chargées via les types dans la liste des appareils. Et cela se fait exactement de la même manière, la méthode getDeviceIcon() est appelé en séquence pour chaque icône via la méthode loadDeviceIcons() juste après.

Si on met un timeout de 5 secondes, ce qui risque de se passer c'est d'avoir des erreurs de timeout mais au moins le programme ne freezera pas. L'effet sera aussi une icône définitivement vide pour le type demandé...

Remplacez juste cette ligne : aIconData = requests.get(LmConf.LiveboxURL + ICON_URL + iDevice['Icon'], timeout = 5, verify = LmConf.LiveboxURL.startswith('http://'))

matrixbx commented 1 year ago

Ok, ça a été bien long, mais j'ai bien obtenu une liste d'icônes. Serait-il possible/envisageable de les conserver en cache après les avoir récupérées ? Tant que la version du firmware ne change pas, il me semble inutile de la rafraîchir.

p-dor commented 1 year ago

Oui ce serait assez simple en fait. Mais je pense que je vais attendre de traiter cet autre ticket pour faire ça en même temps : https://github.com/p-dor/LiveboxMonitor/issues/26

Sinon je viens de pousser sur le repo le fix discuté ici. Merci pour avoir signalé le problème et aidé à sa résolution.

p-dor commented 1 year ago

Version 1.1.1 publiée contenant ce fix.

p-dor commented 10 months ago

Hello @matrixbx, le programme supporte maintenant le stockage des icônes dans un cache local, comme indiqué par le ticket https://github.com/p-dor/LiveboxMonitor/issues/26