LiveboxMonitor icon indicating copy to clipboard operation
LiveboxMonitor copied to clipboard

Ajout table de routage

Open MrVinceZ opened this issue 1 year ago • 5 comments

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

MrVinceZ avatar Jan 07 '25 18:01 MrVinceZ

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.

p-dor avatar Jan 07 '25 19:01 p-dor

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"]}}}}}

michel-morin avatar Jan 22 '25 18:01 michel-morin

voici quelques infos:

Image

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'

jfgiorgi avatar Mar 17 '25 16:03 jfgiorgi

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 avatar Mar 23 '25 19:03 p-dor

@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)

jfgiorgi avatar Mar 23 '25 20:03 jfgiorgi

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.

p-dor avatar Jul 28 '25 14:07 p-dor

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.

p-dor avatar Jul 30 '25 17:07 p-dor

hello. cela marche sur un lb6pro. On voit bien les routes existantes et ajout/suppression ok.

jfgiorgi avatar Jul 31 '25 19:07 jfgiorgi

v1.6 publiée avec le support des tables de routage.

p-dor avatar Aug 05 '25 17:08 p-dor