Bonjour.
Suite à différentes discussions relatives à la récupération de différentes données sur la LiveBox, je me suis attelé à écrire quelque chose de ressemblant à Liveboxinfo de shdf.
Ca commence à prendre forme, j'espère poster le code demain, mais vous trouverez déjà un premier résultat en troisième partie de ce message.
Pour les liens, voir un peu plus bas.
[Edit 23/03/2017]
Au niveau utilisation je n'ai pas donné beaucoup d'informations, car ça me semble assez naturel (mais ce n'est que ma perception ).
Par contre, si vous devez poster un résultat sur le forum, SVP, utilisez l'onglet 'postage FONO', toutes les données utiles y sont disponibles, et "nettoyées" des informations confidentielles ...
[/Edit 23/03/2017]
Liens vers les binaires (les binaires sont en 32 bits pour que ça fonctionne sur les machines 32 bits et 64 bits) :
Version courante : 0.19
- tkPyDLB pour Windows
- tkPyDLB pour Linux
Lien vers le fichier source (compatible Python 2.7 et Python 3) :
Version 0.19d.
Historique :
[Edit 27/02/2017]
Première version graphique (tkPyDLB au lieu de PyDLB).
Ajout des liens de téléchargement pour les binaires
[/Edit 27/02/2017]
[Edit 16/03/2017]
Mise à disposition du fichier source, compatible Python 3 et Python 2.7.
Pour compiler (produire le binaire), j'utilise "pyinstaller" avec la syntaxe suivante :
pyinstaller --clean --windowed --onefile --hidden-import queue --noupx tkPyDLB_v0-14s.py -n tkPyDLB_v0-14
Mais le fichier source peut être utilisé directement avec Python.
[/Edit 16/03/2017]
[Edit 04/04/2017]
Réorganisation du message, information de version plus claire (demande de Markco).
[/Edit du 04/04/2017]
[Edit du 02/05/2017]
Mise à disposition de la version 0.17, voir message de publication
[/Edit du 02/05/2017]
[Edit du 30/07/2017]
Modification du titre ...
Avant : "PyDLB : Détails des infos LiveBox en Python"
Après : "tkPyDLB : Détails des infos LiveBox en Python"
[/Edit du 30/07/2017]
[Edit du 18/03/2017]
Mise à disposition de la version 0.18, correction d'un bug sur le DEBUG (merci Crabman )
[/Edit du 18/03/2017]
[Edit du 25/03/2017]
Mise à disposition de la version 0.18d, amélioration du DEBUG (merci Marckco )
[/Edit du 25/03/2017]
C:\Python34>python.exe PyDLB.py
Password:
Device Info
Manufacturer : Sagemcom
ManufacturerOUI : B8266C
ModelName : SagemcomFast3965_LB2.8
ProductClass : Livebox 3
SerialNumber : AN152XXXXXXXXXX
HardwareVersion : SG_LB3_1.2.1
SoftwareVersion : SG30_sip-fr-5.21.1.1
HardwareVersion 2 :
SoftwareVersion 2 : g5-r-sip-fr
EnabledOptions :
SpecVersion : 1.1
ProvisioningCode : AUTH.XXXX.XXXX.PMAP.XXXX.XXXX.VSIP.XXXX.XXXX.WCOM.XXXX.XXXX
UpTime : 452381
Démarrée depuis le : 19/01/2017 18:55:24
Démarrée depuis : 5 j. 5 h. 39 mn. 41 s.
Country : fr
NumberOfReboots : 1
WAN Status
LinkType : ethernet
LinkState : up
MACAddress : B8:26:XX:XX:XX:XX
Protocol : dhcp
ConnectionState : Bound
LastConnectionError : None
IPAddress : 86.253.XX.XX
RemoteGateway : 86.253.XX.XX
DNSServers : 81.253.149.1,80.10.246.130
IPv6Address :
Vlan ID : 832
MTU : None
Téléphonie IP
Name : SIP-Trunk
Enable : Enabled
Protocol : DHCP
Encapsulation :
InterfaceId : 832
Interface : data
PhysInterface : Ethernet
Etat SIP : Up
Activation SIP : Enabled
Numéro d'annuaire SIP : +33296XXXXXX
Name : H323-Trunk
Enable : Disabled
Protocol : DHCP
Encapsulation :
InterfaceId : 851
Interface : voip
PhysInterface : Ethernet
Etat H323 : Disabled
Activation H323 : Disabled
Numéro d'annuaire H323 :
Etat Wi-Fi
Fréquence : 2.4GHz
SupportedBands : 2.4GHz,5GHz,AUTO
OperatingStandards : bgn
Channel : 1
SSID : Livebox-XXXX
SSID visible : True
BSSID : B8:26:XX:XX:XX:XX
WEPKey : XXXXXXXXXXXXXXXXXXXXXXXXXX
PreSharedKey :
KeyPassPhrase : XXXXXXXXXXXXXXXXXXXXXXXXXX
ModeEnabled : WPA-WPA2-Personal
MACFiltering : Off
SelfPIN : XXXXXXXX
Fréquence : 5GHz
SupportedBands : 2.4GHz,5GHz,AUTO
OperatingStandards : an
Channel : 100
SSID : Livebox-XXXX
SSID visible : True
BSSID : B8:26:XX:XX:XX:XX
WEPKey : XXXXXXXXXXXXXXXXXXXXXXXXXX
PreSharedKey :
KeyPassPhrase : XXXXXXXXXXXXXXXXXXXXXXXXXX
ModeEnabled : WPA-WPA2-Personal
MACFiltering : Off
SelfPIN : XXXXXXXX
Wi-Fi partagé
SSID : orange
Status : Activated
Enable : True
Statistiques de la ligne
/!\ Résultats non significatifs avec un WAN EThernet
ReceiveBlocks : 0
TransmitBlocks : 0
CellDelin : 0
LinkRetrain : 0
InitErrors : 0
InitTimeouts : -1
LossOfFraming : 0
ErroredSecs : 0
SeverelyErroredSecs : 0
FECErrors : 0
ATUCFECErrors : 0
HECErrors : 0
ATUCHECErrors : 0
CRCErrors : 0
ATUCCRCErrors : 0
Etat des services TV
IPTVStatus : Available
Tous les "XX" ont été faits manuellement, il me reste à prévoir la copie filtrée avant publication.
Dernière modification par JoeKer (30-07-2017 19:46:31)
Hors ligne
Bravo !
Hier soir j'ai installé python sur mon PC (win 10) et fait quelques petits exemples en suivant des tutoriaux pour faire des interfaces graphiques, tkinter semble vraiment facile à utiliser, je pense que tu devrais arriver à nous pondre une version graphique portable sur linux/win
Hors ligne
Bonjour,
Tous mes encouragements à JoeKer
shdf a écrit:
tu devrais arriver à nous pondre une version graphique portable sur linux/win big_smile
et Mac également :
Python est censé fonctionner aussi bien sous Windows que sous Linux ou Mac OS, et on ne devrait avoir à effectuer aucun changement dans le code pour le passer d'un système à l'autre.
Hors ligne
idem, mes encouragements à JoeKer
si besoin d'un testeur et/ou coup de main, suis à la retraite, m'ennuie un peu
Hors ligne
Bonsoir,
Allez Joeker on attend !!!
Voici ce que je suis arrivé à faire en Python:
@Gipeca, tu peux tester sous Mac ?
Le parser json simplifie la vie, plus besoin de regex !!!
#!/usr/bin/env python # -*- coding: utf-8 -*- import json import requests import requests.utils from tkinter import * # indiquer son mot de passe + IP LiveBox ici password = 'xxxxxxxxx' ip = '192.168.1.1' ############################################ auth = '{"service":"sah.Device.Information","method":"createContext","parameters":{"applicationName":"so_sdkut","username":"admin","password":"' + password + '"}}' sah_headers = {'Content-Type':'application/x-sah-ws-1-call+json', 'Authorization':'X-Sah-Login'} session = requests.Session() r = session.post('http://' + ip + '/ws', data=auth, headers=sah_headers) #Récupération des données de connexion contextID = r.json()['data']['contextID'] Cookie = str(requests.utils.dict_from_cookiejar(session.cookies)) #Récupération des données WANStatus params = '{"service":"NMC","method":"getWANStatus","parameters":{}}' sah_headers = {'X-Context':contextID, 'Content-Type':'application/x-sah-ws-4-call+json', 'cookie':Cookie + '; sah/contextId=' + contextID} r = session.post('http://' + ip + '/ws', data=params, headers=sah_headers) LinkType = r.json()['data']['LinkType'] LinkState = r.json()['data']['LinkState'] MACAddress = r.json()['data']['MACAddress'] Protocol = r.json()['data']['Protocol'] ConnectionState = r.json()['data']['ConnectionState'] LastConnectionError = r.json()['data']['LastConnectionError'] IPAddress = r.json()['data']['IPAddress'] RemoteGateway = r.json()['data']['RemoteGateway'] DNSServers = r.json()['data']['DNSServers'] IPv6Address = r.json()['data']['IPv6Address'] ################################################ #CREATION DE LA GUI # ################################################ # On crée une fenêtre, racine de notre interface fenetre = Tk() fenetre.wm_title("LiveBoxInfo PY 0.1") cadre = Frame(fenetre, width=280, height=20, borderwidth=0) cadre.pack(fill=BOTH) #creation des infos label1 = Label(fenetre, text=("LinkType : " + LinkType)) label2 = Label(fenetre, text=("LinkState : " + LinkState)) label3 = Label(fenetre, text=("MACAddress : " + MACAddress)) label4 = Label(fenetre, text=("Protocol : " + Protocol)) label5 = Label(fenetre, text=("ConnectionState : " + ConnectionState)) label6 = Label(fenetre, text=("LastConnectionError : " + LastConnectionError)) label7 = Label(fenetre, text=("IPAddress : " + IPAddress)) label8 = Label(fenetre, text=("RemoteGateway : " + RemoteGateway)) label9 = Label(fenetre, text=("DNSServers : " + DNSServers)) label10 = Label(fenetre, text=("IPv6Address : " + IPv6Address)) # On affiche les labels dans la fenêtre label1.pack(side=TOP, anchor=W, fill=Y, expand=YES) label2.pack(side=TOP, anchor=W, fill=Y, expand=YES) label3.pack(side=TOP, anchor=W, fill=Y, expand=YES) label4.pack(side=TOP, anchor=W, fill=Y, expand=YES) label5.pack(side=TOP, anchor=W, fill=Y, expand=YES) label6.pack(side=TOP, anchor=W, fill=Y, expand=YES) label7.pack(side=TOP, anchor=W, fill=Y, expand=YES) label8.pack(side=TOP, anchor=W, fill=Y, expand=YES) label9.pack(side=TOP, anchor=W, fill=Y, expand=YES) label10.pack(side=TOP, anchor=W, fill=Y, expand=YES) # On démarre la boucle Tkinter qui s'interompt quand on ferme la fenêtre fenetre.mainloop()
En espérant que ca aide Joeker à faire une GUI.
Bon je ne pollue pas plus le topic
Dernière modification par shdf (25-01-2017 22:42:22)
Hors ligne
Le problème c'est que je suis en LB2 et pas en LB4...
Bien que ne connaissant pas python, je vois que les instructions sont basées sur la nouvelle méthode d'authentification, qui n'est dispo que pour les LB3 et LB4.
Pour tester il faudrait modifier cela.
Comment tester ?
Enregistrer le script dans un fichier texte avec droit d'exécution et avec suffixe .py suffit-il ?
Que doit-il y avoir d'installé sur la machine ?
- python est (en principe) en natif sous OSX, mais est ce la bonne version ?
- tkinter, c'est un module supplémentaire à installer ?
Hors ligne
Bonsoir.
Merci de vos soutiens, les amis (amies) !
Dommage que tu aies attendu que je m'y mette pour le faire, shdf
Depuis le temps que je t'ai dit de trouver un vrai parser JSON
Ce que tu ne dis pas, c'est avec quelle version de Python tu fais tourner ça (à priori, du Python 3 ...).
Tkinter est en principe installé de base avec n'importe quelle version de Python, mais je n'ai pas testé pour le moment ...
J'envisageais plutôt une piste wxWidgets, mais au vu de la simplicité avec Tkinter, ça fait réfléchir ...
[Edit]
J'ai testé ton code, shdf, et c'est édifiant ...
Ca simplifie énormément le boulot "graphique" !
A tel point que je ne serais pas étonné que tu te rabattes sur Python + Tkinter au lieu de AutoIT
[/Edit]
Voici donc ce que j'ai pu concocter, en mode texte uniquement :
#!/usr/bin/env python3 # -*- coding: iso8859-9 -*- # PyDLB.py # Version 0.5 # Portage par JoeKer pour FONO sur la base de : # - rene-d/sysbus (https://github.com/rene-d/sysbus) # - fccagou/pylivebox (https://github.com/fccagou/pylivebox/blob/master/livebox/livebox.py) # Merci de votre indulgence, je découvre Python ... import urllib.request, urllib.parse, urllib.error import json import requests import time import sys import getpass import re VERSION_LIVEBOX = 'lb3' USER_LIVEBOX = 'admin' URL_LIVEBOX = 'http://livebox' password = 'admin' quote='quote' class Livebox: def __init__(self,url_prefix=URL_LIVEBOX): self._url_prefix = url_prefix def login(self): PASSWORD_LIVEBOX = password if PASSWORD_LIVEBOX == 'admin': PASSWORD_LIVEBOX=getpass.getpass() session = requests.Session() url_login = "%s/authenticate?username=admin&password=%s" % (self._url_prefix,password) values = {'username' : 'admin', 'password' : password } if VERSION_LIVEBOX != 'lb3' and VERSION_LIVEBOX != 'lb4': # On est probablement sur l'ancienne méthode d'authentification (avant décembre 2016) auth = { 'username':USER_LIVEBOX, 'password':PASSWORD_LIVEBOX } r = session.post(URL_LIVEBOX + '/authenticate', params=auth) else: # Cette méthode fonctionne avec les firmwares récents (fin décembre 2016) de la LB3 et de la LB4 auth = '{"service":"sah.Device.Information","method":"createContext","parameters":{"applicationName":"so_sdkut","username":"%s","password":"%s"}}' % (USER_LIVEBOX, PASSWORD_LIVEBOX) sah_headers = { 'Content-Type':'application/x-sah-ws-1-call+json', 'Authorization':'X-Sah-Login' } r = session.post(URL_LIVEBOX + '/ws', data=auth, headers=sah_headers) if not 'contextID' in r.json()['data']: print("auth error", str(r.text)) exit(1) self._lb_id=r.headers['Set-Cookie'] self._sessid=(r.headers['Set-Cookie'].split('=',1)[1]).rsplit(';',1)[0] self._context_id=r.json()['data']['contextID'] def _sysbus(self,question): return self._request("%s/sysbus/%s" % (self._url_prefix,question) , '{"parameters":{}}' ) def _sysbus2(self,question): return self._request2("%s/sysbus/%s" % (self._url_prefix,question)) def _ws(self, params): return self._request("%s/ws" % (self._url_prefix) , params , 'application/x-sah-ws-4-call+json') def _request(self,url, params, content_type='application/json'): sah_headers = { 'Content-Type':content_type, 'Cookie': self._lb_id, 'X-Context': self._context_id, 'X-Sah-Request-Type':'idle', 'X-Requested-With': 'XMLHttpRequest' } r = requests.post(url, data=params, headers=sah_headers) resp = r.json() return resp def _request2(self,url, content_type='application/json'): sah_headers = { 'Content-Type':content_type, 'Cookie': self._lb_id, 'X-Context': self._context_id, 'X-Sah-Request-Type':'idle', 'X-Requested-With': 'XMLHttpRequest' } r = requests.get(url, headers=sah_headers) resp = r.json() return resp def logout(self): sah_headers = { 'Content-Type':"application/x-www-form-urlencoded", 'Cookie': self._lb_id, 'X-Context': self._context_id, 'X-Sah-Request-Type':'idle', 'X-Requested-With': 'XMLHttpRequest' } r = requests.get("%s/logout" % (self._url_prefix), headers=sah_headers) return "" def voip_config(self): j = self._ws('{"service":"NMC","method":"getVoIPConfig","parameters":{}}') return j['status'] def list_trunks(self): '''Information téléphonie IP''' j = self._sysbus('VoiceService/VoiceApplication:listTrunks') return j['result'] def ip_tv_status(self): '''Etat IP TV''' return self._sysbus('NMC/OrangeTV:getIPTVStatus') def device_info(self): ''' Infos device ''' j = self._ws('{"service":"DeviceInfo","method":"get","parameters":{}}') return j['status'] def DSLStats(self): '''Information lien dsl''' j = self._ws('{"service":"NeMo.Intf.dsl0","method":"getDSLStats","parameters":{}}') return j['status'] def wifi_com_status(self): '''Information Wifi public Orange)''' return self._sysbus('Wificom/OpenMode:getStatus') def wifi_mibs(self): '''Information Wifi''' j = self._ws('{"service":"NeMo.Intf.lan","method":"getMIBs","parameters":{"mibs":"wlanvap || wlanradio"}}') return j['status'] def wan_status(self): '''Etat de la connexion WAN''' j = self._ws('{"service":"NMC","method":"getWANStatus","parameters":{}}') return j['data'] def orange_services(self): j = self._ws(str('{"service":"OrangeServices","method":"getSubscriptionStatus","parameters":{"refresh":true}}')) return j def mtu(self): j = self._ws('{"service":"NeMo.Intf.data","method":"getFirstParameter","parameters":{"name":"MTU"}}') return j['status'] def vlan_id(self): j = self._ws('{"service":"NeMo.Intf.data","method":"getFirstParameter","parameters":{"name":"VLANID"}}') return j['status'] def ws_channel_id(self): j = self._ws('{"events":[{"handler":"sah.hgw.models"}]}') return j['channelid'] def ws_get_devices(self, channel_id): j = self._ws('{"events":[{"handler":"sah.hgw.models"}],"channelid":%s}' % channel_id) return j if __name__ == '__main__': lb = Livebox() lb.login() # Calculer le temps en secondes depuis EPOCH reftime = int(time.mktime(time.localtime())) DevInfo = lb.device_info() uptime = DevInfo['UpTime'] starttime= reftime - uptime StartTime = time.ctime(starttime) Date_Demarrage = time.strftime("%d/%m/%Y %H:%M:%S", time.localtime(starttime)) jours = str(int(uptime / 86400)) heures = str(int(uptime % 86400 / 3600)) minutes = str(int(uptime % 86400 % 3600 / 60)) secondes = str(int(uptime % 86400 % 3600 % 60)) Start = jours + " j. " + heures + " h. " + minutes + " mn. " + secondes + " s." print("[" + quote + "]\n") print("\nRésultats extraits le " + time.strftime("%d/%m/%Y à %H:%M:%S", time.localtime()) + "\n\n") # # Début de DeviceInfo DeviceInfo = " Device Info" + "\n" DeviceInfo += " Manufacturer : " + DevInfo['Manufacturer'] + "\n" DeviceInfo += " ManufacturerOUI : " + DevInfo['ManufacturerOUI'] + "\n" DeviceInfo += " ModelName : " + DevInfo['ModelName'] + "\n" DeviceInfo += " ProductClass : " + DevInfo['ProductClass'] + "\n" DeviceInfo += " SerialNumber : " + re.sub('[0-9]{8}$','XXXXXXXX',DevInfo['SerialNumber'],0,0) + "\n" DeviceInfo += " HardwareVersion : " + DevInfo['HardwareVersion'] + "\n" DeviceInfo += " SoftwareVersion : " + DevInfo['SoftwareVersion'] + "\n" DeviceInfo += " HardwareVersion 2 : " + DevInfo['AdditionalHardwareVersion'] + "\n" DeviceInfo += " SoftwareVersion 2 : " + DevInfo['AdditionalSoftwareVersion'] + "\n" DeviceInfo += " EnabledOptions : " + DevInfo['EnabledOptions'] + "\n" DeviceInfo += " SpecVersion : " + DevInfo['SpecVersion'] + "\n" DeviceInfo += " ProvisioningCode : " + re.sub('[0-9]{4}','XXXX',DevInfo['ProvisioningCode'],0,0) + "\n" DeviceInfo += " UpTime : " + str(DevInfo['UpTime']) + "\n" DeviceInfo += " Démarrée depuis le : " + Date_Demarrage + "\n" DeviceInfo += " Démarrée depuis : " + Start + "\n" DeviceInfo += " Country : " + DevInfo['Country'] + "\n" DeviceInfo += " NumberOfReboots : " + str(DevInfo['NumberOfReboots']) + "\n" print(DeviceInfo) # # Fin de DeviceInfo print("[---]\n") # # Début de WanStatus mtu = str(lb.mtu()) vlanid = str(lb.vlan_id()) wanstatus = lb.wan_status() # On aura besoin plus loin de tester le type de lien LinkType = wanstatus['LinkType'] WanStatus = " WAN Status" + "\n" WanStatus += " LinkType : " + wanstatus['LinkType'] + "\n" WanStatus += " LinkState : " + wanstatus['LinkState'] + "\n" WanStatus += " MACAddress : " + re.sub('[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$','XX:XX:XX:XX',wanstatus['MACAddress'],0,0) + "\n" WanStatus += " Protocol : " + wanstatus['Protocol'] + "\n" WanStatus += " ConnectionState : " + wanstatus['ConnectionState'] + "\n" WanStatus += " LastConnectionError : " + wanstatus['LastConnectionError'] + "\n" WanStatus += " IPAddress : " + re.sub('\.[0-9]{1,3}\.[0-9]{1,3}$','.XX.XX',wanstatus['IPAddress'],0,0) + "\n" WanStatus += " RemoteGateway : " + re.sub('\.[0-9]{1,3}\.[0-9]{1,3}$','.XX.XX',wanstatus['RemoteGateway'],0,0) + "\n" WanStatus += " DNSServers : " + wanstatus['DNSServers'] + "\n" WanStatus += " IPv6Address : " + wanstatus['IPv6Address'] + "\n" WanStatus += " Vlan ID : " + vlanid + "\n" WanStatus += " MTU : " + mtu + "\n" print(WanStatus) # # Fin de WanStatus # # Début de VoipConfig print("[---]\n") voip_config = lb.voip_config() trunks_list = lb.list_trunks() trunks_result = trunks_list['status'] szTrunks = len(trunks_result) SIP_Trunk = {str(trunks_result[0])} VOIPConfig = " Téléphonie IP" + "\n" VOIPConfig += " Name : " + voip_config[0]['Name'] + "\n" VOIPConfig += " Enable : " + voip_config[0]['Enable'] + "\n" VOIPConfig += " Protocol : " + voip_config[0]['Protocol'] + "\n" VOIPConfig += " Encapsulation : " + voip_config[0]['Encapsulation'] + "\n" VOIPConfig += " InterfaceId : " + voip_config[0]['InterfaceId'] + "\n" VOIPConfig += " Interface : " + voip_config[0]['Interface'] + "\n" VOIPConfig += " PhysInterface : " + voip_config[0]['PhysInterface'] + "\n" VOIPConfig += " Etat SIP : " + str(trunks_result[0]['trunk_lines'][0]['status']) + "\n" VOIPConfig += " Activation SIP : " + str(trunks_result[0]['trunk_lines'][0]['enable']) + "\n" VOIPConfig += " Numéro d'annuaire SIP : " + re.sub('[0-9]{8}$','XXXXXXXX',str(trunks_result[0]['trunk_lines'][0]['directoryNumber']),0,0) + "\n" if szTrunks > 1: H323_trunk = {str(trunks_result[1])} VOIPConfig += "\n" VOIPConfig += " Name : " + voip_config[1]['Name'] + "\n" VOIPConfig += " Enable : " + voip_config[1]['Enable'] + "\n" VOIPConfig += " Protocol : " + voip_config[1]['Protocol'] + "\n" VOIPConfig += " Encapsulation : " + voip_config[1]['Encapsulation'] + "\n" VOIPConfig += " InterfaceId : " + voip_config[1]['InterfaceId'] + "\n" VOIPConfig += " Interface : " + voip_config[1]['Interface'] + "\n" VOIPConfig += " PhysInterface : " + voip_config[1]['PhysInterface'] + "\n" VOIPConfig += " Etat H323 : " + str(trunks_result[1]['trunk_lines'][0]['status']) + "\n" VOIPConfig += " Activation H323 : " + str(trunks_result[1]['trunk_lines'][0]['enable']) + "\n" VOIPConfig += " Numéro d'annuaire H323 : " + re.sub('[0-9]{8}$','XXXXXXXX',str(trunks_result[1]['trunk_lines'][0]['directoryNumber']),0,0) + "\n" print(VOIPConfig) # # Fin de VoipConfig # # Début de Wi-Fi print("[---]\n") WifiData = lb.wifi_mibs() szWifData = len(WifiData['wlanradio']) WifiConf = " Etat Wi-Fi" + "\n" WifiConf += " Fréquence : " + WifiData['wlanradio']['wifi0_ath']['OperatingFrequencyBand'] + "\n" WifiConf += " SupportedBands : " + WifiData['wlanradio']['wifi0_ath']['SupportedFrequencyBands'] + "\n" WifiConf += " OperatingStandards : " + WifiData['wlanradio']['wifi0_ath']['OperatingStandards'] + "\n" WifiConf += " Channel : " + str(WifiData['wlanradio']['wifi0_ath']['Channel']) + "\n" WifiConf += " SSID : " + re.sub('.{4}$','XXXX',str(WifiData['wlanvap']['wl0']['SSID']),0,0) + "\n" WifiConf += " SSID visible : " + str(WifiData['wlanvap']['wl0']['SSIDAdvertisementEnabled']) + "\n" WifiConf += " BSSID : " + re.sub('[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$','XX:XX:XX:XX',WifiData['wlanvap']['wl0']['BSSID'],0,0) + "\n" WifiConf += " WEPKey : " + re.sub('.','X',WifiData['wlanvap']['wl0']['Security']['WEPKey'],0,0) + "\n" WifiConf += " PreSharedKey : " + re.sub('.','X',WifiData['wlanvap']['wl0']['Security']['PreSharedKey'],0,0) + "\n" WifiConf += " KeyPassPhrase : " + re.sub('.','X',WifiData['wlanvap']['wl0']['Security']['KeyPassPhrase'],0,0) + "\n" WifiConf += " ModeEnabled : " + WifiData['wlanvap']['wl0']['Security']['ModeEnabled'] + "\n" WifiConf += " MACFiltering : " + WifiData['wlanvap']['wl0']['MACFiltering']['Mode'] + "\n" WifiConf += " SelfPIN : " + WifiData['wlanvap']['wl0']['WPS']['SelfPIN'] + "\n" if szWifData > 1: WifiConf += "\n" WifiConf += " Fréquence : " + WifiData['wlanradio']['wifi1_ath']['OperatingFrequencyBand'] + "\n" WifiConf += " SupportedBands : " + WifiData['wlanradio']['wifi1_ath']['SupportedFrequencyBands'] + "\n" WifiConf += " OperatingStandards : " + WifiData['wlanradio']['wifi1_ath']['OperatingStandards'] + "\n" WifiConf += " Channel : " + str(WifiData['wlanradio']['wifi1_ath']['Channel']) + "\n" WifiConf += " SSID : " + re.sub('.{4}$','XXXX',str(WifiData['wlanvap']['wl1']['SSID']),0,0) + "\n" WifiConf += " SSID visible : " + str(WifiData['wlanvap']['wl1']['SSIDAdvertisementEnabled']) + "\n" WifiConf += " BSSID : " + re.sub('[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$','XX:XX:XX:XX',WifiData['wlanvap']['wl1']['BSSID'],0,0) + "\n" WifiConf += " WEPKey : " + re.sub('.','X',WifiData['wlanvap']['wl1']['Security']['WEPKey'],0,0) + "\n" WifiConf += " PreSharedKey : " + re.sub('.','X',WifiData['wlanvap']['wl1']['Security']['PreSharedKey'],0,0) + "\n" WifiConf += " KeyPassPhrase : " + re.sub('.','X',WifiData['wlanvap']['wl1']['Security']['KeyPassPhrase'],0,0) + "\n" WifiConf += " ModeEnabled : " + WifiData['wlanvap']['wl1']['Security']['ModeEnabled'] + "\n" WifiConf += " MACFiltering : " + WifiData['wlanvap']['wl1']['MACFiltering']['Mode'] + "\n" WifiConf += " SelfPIN : " + WifiData['wlanvap']['wl1']['WPS']['SelfPIN'] + "\n" print (WifiConf) WifiCom = lb.wifi_com_status() WifiComm = " Wi-Fi partagé" + "\n" WifiComm += " SSID : " + WifiCom['result']['data']['SSID'] + "\n" WifiComm += " Status : " + WifiCom['result']['data']['Status'] + "\n" WifiComm += " Enable : " + str(WifiCom['result']['data']['Enable']) + "\n" print (WifiComm) # # Fin de Wi-Fi # # Début de getDSLStats print("[---]\n") dslstats = lb.DSLStats() # initTimeouts = dslstats['InitTimeouts'] # if initTimeouts == 4294967295: # initTimeouts = -1 DSLStats = " Statistiques de la ligne" + "\n" if LinkType == "ethernet": DSLStats += " /!\ Résultats non significatifs avec un WAN Ethernet" + "\n" DSLStats += " ReceiveBlocks : " + str(dslstats['ReceiveBlocks']) + "\n" DSLStats += " TransmitBlocks : " + str(dslstats['TransmitBlocks']) + "\n" DSLStats += " CellDelin : " + str(dslstats['CellDelin']) + "\n" DSLStats += " LinkRetrain : " + str(dslstats['LinkRetrain']) + "\n" DSLStats += " InitErrors : " + str(dslstats['InitErrors']) + "\n" DSLStats += " InitTimeouts : " + str((dslstats['InitTimeouts'] ^0x80000000) - 0x80000000) + "\n" DSLStats += " LossOfFraming : " + str(dslstats['LossOfFraming']) + "\n" DSLStats += " ErroredSecs : " + str(dslstats['ErroredSecs']) + "\n" DSLStats += " SeverelyErroredSecs : " + str(dslstats['SeverelyErroredSecs']) + "\n" DSLStats += " FECErrors : " + str(dslstats['FECErrors']) + "\n" DSLStats += " ATUCFECErrors : " + str(dslstats['ATUCFECErrors']) + "\n" DSLStats += " HECErrors : " + str(dslstats['HECErrors']) + "\n" DSLStats += " ATUCHECErrors : " + str(dslstats['ATUCHECErrors']) + "\n" DSLStats += " CRCErrors : " + str(dslstats['CRCErrors']) + "\n" DSLStats += " ATUCCRCErrors : " + str(dslstats['ATUCCRCErrors']) + "\n" print(DSLStats) # # Fin de getDSLStats # # Début de IPTVStatus iptvstatus = lb.ip_tv_status()['result'] IPTV_Status = " Etat des services TV" + "\n" IPTV_Status += " IPTVStatus : " + iptvstatus['data']['IPTVStatus'] + "\n" print(IPTV_Status) # # Fin de IPTVStatus print("[/" + quote + "]\n") # # Début de OrangeServices # Ne fonctionne pas sur LB3 et antérieures en janvier 2017 # print((lb.orange_services())) # # Fin de OrangeServices # # Début de ConnectedDevices # Pas implémenté # print((lb.ws_get_devices(lb.ws_channel_id()))) # # Fin de ConnectedDevices ## Déconnexion print((lb.logout()))
C'est écrit pour Python 3 (3.4 chez moi).
Je l'ai mis au point sous Windows (y'a pas Notepad++ sous Linux ), mais avant la mise en forme pour le postage sur forum, ça tournait sous Linux.
[Edit]
Testé sous Linux Mint avec Python 3.
Il peut y avoir un problème avec les caractères accentués, dans ce cas, à la ligne 2, changer :
# -*- coding: iso8859-9 -*-
par
# -*- coding: utf-8 -*-
[/Edit]
Ca devrait fonctionner avec les LB2, LB3 et LB4, mais je n'ai testé qu'avec ma LB3 en mode fibre ...
Le résultat est préformaté pour poster sur FONO, avec filtrage des infos confidentielles.
@Markco, j'espère que ça ira plus vite que sous Wine
Edit 26/01/2017 22:16 : Postage d'une version 0.2
- Correction du saut de ligne parasite en ligne 340
- Correction des listes 'à indice' (Wi-Fi, voipConfig) (non vérifiable chez moi en réel, mais marche avec des données "simulées").
Edit 29/01/2017 18:43 : Version 0.3
- #!/usr/bin/env python3 (n'est nécessaire que si on tape "./PyDLB.py" dans la console, mais c'est plus cohérent smile)
- "if szTrunks > 1:" et "if szWifData > 1:" (belle bourde ...)
- Créé une variable "quote" contenant 'quote' (compatibilité FONO)
Edit 31/01/2017 20:05 : Version 0.4
- Correction sur balise ouvrante quote
- Correction sur InitTimeouts pour avoir un entier signé sur 32 bits quel que soit le processeur
Edit 01/02/2017 19:10 : Version 0.5
- Modifications proposées par crabman
Dernière modification par JoeKer (01-02-2017 19:10:02)
Hors ligne
Salut.
il y a un saut de ligne en trop ligne 340
print("[/quote] \n")
(y'a pas Notepad++ sous Linux)
ça peut être: https://github.com/notepadqq/notepadqq
et bravo
Hors ligne
Autoit utilise Scite qui est gratuit et qui a une coloration syntaxique pour quasiment tous les langages:
http://www.scintilla.org/SciTEDownload.html
il y a une version pour linux, et pour debian/ubuntu il y a un package dispo : apt-get install scite
Dernière modification par shdf (26-01-2017 15:21:52)
Hors ligne
@JoeKer
j'ai un blocage à la ligne 238:
Exception "IndexError" list index out of range File: /home/christian/Bureau/lb.py, Line: 238
dans trunks_list et donc dans trunks_result je n'ai qu'une seule instance "0" (pas de "1") ? ? ?
la LB4 ne gérerait plus le H323 ? ? ?
d'ou plantage
edit:
le H323 existe toujours, mais chez moi, je suis en SIP et pas en H323,
donc c'est peut-être normal que le trunks_result[1] n'existe pas ?
Dernière modification par kikito (26-01-2017 18:52:45)
Hors ligne
Bonsoir.
@kikito : Désolé pour les erreurs
C'est corrigé (enfin, j'espère ...), voir le message qui contient le code.
Le H323 doit être progressivement abandonné. Je ne sais à quel stade ça en est, mais c'est très probablement l'explication.
@shdf : Oui, je connais Scite sous Linux, mais il est loin derrière Notepad++ (même si c'est un très bon éditeur)
Faudra que je jette un oeil à notepadqq
Hors ligne
Bonsoir,
Pour ce qui est du Mac, ça ne fonctionne pas...
--> No module named request
S'il faut importer des modules complémentaires, via des commandes du terminal, je jette l'éponge. Non pas que je ne sache pas faire, mais c'est un problème de concept.
La philosophie qui nous a conduit joseph25b et moi à faire les deux programmes pour Mac, était d'aboutir à des applis utilisables par Mme MICHU.
Et la famille MICHU veut juste appuyer sur le bouton, et que ça fonctionne quelque soit sa LB (2, 3 ou 4) ADSL ou VDSL.
C'est ce que font nos programmes Mac, avec ce qui est nativement fourni dans OSX.
Exemple tout bête: pas besoin de rentrer dans le code ou dans un fichier .ini pour saisir l'IP et le mot de passe, c'est pris en compte par une boîte de dialogue de l'appli et le MdP n'est pas stocké, en clair quelque part...
S'il faut tripatouiller, ce n'est pas ce que je recherche comme solution.
A titre personnel, bien sûr que je bidouille sur le Mac, mais pour moi.
Pour réaliser une appli qui est destinée à d'autres utilisateurs, ça ne correspond pas à ma vision des choses: le livrable doit être immédiatement fonctionnel.
C'est sans doute plus facile pour le programmeur d'utiliser le module "request" (et sans doute d'autres, qu'il faut importer) plutôt que "curl" qui est nativement disponible, mais c'est désastreux pour l'utilisateur final puisque le résultat est une appli inutilisable par Mme MICHU qui ne sait pas ce qu'est un module, une bibliothèque, un framework...
Désolé, ce n'est pas ma vision d'une appli destinée à la famille MICHU.
Mais continuez, ça me rappelle mon passé Windowsien, ... que je ne regrette pas.
Hors ligne
Hélas, oui, il va probablement falloir mettre les mains dans le cambouis, et il se peut que des modules manquent ...
Prérequis : Python 3 (Python 3.4 pour moi, ce qui n'est pas la version la plus récente).
J'ai fait des essais en convertissant avec Python 2.7, et ça a fonctionné, mais pas du premier coup.
--> No module named request
Ce serait plutôt
--> No module named requests
requests" avec un "s" à la fin, sinon, ça craint ...
Essaye avec un "pip install requests", ça devrait être suffisant.
En principe, "pip" est installé avec tous les "Python" ...
Et dans les modules installés, je n'ai eu à installer que "requests".
A terme, je n'abandonne pas l'idée d'avoir un exécutable par OS, mais il y a du chemin à faire !
Hors ligne
Bonjour,
Non, non, il n'y a pas de "s" dans le message d'erreur.
C'est après cette ligne que ça coince:
import urllib.request, urllib.parse, urllib.error
Et "request" n'a pas de "s" dans cette ligne de code.
Voici la version de python qui est en standard sur mon Mac OSX 10.11:
Python 2.7.10 (default, Oct 23 2015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Je ne sais pas comment cela a évolué de OSX 10.6 à MacOS 10.12...
Mettre les mains dans le cambouis, pour le programmeur: oui, bien sûr.
Mais si je dois installer le module manquant, il faudra bien que Mme MICHU ait à utiliser "pip install requests"...
Et ça, ce n'est pas le but. Ce n'est pas comme cela que je conçois la chose finale...
Eternel débat de la portabilié et du langage compilé vs langage interprété...
Hors ligne
pour alimenter la conversation , je me suis amusé à installer http://eric-ide.python-projects.org/
le import urllib.request, urllib.parse, urllib.error passe très bien en utilisant eric, mais bloque en lançant le soft directement ?
faut peut-être chercher par la ?
P.S. pour info, je suis comme toi @JoeKer, je connaissais pas python la semaine dernière . . .
P.S.2 @JoeKer tu as encore oublié le saut de ligne en trop
Dernière modification par kikito (27-01-2017 10:34:25)
Hors ligne
@gipeca
le request/requests je crois que c'est lié a la version de pyton utilisé (2 ou 3), j'ai vu le meme genre de problème avec Tkinter et tkinter (sans majuscule).
J'ai désinstallé python, par rage de ne pas avoir pu compiler un exécutable PC apres plusieurs heures de tentatives.
Hors ligne
Bonsoir.
Oui !
Python 2 : request
Python 3 : requests
J'ai bien précisé qu'il y a des adaptations à faire pour le faire tourner en Python 2, et j'ai fait le choix d'écrire en Python 3 d'une part parce que les morceaux de code dont je me suis inspiré étaient en Python 3, et d'autre part parce que Python 2 n'évolue plus beaucoup (appelé à disparaître) ...
Il existe des outils pour convertir de Python 2 en Python 3 (2to3) et l'inverse (3to2), mais ça implique du debug ...
@kikito : Non, je n'oublie pas le saut de ligne, c'est FONO qui le rajoute quand je poste le code, à cause de '['/quote']' (qui ne devrait pas être interprété puisqu'il est dans une balise "code", mais je n'y peux rien
J'ai modifié dans le code en remplaçant par "print("[/quote" +"]\n")"
Ca fonctionnera, mais c'est pas très propre
@Gipeca : Avant de pouvoir livrer un exécutable, il faudra le mettre au point, et pour ça, il vaut mieux travailler avec les sources d'abord.
Sinon, on va se rajouter du travail à faire fonctionner le compilateur
Hors ligne
Bonsoir aux charmeurs de Python
Gipeca a écrit:
Je ne sais pas comment cela a évolué de OSX 10.6 à MacOS 10.12...
Sur Macos X 10.7.5 cohabitent plusieurs versions de Python dont la dernière est la 2.7.1
Pour 10.6, je je pense que c'est aussi le cas, mais comme Gipeca l'a déjà dit, notre philosophie est de fournir un utilitaire "clé en main" pour l'utilisateur néophyte, ou pas.
Après il est vrai qu'on aimerait avoir sur Mac des possibilités de graphes comme ceux que fait le programme écrit par Flagwatch avec Cacti, mais là encore ce qui nous arrête c'est que ça demande pour l'utilisateur final d'aller faire quelques installations de modules et passer des lignes de commande ésotériques.
Toutefois avec Python 2.7.1 installé d'office avec OS X, il y a peut-être une piste à suivre, si on arrive à interfacer ça de façon transparente pour l'utilisateur final ?
Hors ligne
il n'y a que le développeur qui a besoin de l'environnement de programmation avec la version de python adéquat, tous les modules nécessaires, etc...il suffit ensuite de compiler le projet en un exécutable. L'utilisateur final n'aura besoin que de l'exécutable et pas besoin d'installer quoi que ce soit d'autre.
Hors ligne
Bonjour,
Si tu le dis...
Mais, pour le moment, je n'ai pas envie (ni le temps) de m'investir dans python.
Je jugerais sur le résultat compilé.
A partir de là, ma position évoluera peut être...
Hors ligne
Ben c'est surtout pour joeker, s'il arrive a faire un logiciel avec une GUI, et qu'il trouve comment compiler le projet sous win/mac/linux...Bingo.
Moi, j'ai passé 4h avec avec cx_freeze à essayer de compiler le tout petit truc que j'ai fait plus haut, et le projet compilé me donnait des erreurs de modules qu'il ne trouvait pas, je n'ai pas bien compris le principe et ca m'a saoulé...
Ca marchait en interprété et pas en compilé...
Hors ligne
Bon je nage complet dans tout ça, si j'ai bien compris il faut faire un c/c de tout le code dans un fichier texte et le rendre executable et de le lancer avec le terminal, si c'est bien ça et bien ça marche pas chez moi.
Hors ligne
Bonjour.
@JoeKer
je pense avoir trouvé quelques erreurs: (pas taper, moi débutant )
lignes 250 le test est faux, il faut remplacer
if szTrunks != 0:
par
if szTrunks > 1:
idem pour la ligne 284:
if szWifData != 0:
par:
if szWifData > 1:
enfin, dans la partie Wifi:
wifi0_ath n'existe pas: ce serait wifi0_bcm
wifi1_ath n'existe pas: ce serait wifi0_quan
wl1 n'existe pas: ce serait eth6 (sans garantie ?)
un spécialiste des entrailles de la LB4 pourrait confirmer ?
Dernière modification par kikito (29-01-2017 11:57:42)
Hors ligne
@Markco @shdf
je pense que c'est mieux de mettre
#!/usr/bin/env python3
au lieu de
#!/usr/bin/env python
au début du code ?
Hors ligne