Ajout table de routage
Bonjour,
Avec la livebox en configuration pro il est possible d'ajouter des regles de routage
Serait-il possible d'avoir la fonction exposé dans l'appli ? Et est-ce possible d'ajouter une regle de routage sur une livebox sans la config pro ?
Merci
Bonjour,
Le problème c'est que je n'ai personnellement pas accès à une configuration pro. Sans cela il est impossible de deviner :
- Comment déterminer qu'il s'agit d'une configuration pro.
- Les APIs à appeler pour les règles de routage.
À moins que vous trouviez un moyen de me donner un accès à distance je ne peux rien faire. Autre possibilité : si vous pensez avoir un bon bagage technique je peux éventuellement vous guider pour que vous déterminiez ces points vous même. Ce n'est pas très compliqué mais il faut savoir manipuler la console de Chrome pour inspecter les appels de service REST entre la web app et la Livebox. Connaitre aussi le package sysbus est un sérieux plus.
Paramètres avancés
Routage IPv6 Pro
Quand désactivé : {"service":"NetMaster.LAN.default.Bridge.lan","method":"getIPv6Configuration","parameters":{"Name":"lan"}} Réponse : {"status":null,"data":{"Address":"","PrefixLength":"0","Intf":"data","SubnetOffset":0,"DHCPEnable":true,"DHCPIAPDEnable":false,"DHCPIANAEnable":false,"DNSServers":"","NTPServers":"","Enable":true}}
#TODO activé + ajout/modification/suppression de route
Réseau
Onglet Routage
{"service":"NMC.LAN","method":"getStaticRoutes","parameters":{}} Réponse : {"status":{}}
#TODO
Réseau privé Virtuel (VPN)
#TODO
Assistance et dépannage
Airbox Confort Pro
désactivé : {"service":"Domino","method":"getDominoStatus","parameters":{}} Réponse : {"status":[{"BackupFeature":false,"ActivationMessageEnable":true,"TimerMainLoss":90,"DeactivationMessageEnable":false,"TimerMainRecover":300,"Index":0,"donglePresent":"NotPresent","SubStatus":"Subscribed","ICCID":"","ICCID_Status":"","WifiCloning_Enable":true,"WifiCloning_Status":"Disabled","ActivationMode":"AUTO_FULL","CurrentAccessTechnology":"Auto","InterferenceMode":"NONE","PIN":"0000","APN":"orange-mib","APN_Username":"orange","APN_Password":"orange","Login_Password":"admin"}]}
On active : {"service":"Domino","method":"getDominoStatus","parameters":{}} réponse : {"status":[{"BackupFeature":false,"ActivationMessageEnable":true,"TimerMainLoss":90,"DeactivationMessageEnable":false,"TimerMainRecover":300,"Index":0,"donglePresent":"NotPresent","SubStatus":"Subscribed","ICCID":"","ICCID_Status":"","WifiCloning_Enable":true,"WifiCloning_Status":"Disabled","ActivationMode":"AUTO_FULL","CurrentAccessTechnology":"Auto","InterferenceMode":"NONE","PIN":"0000","APN":"orange-mib","APN_Username":"orange","APN_Password":"orange","Login_Password":"admin"}]}
{"service":"Domino","method":"enableBackupFeature","parameters":{"enable":true}} réponse : {"status":true}
{"service":"Domino","method":"enableDominoComponent","parameters":{"enable":true}} réponse : {"status":false,"data":{"enable":true},"errors":[{"error":XXXXXXXX,"description":"Mode Pro Activated, SubscriptionStatus can't be managed by webui","info":"enableDominoComponent"},{"error":XXXXXX,"description":"Function execution failed","info":"enableDominoComponent"}]}
Liens appels
http://192.168.1.1/sdkut/semantic/sah/Mhs/getUIMode.js
http://192.168.1.1/assets/mhs/settings/settings.pro.json en lieu et place de settings.lb6.json pour une LB6 non pro par exemple
http://192.168.1.1/sdkut/semantic/sah/Connection/Client/Routes/getStaticRoutes.js
http://192.168.1.1/sdkut/apis/pcb/NMC/getStaticRoutes.json
http://192.168.1.1/sdkut/semantic/sah/Connection/Client/Domino/setDominoConfiguration.js
http://192.168.1.1/sdkut/semantic/sah/Connection/Client/Domino/activateRescueService.js
http://192.168.1.1/sdkut/apis/pcb/Domino/enableBackupFeature.json
http://192.168.1.1/sdkut/semantic/sah/Connection/Client/Domino/enableDominoComponent.js
http://192.168.1.1/sdkut/apis/pcb/Domino/enableDominoComponent.json
logs:
http://192.168.1.1/sdkut/semantic/sah/Mhs/getUIMode.js define(["utils/console","engine/callStack"],function(s,t){"use strict";return{name:"getUIMode",description:"Returns the mode of the UI for the configuration",fields:{uuid:null,nbStep:0,mxStep:0,status:0,data:{}},call:function(e,i){var a;if("0"===e)this.fields.uuid=i.uuid,this.fields.status=0,this.fields.nbStep=0,this.fields.mxStep=0,this.fields.data={modes:[]},t.getCapabilities().hasDynamicConfig&&(this.fields.mxStep+=1,t.push("api","pcb.NMC.get","1",this));else switch(this.fields.nbStep+=1,e){case"1":0===i.status||!0===i.status?(i.data.hasOwnProperty("OfferType")&&"pro"===i.data.OfferType.toLowerCase()&&this.fields.data.modes.push(i.data.OfferType.toLowerCase()),this.fields.mxStep+=1,t.push("api","pcb.DeviceManager.getDeviceInfo","2",this)):(t.logMessage("SEM_SYN_ERROR"),this.fields.status=-1,this.fields.mxStep=0);break;case"2":0===i.status||!0===i.status?"Livebox 4"===i.data.ProductClass?this.fields.data.modes.push("mib4"):"Livebox Fibre"===i.data.ProductClass?this.fields.data.modes.push("lb5"):"Livebox 6"===i.data.ProductClass?this.fields.data.modes.push("lb6"):"Livebox 7"===i.data.ProductClass?this.fields.data.modes.push("lb7"):"Livebox Nautilus"===i.data.ProductClass?this.fields.data.modes.push("lbn"):"Funbox10"===i.data.ProductClass?this.fields.data.modes.push("fb10"):"Funbox6"===i.data.ProductClass&&this.fields.data.modes.push("fb6"):(t.logMessage("SEM_SYN_ERROR"),this.fields.status=-1,this.fields.mxStep=0);break;default:s.warn("Unexpected step '"+e+"' in call stack"),this.fields.nbStep-=1}this.fields.nbStep>=this.fields.mxStep&&(a={status:this.fields.status},0===this.fields.status&&this.fields.data&&(a.data=this.fields.data),t.popAll("api",a,this.fields.uuid))}}});
http://192.168.1.1/assets/mhs/settings/settings.pro.json {"options":{"applications":{"allowed":["favorites","internetState","voiceAdvanced","televisionState","wifiAdvanced","wifiGuest","wifiScheduling","devicesHistory","devicesList","internetConnection","internetRemote","airbox","internetVPNAnkaa","localSettings","networkFirewall","networkAdvanced","systemInformation","userPassword","systemBackup","internetHotline","systemUpgrade","systemReset","systemRestart","orangeApps","orangeLivebox","orangeTv","orangeHelp","orangeUser","orangeDiagnostic","localLicense","orangeAccount","localSession","standby","standbyScheduling","ipv6Routing"]}}}
http://192.168.1.1/sdkut/semantic/sah/Connection/Client/Routes/getStaticRoutes.js http://192.168.1.1/sdkut/apis/pcb/NMC/getStaticRoutes.json define(["utils/console","engine/callStack"],function(t,s){"use strict";return{name:"getStaticRoutes",description:"Returns static routes",fields:{uuid:null,nbStep:0,mxStep:0,status:0,data:{modes:[]}},call:function(i,e){var a;if("0"===i)this.fields.uuid=e.uuid,this.fields.status=0,this.fields.nbStep=0,this.fields.mxStep=0,this.fields.data=[],this.fields.mxStep+=1,s.push("api","pcb.NMC.getStaticRoutes","1",this,{});else switch(this.fields.nbStep+=1,i){case"1":!0===e.status?this.fields.data=e.data:(this.fields.mxStep=-1,this.fields.status=-1,s.logMessage("SEM_SYN_ERROR"));break;default:t.warn("Unexpected step '"+i+"' in call stack"),this.fields.nbStep-=1}this.fields.nbStep>=this.fields.mxStep&&(a={status:this.fields.status},0===this.fields.status&&this.fields.data&&(a.data=this.fields.data),s.popAll("api",a,this.fields.uuid))}}});
http://192.168.1.1/sdkut/semantic/sah/Connection/Client/Domino/setDominoConfiguration.js http://192.168.1.1/sdkut/semantic/sah/Connection/Client/Domino/activateRescueService.js http://192.168.1.1/sdkut/apis/pcb/Domino/enableBackupFeature.json http://192.168.1.1/sdkut/semantic/sah/Connection/Client/Domino/enableDominoComponent.js http://192.168.1.1/sdkut/apis/pcb/Domino/enableDominoComponent.json {"details":{"resourceId":"enableBackupFeature","parentPath":"pcb/Domino","resourceType":"method","resourceDescription":{"uid":"pcb/Domino/enableBackupFeature:method","description":"This method activates Domino backup service","languageTab":{"AS":"","JS":"","WS":"admin|POST|ws|Domino|enableBackupFeature"},"isAsynchronous":"0","isEnabled":"1","inputList":[{"inputDescription":"","inputDataType":"object","objectFormat":"{\n"enable":"[boolean]"\n}","isOptional":"0"}],"output":{"outputDescription":"Composed of the following parameters:\n- status: see Return Status\n","outputDataType":"object","optionalFields":"","objectFormat":"{\n "status": "[boolean]"\n}","possibleStatusTab":{"statusList":[true,false],"descriptionList":["On success","On failure"]}}}}}
{"details":{"resourceId":"enableDominoComponent","parentPath":"pcb/Domino","resourceType":"method","resourceDescription":{"uid":"pcb/Domino/enableDominoComponent:method","description":"This method activates Domino service","languageTab":{"AS":"","JS":"","WS":"admin|POST|ws|Domino|enableDominoComponent"},"isAsynchronous":"0","isEnabled":"1","inputList":[{"inputDescription":"","inputDataType":"object","objectFormat":"{\n"enable":"[boolean]"\n}","isOptional":"0"}],"output":{"outputDescription":"Composed of the following parameters:\n- status: see Return Status\n","outputDataType":"object","optionalFields":"","objectFormat":"{\n "status": "[boolean]"\n}","possibleStatusTab":{"statusList":[true,false],"descriptionList":["On success","On failure"]}}}}}
voici quelques infos:
python sysbus.py NMC.LAN:getStaticRoutes
{
"status": {
"NPiOgoBk3b": {
"Enable": true,
"Status": "Bound",
"DstLen": 24,
"Dst": "192.168.250.0",
"Priority": 3001,
"Gateway": "192.168.1.250",
"MTU": 1500
},
"wzQIWEBb5G": {
"Enable": false,
"Status": "Disabled",
"DstLen": 24,
"Dst": "10.10.10.0",
"Priority": 3002,
"Gateway": "192.168.250.10",
"MTU": 1500
}
}
}
spying chrome devtools:
voir model sysbus a la fin aussi.
créer:
{
"service": "NMC.LAN",
"method": "addStaticRoute",
"parameters": {
"Name": "wzQIWEBb5G",
"Dst": "10.10.10.0",
"DstLen": 24,
"Gateway": "192.168.250.10",
"Enable": false,
"Priority": 3002
}
}
supprimer:
{
"service": "NMC.LAN",
"method": "deleteStaticRoute",
"parameters": {
"Name": "wzQIWEBb5G"
}
}
activer/désactiver:
{
"service": "NMC.LAN.IPv4Route.wzQIWEBb5G",
"method": "set",
"parameters": {
"Enable": true
}
}
Le nom est crée coté client (interface web),avec ce code js:
function c() {
for (var e = "", t = 0; t < 10; t++)
e += p.charAt(Math.floor(Math.random() * p.length));
return e
}
source: http://iplivebox/internal/networkAdvanced/main.js?sah=0_20240709
nb: la priority coté backend est 3000+valeur dans l'interface
quelques tests avec sysbus
addStaticRoute
python sysbus.py NMC.LAN:addStaticRoute
erreur: {"result":{"status":null,"errors":[{"error":196640,"description":"Missing mandatory argument","info":"Name"},{"error":196640,"description":"Missing mandatory argument","info":"Dst"},{"error":196640,"description":"Missing mandatory argument","info":"DstLen"},{"error":196640,"description":"Missing mandatory argument","info":"Gateway"}]}}
si on met des bons arguments. la réponse est:
{
"status": null
}
si on créer 2 fois le meme nom:
erreur: {"result":{"status":null,"errors":[{"error":196639,"description":"Function execution failed","info":"addStaticRoute"}]}}
si on édite la route avec l'interface de la box, le nom change car en fait il n'y a pas de méthode de modification, dans l'interface "modifier" revient a supprimer puis recréer.
deleteStaticRoute
route existante:
python sysbus.py NMC.LAN:deleteStaticRoute Name=Foo3
{
"status": null
}
route inexistante:
python sysbus.py NMC.LAN:deleteStaticRoute Name=Boo
erreur: {"result":{"status":null,"errors":[{"error":196639,"description":"Function execution failed","info":"deleteStaticRoute"}]}}
Set d'un route
route existante:
python sysbus.py NMC.LAN.IPv4Route.ZysUR47npK:set Enable=true
{
"status": true
}
python sysbus.py NMC.LAN.IPv4Route.ZysUR47npK:set Enable=false
{
"status": true
}
route inexistante:
python sysbus.py NMC.LAN.IPv4Route.Foo:set Enable=false
erreur: {"result":{"status":null,"errors":[{"error":196618,"description":"Object or parameter not found","info":"NMC.LAN.IPv4Route.Foo"}]}}
model sysbus
python sysbus.py NMC.LAN -model
=========================================== level 0
OBJECT NAME: 'NMC.LAN' (name: LAN)
function: addStaticRoute (Name, Dst, DstLen, Gateway, opt Enable, opt Priority, opt MTU)
function: deleteStaticRoute (Name)
function: getStaticRoutes ()
--> instances 0
=========================================== level 1
OBJECT NAME: 'NMC.LAN.IPv4Route' (name: IPv4Route)
parameter: Enable : bool = 'False'
parameter: Status : string = 'Disabled'
parameter: DstLen : uint32 = '24'
parameter: Dst : string = ''
parameter: Priority : int32 = '0'
parameter: Gateway : string = ''
parameter: MTU : uint32 = '1500'
--> templateInfo 1
--> instances 2
instance 1: 'NMC.LAN.IPv4Route.NPiOgoBk3b' (name: 1)
parameter: Enable : bool = 'True'
parameter: Status : string = 'Bound'
parameter: DstLen : uint32 = '24'
parameter: Dst : string = '192.168.250.0'
parameter: Priority : int32 = '3001'
parameter: Gateway : string = '192.168.1.250'
parameter: MTU : uint32 = '1500'
instance 2: 'NMC.LAN.IPv4Route.rJENcXtsI6' (name: 24)
parameter: Enable : bool = 'True'
parameter: Status : string = 'Bound'
parameter: DstLen : uint32 = '24'
parameter: Dst : string = '10.10.20.0'
parameter: Priority : int32 = '3010'
parameter: Gateway : string = '192.168.1.250'
parameter: MTU : uint32 = '1500'
Merci beaucoup @jfgiorgi ça semble complet pour se lancer dans une implémentation "à l'aveugle" ! Par contre il va toujours me falloir un moyen de déterminer qu'il s'agit d'un modèle Pro. Y aurait-il un champ dans les infos Livebox sur lequel s'appuyer et qui puisse fonctionner pour tous les modèles à partir de la LB5 ?
@p-dor c'est documenté dans l'API:
sysbus NMC:get
la réponse a un champ pour le type d'offre:
- OfferType (type: string)
Attributes: persistent
Validator: ['Res', 'Pro']
testé sur une Pro et une non Pro, ca rend bien 'Pro' dans le 1er cas et 'Res' dans l'autre (res= residentiel j'imagine)
Bonjour, je commence à regarder pour l'implémentation et merci encore pour tous ces détails. Il reste une question à propos du champs "Interface" affiché, qui est un peu mystérieux car :
- Il n'y a rien de correspondant dans le retour de getStaticRoute().
- En regardant de plus près le code côté client en JavaScript le hard code à "LAN", ce qui semble logique.
- Mais en input la UI propose "LAN" ou "WAN". Est-ce que cette valeur est tout simplement ignorée et ne sert à rien ? Ou est-ce que le fait de sélectionner "WAN" a une quelconque conséquence ? Merci.
Bonsoir, je viens de soumettre sur le repo une implémentation du support des tables de routage via un nouveau bouton dans l'onglet "Actions". Bien sûr ce bouton n'est actif que sur une LB Pro et suite à mon dernier commentaire j'ai assumé que le champ "Interface" ne servait à rien, donc vous ne le trouverez pas dans le dialogue.
@jfgiorgi / @MrVinceZ / @michel-morin si vous aviez un moyen de tester et me confirmer que tout marche bien ce serait top car j'ai fait ça totalement à l'aveugle uniquement à partir des informations ci dessus. Si vous avez besoin d'un .exe intermédiaire pour tester il n'y a qu'à demander. Merci.
hello. cela marche sur un lb6pro. On voit bien les routes existantes et ajout/suppression ok.
v1.6 publiée avec le support des tables de routage.