Aller au contenu

hpsmartyz2

Membres
  • Compteur de contenus

    20
  • Inscription

  • Dernière visite

Tout ce qui a été posté par hpsmartyz2

  1. c'est bon c'est remonté. Voilà un plot de la qualité du signal d'un homepod connecté à mon répéteur. les données manquantes à la fin c'est simplement car j'ai réalisé que le lien box-switch était à 100Mb plutôt que les 1000Mb attendus et j'ai fait qques manips avec le switch, en vain. Pour la force du signal c'est juste la couleur qui compte (car elle est exprimée en dbm <0 normalement et je fais donc '+ 100' pour la ploter, mais donc c'est le delta à 100 qui s'affiche), le snr quant à lui reflète la valeur extraite. Si cela intéresse certains je peux partager les templates cacti qui servent à tout ça.
  2. je pense que c'est plutôt 500Mo et 1Go respectivement, mais au delà de ça, je trouve des articles qui semblent confirmer 1Go pour la 4 mais ne trouve rien pour la 5.
  3. Bonjour, bonne question. j'extraie l'info d'ici: OBJECT NAME: 'sysbus.DeviceInfo.MemoryStatus' (name: MemoryStatus) parameter: Total : uint32 = '490944' parameter: Free : uint32 = '184368' et je plote Free (en ayant pris l'hypothèse qu'il fallait multiplier par 1024. D'où viennent vos chiffres ? Merci.
  4. La mémoire disponible de la box diminue, c'est peut-être pas bon signe 🤨
  5. Bon, vu que je suis pas super doué en ash ça m'a pris un peu de temps, ainsi que farfouiller dans les recoins de la Livebox 5. Pour ceux que cela intéresse voilà mon script. Il extrait les stats de trafic des interfaces wifi, lan, wan de la box les stats de trafic des interfaces wifi du répéteur la puissance du signal et le rapport signal sur bruit de chacun des terminaux connectés (à la box ou au répéteur) la mémoire vive disponible sur la box je ne récupère que les port 1 (eth0) et 4 (eth3) du lan, mais ça se généralise aux deux autres très simplement. Je compléterai ce script au fur et à mesure avec d'autres paramètres. Pour l'instant je n'ai pas encore trouvé comment extraire les stats des terminaux filaires. Plus précisément j'ai trouvé un moyen (récupérer les flow stats) mais qui n'est pas le plus évident qui soit et donc il faut que j'y travaille encore. Le script inscrit les paramètres dans un fichier texte selon un format donné mais ce n'est pas la partie intéressante. Ce qui est susceptible de vous intéresser c'est l'ensemble des fonctions appelées. #!/bin/sh # credits to https://blog.tetsumaki.net/ for LB connection/authentication method lbDataDir=/var/services/web/cacti/scripts/livebox if [ -f $lbDataDir/lock ]; then echo "lock file should not exist" else touch $lbDataDir/lock myLivebox="ip-de-la-box" myExtender="ip-du-repeteur" passwd="mot-de-passe-de-la-box/du-repeteur" lbOutput=$lbDataDir/lbOutput.txt lbCookies=$lbDataDir/lbCookies.txt extOutput=$lbDataDir/extOutput.txt extCookies=$lbDataDir/extCookies.txt rm $lbDataDir/livebox-infos.txt touch $lbDataDir/livebox-infos.txt #***********************************# # LIVEBOX # #***********************************# #connect to livebox curl -s -o "$lbOutput" -X POST -c "$lbCookies" -H 'Content-Type: application/x-sah-ws-4-call+json' -H 'Authorization: X-Sah-Login' -d "{\"service\":\"sah.Device.Information\",\"method\":\"createContext\",\"parameters\":{\"applicationName\":\"so_sdkut\",\"username\":\"admin\",\"password\":\"$passwd\"}}" http://$myLivebox/ws > /dev/null lbContextID=$(tail -n1 "$lbOutput" | sed 's/{"status":0,"data":{"contextID":"//1'| sed 's/",//1' | sed 's/"groups":"http,admin//1' | sed 's/"}}//1') #Get traffic stats of interfaces intfList="veip0 eth0 eth3 wl0 eth4" prefix="NeMo.Intf." for intf in $intfList; do srv="${prefix}${intf}" output=$(curl -s -b "$lbCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $lbContextID" -d "{\"service\":\"$srv\",\"method\":\"getNetDevStats\",\"parameters\":{}}" http://$myLivebox/ws) verif=$(echo "$output" | cut -d":" -f2 | cut -d"," -f1) if [ "$verif" = "null" ]; then echo "interface ${intf} does not exist or could not be retreived" else rx=$(echo "$output" | awk -F'RxBytes' '{print $2}' | awk -F\: '{print $2}' | awk -F\, '{print $1}') tx=$(echo "$output" | awk -F'TxBytes' '{print $2}' | awk -F\: '{print $2}' | awk -F\, '{print $1}') echo "lb_$intf>rx:$rx,tx:$tx" >> $lbDataDir/livebox-infos.txt fi done #Get traffic and signal stats of wireless terminals. Only Active Associated Devices are considered. prefix="NeMo.Intf." intfList="wl0 eth4" for intf in $intfList; do srv="${prefix}${intf}" output=$(curl -s -b "$lbCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $lbContextID" -d "{\"service\":\"$srv\",\"method\":\"getStationStats\",\"parameters\":{}}" http://$myLivebox/ws) verif=$(echo "$output" | cut -d":" -f2 | cut -d"," -f1) if [ "$verif" = "null" ]; then echo "error retreiving ${srv}:getStationStats" else n=1 nAD=$(echo "$output" | awk -F'MACAddress' '{print NF-1}') while [ $n -le $nAD ]; do isActive=$(echo "$output" | awk -F'Active' "{print \$$((n+1))}" | awk -F\: '{print $2}' | awk -F\, '{print $1}') mac=$(echo "$output" | awk -F'"MACAddress":' "{print \$$((n+1))}" | awk -F\, '{print $1}' | awk -F\" '{print $2}') if [ "$isActive" = "true" ]; then rx=$(echo "$output" | awk -F'RxBytes' "{print \$$((n+1))}" | awk -F\: '{print $2}' | awk -F\, '{print $1}') tx=$(echo "$output" | awk -F'TxBytes' "{print \$$((n+1))}" | awk -F\: '{print $2}' | awk -F\, '{print $1}') sst=$(echo "$output" | awk -F'"SignalStrength":' "{print \$$((n+1))}" | awk -F\, '{print $1}') snr=$(echo "$output" | awk -F'SignalNoiseRatio' "{print \$$((n+1))}" | awk -F\: '{print $2}' | awk -F\, '{print $1}') sst=$((sst + 100)) if [ $sst -gt 70 ]; then sig="r1:10,r2:10,r3:10,r4:3,r5:7,r6:10,r7:20,r8:$((sst - 70)),snr:$snr" elif [ $sst -gt 50 ]; then sig="r1:10,r2:10,r3:10,r4:3,r5:7,r6:10,r7:$((sst - 50)),r8:0,snr:$snr" elif [ $sst -gt 40 ]; then sig="r1:10,r2:10,r3:10,r4:3,r5:7,r6:$((sst - 40)),r7:0,r8:0,snr:$snr" elif [ $sst -gt 33 ]; then sig="r1:10,r2:10,r3:10,r4:3,r5:$((sst - 33)),r6:0,r7:0,r8:0,snr:$snr" elif [ $sst -gt 30 ]; then sig="r1:10,r2:10,r3:10,r4:$((sst - 30)),r5:0,r6:0,r7:0,r8:0,snr:$snr" elif [ $sst -gt 20 ]; then sig="r1:10,r2:10,r3:$((sst - 20)),r4:0,r5:0,r6:0,r7:0,r8:0,snr:$snr" elif [ $sst -gt 10 ]; then sig="r1:10,r2:$((sst - 10)),r3:0,r4:0,r5:0,r6:0,r7:0,r8:0,snr:$snr" elif [ $sst -gt 0 ]; then sig="r1:$sst,r2:0,r3:0,r4:0,r5:0,r6:0,r7:0,r8:0,snr:$snr" fi echo "lb_$mac>rx:$rx,tx:$tx,$sig" >> $lbDataDir/livebox-infos.txt else echo "device ${mac} is Associated but inactive. It might be connected to an extender or could become out of range soon" fi n=$((n + 1)) done fi done output=$(curl -s -b "$lbCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $lbContextID" -d "{\"service\":\"DeviceInfo.MemoryStatus\",\"method\":\"get\",\"parameters\":{}}" http://$myLivebox/ws) verif=$(echo "$output" | cut -d"{" -f2 | cut -d":" -f2) if [ "$verif" = "null" ]; then echo "error retreiving DeviceInfo.MemoryStatus" else mf=$(echo "$output" | awk -F'Free' '{print $2}'| awk -F\: '{print $2}' | awk -F\, '{print $1}' | awk -F\} '{print $1}') echo "$myLivebox>MemFree:$mf" >> $lbDataDir/livebox-infos.txt fi #disconnect from livebox curl -s -b "$lbCookies" -X POST http://$myLivebox/logout rm "$lbCookies" "$lbOutput" #***********************************# # REPETEUR # #***********************************# #connect to extender curl -s -o "$extOutput" -X POST -c "$extCookies" -H 'Content-Type: application/x-sah-ws-4-call+json' -H 'Authorization: X-Sah-Login' -d "{\"service\":\"sah.Device.Information\",\"method\":\"createContext\",\"parameters\":{\"applicationName\":\"so_sdkut\",\"username\":\"admin\",\"password\":\"$passwd\"}}" http://$myExtender/ws > /dev/null extContextID=$(tail -n1 "$extOutput" | sed 's/{"status":0,"data":{"contextID":"//1'| sed 's/",//1' | sed 's/"groups":"http,admin//1' | sed 's/"}}//1') #Get traffic stats of interfaces intfList="wl0 vap5g0priv" prefix="NeMo.Intf." for intf in $intfList; do srv="${prefix}${intf}" output=$(curl -s -b "$extCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $extContextID" -d "{\"service\":\"$srv\",\"method\":\"getNetDevStats\",\"parameters\":{}}" http://$myExtender/ws) verif=$(echo "$output" | cut -d":" -f2 | cut -d"," -f1) if [ "$verif" = "null" ]; then echo "interface ${intf} does not exist or could not be retreived" else rx=$(echo "$output" | awk -F'RxBytes' '{print $2}' | awk -F\: '{print $2}' | awk -F\, '{print $1}') tx=$(echo "$output" | awk -F'TxBytes' '{print $2}' | awk -F\: '{print $2}' | awk -F\, '{print $1}') #adding prefix to differenciate intf name between box and extender (only usefull for wl0) echo "ext_$intf>rx:$rx,tx:$tx" >> $lbDataDir/livebox-infos.txt fi done prefix="NeMo.Intf." intfList="wl0 vap5g0priv" for intf in $intfList; do srv="${prefix}${intf}" output=$(curl -s -b "$extCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $extContextID" -d "{\"service\":\"$srv\",\"method\":\"getStationStats\",\"parameters\":{}}" http://$myExtender/ws) verif=$(echo "$output" | cut -d":" -f2 | cut -d"," -f1) if [ "$verif" = "null" ]; then echo "error retreiving ${srv}:getStationStats" else n=1 nAD=$(echo "$output" | awk -F'MACAddress' '{print NF-1}') while [ $n -le $nAD ]; do isActive=$(echo "$output" | awk -F'Active' "{print \$$((n+1))}" | awk -F\: '{print $2}' | awk -F\, '{print $1}') mac=$(echo "$output" | awk -F'"MACAddress":' "{print \$$((n+1))}" | awk -F\, '{print $1}' | awk -F\" '{print $2}') if [ "$isActive" = "true" ]; then rx=$(echo "$output" | awk -F'RxBytes' "{print \$$((n+1))}" | awk -F\: '{print $2}' | awk -F\, '{print $1}') tx=$(echo "$output" | awk -F'TxBytes' "{print \$$((n+1))}" | awk -F\: '{print $2}' | awk -F\, '{print $1}') sst=$(echo "$output" | awk -F'"SignalStrength":' "{print \$$((n+1))}" | awk -F\, '{print $1}') snr=$(echo "$output" | awk -F'SignalNoiseRatio' "{print \$$((n+1))}" | awk -F\: '{print $2}' | awk -F\, '{print $1}') sst=$((sst + 100)) if [ $sst -gt 70 ]; then sig="r1:10,r2:10,r3:10,r4:3,r5:7,r6:10,r7:20,r8:$((sst - 70)),snr:$snr" elif [ $sst -gt 50 ]; then sig="r1:10,r2:10,r3:10,r4:3,r5:7,r6:10,r7:$((sst - 50)),r8:0,snr:$snr" elif [ $sst -gt 40 ]; then sig="r1:10,r2:10,r3:10,r4:3,r5:7,r6:$((sst - 40)),r7:0,r8:0,snr:$snr" elif [ $sst -gt 33 ]; then sig="r1:10,r2:10,r3:10,r4:3,r5:$((sst - 33)),r6:0,r7:0,r8:0,snr:$snr" elif [ $sst -gt 30 ]; then sig="r1:10,r2:10,r3:10,r4:$((sst - 30)),r5:0,r6:0,r7:0,r8:0,snr:$snr" elif [ $sst -gt 20 ]; then sig="r1:10,r2:10,r3:$((sst - 20)),r4:0,r5:0,r6:0,r7:0,r8:0,snr:$snr" elif [ $sst -gt 10 ]; then sig="r1:10,r2:$((sst - 10)),r3:0,r4:0,r5:0,r6:0,r7:0,r8:0,snr:$snr" elif [ $sst -gt 0 ]; then sig="r1:$sst,r2:0,r3:0,r4:0,r5:0,r6:0,r7:0,r8:0,snr:$snr" fi #adding prefix to differenciate terminal mac between box and extender #traffic and signal data are specific to connection point echo "ext_$mac>rx:$rx,tx:$tx,$sig" >> $lbDataDir/livebox-infos.txt else echo "device ${mac} is Associated but inactive. It might be connected to an extender or could become out of range soon" fi n=$((n + 1)) done fi done #disconnect from extender curl -s -b "$extCookies" -X POST http://$myExtender/logout rm "$extCookies" "$extOutput" rm $lbDataDir/lock fi
  6. Bonjour, puisque ce tuto remonte il fait revenir à mon esprit une question à laquelle je ne trouve pas de réponse, mais je peux avoir mal cherché. Quel est le comportement quand aucune des cases NA/RO/RW est cochée ? merci
  7. le problème n'est pas tant le numéro de l'instance ni leur nombre mais plutôt de remarquer que sur la box4 l'interface Wifi 5GHz s'appelle eth6 alors qu'elle s'appelle eth4 sur la LB5. Néanmoins, dans les deux cas l'objet Interface reste le même donc le modèle générique est identique, au moins à ce sujet. ca ne sert pas à grand chose de récupérer les stats trop fréquemment. Sur des routeurs de coeur de réseau qui traitent des tera en transit le minimum théorique est de l'ordre de 10s et le cas le plus fréquent pratique c'est 1 à 5 min pour des stats de débit. ca dépend bien sûr de l'utilisation mais la surveillance du traffic n'est pas faite pour détecter des évènements nécessitant une réponse rapide, inutile donc d'avoir l'info très fréquemment et la LB n'est pas un routeur de coeur. avec mon script actuel et sa liaison à cacti je fais je lance le script autant de fois que j'ai de graphs et chaque appel au script génère une authentification et extrait le/les paramètre(s) necessaire(s) pour le graph ayant généré la requête. chaque graph est mis à jour toutes les 5 minutes. donc si je me retrouve avec +70 graphs ca va faire un burst de 70 requêtes auth+extraction toutes les 5 min pour optimiser un peu je vais faire 1 requête d'authentification + extraction des 70 paramètres toutes les 5min, tout stocker dans une base et faire cacti interroger cette base, indépendamment.
  8. Bonjour ah! je n'avais pas compris que tu étais sous LB4. l'instance du modèle doit être différente, mais pas le modèle en soit. Les commandes pour accès aux stats que j'ai postées hier soir je les ai trouvées dans le data model, tu dois pouvoir faire de même avec celui de ta lb. Je serais étonné qu'Orange ait des modèles par box. c'est ingérable. donc le modèle doit être unique et s'instancie de différentes manières dépendant de la box. Dans le cas des interfaces plus haut, ce sont des instances de l'objet générique interface et c'est donc normal que je n'aie rien relatif à l'A/V-DSL. je crois néanmoins que le nom de certaines interfaces pourrait avoir changé entre LB4 et LB5 Ultimement tu passes des commandes curl avec les noms de fonctions récupérées dans le dm ou via chrome et tu vois ce que ça rend. je suis en train de retravailler complètement le script car j'ai pas mal de devices. Tu m'as fait un peu peur et je ne voudrais pas qu'un burst d'une cinquantaine de requêtes simultanées pour récupérer la qualité du signal, les stats des devices et le traffic des interfaces plus qques autres trucs ne pourrissent ma box donc je vais tout faire en un appel et ferai Cacti traiter le résultat de manière indépendante.
  9. @oracle7 j'ai trouvé beaucoup mieux pour récupérer le traffic des interfaces: curl -s -o "$myBashDir/hl.txt" -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"HomeLan.Interface.wl0.Stats\",\"method\":\"get\",\"parameters\":{}}" http://$myLivebox/ws et changer le service par les noms suivants, selon l'interface voulue: instance 1: 'sysbus.HomeLan.Interface.wl0' (name: 1) parameter: FriendlyName : string = '2.4GHz-Private_SSID' parameter: Name : string = 'wl0' parameter: Alias : string = 'WiFi' parameter: NumberOfStoredMeasures : uint32 = '2968' instance 2: 'sysbus.HomeLan.Interface.eth4' (name: 2) parameter: FriendlyName : string = '5GHz-Private_SSID' parameter: Name : string = 'eth4' parameter: Alias : string = 'WiFi' parameter: NumberOfStoredMeasures : uint32 = '2968' instance 3: 'sysbus.HomeLan.Interface.eth0' (name: 3) parameter: FriendlyName : string = 'eth1' parameter: Name : string = 'eth0' parameter: Alias : string = 'Eth' parameter: NumberOfStoredMeasures : uint32 = '2967' instance 4: 'sysbus.HomeLan.Interface.eth1' (name: 4) parameter: FriendlyName : string = 'eth2' parameter: Name : string = 'eth1' parameter: Alias : string = 'Eth' parameter: NumberOfStoredMeasures : uint32 = '0' instance 5: 'sysbus.HomeLan.Interface.eth2' (name: 5) parameter: FriendlyName : string = 'eth3' parameter: Name : string = 'eth2' parameter: Alias : string = 'Eth' parameter: NumberOfStoredMeasures : uint32 = '0' instance 6: 'sysbus.HomeLan.Interface.eth3' (name: 6) parameter: FriendlyName : string = 'eth4' parameter: Name : string = 'eth3' parameter: Alias : string = 'Eth' parameter: NumberOfStoredMeasures : uint32 = '2968' instance 7: 'sysbus.HomeLan.Interface.eth3_wan' (name: 7) parameter: FriendlyName : string = 'WAN_Ethernet' parameter: Name : string = 'eth3' parameter: Alias : string = 'WAN_Virtual' parameter: NumberOfStoredMeasures : uint32 = '2968' instance 8: 'sysbus.HomeLan.Interface.vlan_data' (name: 8) parameter: FriendlyName : string = 'WAN_Ethernet-Internet' parameter: Name : string = 'vlan_data' parameter: Alias : string = 'WAN_Virtual' parameter: NumberOfStoredMeasures : uint32 = '0' instance 9: 'sysbus.HomeLan.Interface.vlan_multi' (name: 9) parameter: FriendlyName : string = 'WAN_Ethernet-MultiServices' parameter: Name : string = 'vlan_multi' parameter: Alias : string = 'WAN_Virtual' parameter: NumberOfStoredMeasures : uint32 = '0' instance 10: 'sysbus.HomeLan.Interface.vlan_voip' (name: 10) parameter: FriendlyName : string = 'WAN_Ethernet-VoIP' parameter: Name : string = 'vlan_voip' parameter: Alias : string = 'WAN_Virtual' parameter: NumberOfStoredMeasures : uint32 = '0' instance 11: 'sysbus.HomeLan.Interface.vlan_iptv1' (name: 11) parameter: FriendlyName : string = 'WAN_Ethernet-IPTV_VOD' parameter: Name : string = 'vlan_iptv1' parameter: Alias : string = 'WAN_Virtual' parameter: NumberOfStoredMeasures : uint32 = '0' instance 12: 'sysbus.HomeLan.Interface.vlan_iptv2' (name: 12) parameter: FriendlyName : string = 'WAN_Ethernet-IPTV_Live' parameter: Name : string = 'vlan_iptv2' parameter: Alias : string = 'WAN_Virtual' parameter: NumberOfStoredMeasures : uint32 = '0' instance 13: 'sysbus.HomeLan.Interface.veip0' (name: 13) parameter: FriendlyName : string = 'WAN_GPON' parameter: Name : string = 'veip0' parameter: Alias : string = 'WAN_Virtual' parameter: NumberOfStoredMeasures : uint32 = '2968' instance 14: 'sysbus.HomeLan.Interface.gvlan_data' (name: 14) parameter: FriendlyName : string = 'WAN_GPON-Internet' parameter: Name : string = 'gvlan_data' parameter: Alias : string = 'WAN_Virtual' parameter: NumberOfStoredMeasures : uint32 = '0' instance 15: 'sysbus.HomeLan.Interface.gvlan_multi' (name: 15) parameter: FriendlyName : string = 'WAN_GPON-MultiServices' parameter: Name : string = 'gvlan_multi' parameter: Alias : string = 'WAN_Virtual' parameter: NumberOfStoredMeasures : uint32 = '2966' instance 16: 'sysbus.HomeLan.Interface.gvlan_voip' (name: 16) parameter: FriendlyName : string = 'WAN_GPON-VoIP' parameter: Name : string = 'gvlan_voip' parameter: Alias : string = 'WAN_Virtual' parameter: NumberOfStoredMeasures : uint32 = '0' instance 17: 'sysbus.HomeLan.Interface.gvlan_iptv1' (name: 17) parameter: FriendlyName : string = 'WAN_GPON-IPTV_VOD' parameter: Name : string = 'gvlan_iptv1' parameter: Alias : string = 'WAN_Virtual' parameter: NumberOfStoredMeasures : uint32 = '0' instance 18: 'sysbus.HomeLan.Interface.gvlan_iptv2' (name: 18) parameter: FriendlyName : string = 'WAN_GPON-IPTV_Live' parameter: Name : string = 'gvlan_iptv2' parameter: Alias : string = 'WAN_Virtual' parameter: NumberOfStoredMeasures : uint32 = '2959' instance 19: 'sysbus.HomeLan.Interface.wlguest2' (name: 19) parameter: FriendlyName : string = '2.4GHz-Guest_SSID' parameter: Name : string = 'wlguest2' parameter: Alias : string = 'WiFi' parameter: NumberOfStoredMeasures : uint32 = '0' instance 20: 'sysbus.HomeLan.Interface.wlguest5' (name: 20) parameter: FriendlyName : string = '5GHz-Guest_SSID' parameter: Name : string = 'wlguest5' parameter: Alias : string = 'WiFi' parameter: NumberOfStoredMeasures : uint32 = '0' pour récupérer les stats du wan: curl -s -o "$myBashDir/hl.txt" -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"HomeLan\",\"method\":\"getWANCounters\",\"parameters\":{}}" http://$myLivebox/ws
  10. une commande pour récupérer l'état de la mémoire de la box: curl -s -o "$myBashDir/device.txt" -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"DeviceInfo.MemoryStatus\",\"method\":\"get\",\"parameters\":{}}" http://$myLivebox/ws
  11. je poste des requêtes que j'avais collectées au cas où certains y trouvent leur bonheur: Je n'ai cependant pas réussi à déterminer comment passer les paramètres dans les commandes curl ... {service: "DeviceInfo", method: "get", parameters: {}} {service: "NMC", method: "get", parameters: {}} {service: "UserInterface", method: "getLanguage", parameters: {}} {service: "UserInterface", method: "getState", parameters: {}} {service: "UserManagement", method: "getUser", parameters: {name: "admin"}} {service: "HTTPService", method: "getCurrentUser", parameters: {}} {service: "Manifests", method: "retrieve", parameters: {user: "admin", option: "wm_settings"}} {service: "IoTService", method: "getStatus", parameters: {}} {service: "NMC", method: "getWANStatus", parameters: {}} {service: "NMC.OrangeTV", method: "getIPTVStatus", parameters: {}} {service: "VoiceService.VoiceApplication", method: "listTrunks", parameters: {}} {service: "NMC", method: "getVoIPConfig", parameters: {}} {service: "NMC.Wifi", method: "get", parameters: {}} {service: "VoiceService.VoiceApplication", method: "getCallList", parameters: [{line: "1"}]} {service: "VoiceService.VoiceApplication", method: "listGroups", parameters: {}} {service: "NMC", method: "get", parameters: {}} {service: "NMC.OrangeTV", method: "getIPTVConfig", parameters: {}} {service: "Scheduler", method: "getCompleteSchedules", parameters: {type: "WLAN"}} {service: "Time", method: "getTime", parameters: {type: "WLAN"}} {service: "Devices", method: "get", parameters: {expression: "voice handset physical"}} {service: "NeMo.Intf.guest", method: "getMIBs", parameters: {mibs: "wlanvap"}} {service: "NeMo.Intf.lan", method: "getMIBs", parameters: {mibs: "base wlanradio"}} {service: "NeMo.Intf.data", method: "getMIBs", parameters: {mibs: "dhcp"}} {service: "NMC", method: "getLANIP", parameters: {}} {service: "DHCPv4.Server", method: "getDHCPServerPool", parameters: {id: "default"}} {service: "Scheduler", method: "getCompleteSchedules", parameters: {type: "ToD"}} {service: "DHCPv4.Server.Pool.default", method: "getStaticLeases", parameters: "default"} {service: "Devices", method: "get", parameters: {expression: ".Active==true"}} {service: "DHCPv4.Server.Pool.default", method: "getStaticLeases", parameters: "default"} {service: "TopologyDiagnostics", method: "buildTopology", parameters: {SendXmlFile: false}} ah bah si, je viens de trouver 😀 pour passer {service: "NeMo.Intf.wl0", method: "getMIBs", parameters: {mibs: "wlanvap"}} il faut écrire: {\"service\":\"NeMo.Intf.wl0\",\"method\":\"getMIBs\",\"parameters\":{\"mibs\": \"wlanvap\"}} dans la commande curl
  12. oui, ce sont des graphs Cacti, après tout on est dans le thread à ce sujet. les requêtes sont faites toutes les 5min. le code que je t'ai donné place les valeurs dans des variables, c'est indépendant de Cacti. A toi de voir comment tu utilises ces variables pour finalement injecter la valeur dans ton infrastructure de monitoring. pour ce qui est de sysbus, j'ai lu la doc, pas d'inquiétude 😉 En fait je ne tirerai pas plus de l'uml ou de la topo que du modèle en texte que j'ai déjà. le problème est que le modèle ne donne pas les nom des fonctions intéressantes à appeler. J'esperais que tu puisses les avoir. La meilleure méthode, à ma connaissance, reste donc d'observer les requêtes dans un navigateur, même si c'est assez limité. Dans le jours prochains je tenterai de sortir les stats de traffic par device. je te posterai la requête attention, pour la requête de la qualité du wifi il faut créer une variable 'dev' qui contient: Devices.Devices.12:34:56:78:90:AB où '12:34:56:78:90:AB' est l'adresse MAC du Device en question dernière note il est possible de récupérer dans la même mib les stats de traffic et de qualité de signal: NeMo.Intf.eth4 / getMIBs NeMo.Intf.wl0 / getMIBs
  13. soit dit en passant, sauf erreur, le data model peut s'extraire dans sa globalité. ce que je cherchais c'était la version uml qui me semble plus exploitable, ainsi que le graph des interfaces.
  14. je fais ici. la base vient des scripts que l'on trouve sur le web (notamment ici) et les commandes spécifiques sont dérivées d'une analyse des requêtes faites lors de la navigation sur l'interface web et inspectées via les outils "développeur" intégrés dans chrome. myLivebox=#ip-de-la-box myPassword=#mdp-de-la-box myBashDir=#un-chemin-sur-le-syno myOutput=$myBashDir/myOutput.txt myCookies=$myBashDir/myCookies.txt curl -s -o "$myOutput" -X POST -c "$myCookies" -H 'Content-Type: application/x-sah-ws-4-call+json' -H 'Authorization: X-Sah-Login' -d "{\"service\":\"sah.Device.Information\",\"method\":\"createContext\",\"parameters\":{\"applicationName\":\"so_sdkut\",\"username\":\"admin\",\"password\":\"$myPassword\"}}" http://$myLivebox/ws > /dev/null myContextID=$(tail -n1 "$myOutput" | sed 's/{"status":0,"data":{"contextID":"//1'| sed 's/",//1' | sed 's/"groups":"http,admin//1' | sed 's/"}}//1') #traffic wifi #2.4GHz + 5GHz WifiStats=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"NMC.Wifi\",\"method\":\"getStats\",\"parameters\":{}}" http://$myLivebox/ws` WifiStatsRxBytes=`echo $WifiStats | cut -d"{" -f3 | cut -d"," -f1 | cut -d":" -f2` WifiStatsTxBytes=`echo $WifiStats | cut -d":" -f5 | cut -d"}" -f1` #2.4GHz wl0Stats=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"NeMo.Intf.wl0\",\"method\":\"getNetDevStats\",\"parameters\":{}}" http://$myLivebox/ws` Wifi2StatsRxBytes=`echo $wl0Stats | cut -d"{" -f3 | cut -d"," -f3 | cut -d":" -f2` Wifi2StatsTxBytes=`echo $wl0Stats | cut -d"{" -f3 | cut -d"," -f4 | cut -d":" -f2` #5GHz eth4Stats=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"NeMo.Intf.eth4\",\"method\":\"getNetDevStats\",\"parameters\":{}}" http://$myLivebox/ws` Wifi5StatsRxBytes=`echo $eth4Stats | cut -d"{" -f3 | cut -d"," -f3 | cut -d":" -f2` Wifi5StatsTxBytes=`echo $eth4Stats | cut -d"{" -f3 | cut -d"," -f4 | cut -d":" -f2` #port eth 1 eth0Stats=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"NeMo.Intf.eth0\",\"method\":\"getNetDevStats\",\"parameters\":{}}" http://$myLivebox/ws` Lan0StatsRxBytes=`echo $eth0Stats | cut -d"{" -f3 | cut -d"," -f3 | cut -d":" -f2` Lan0StatsTxBytes=`echo $eth0Stats | cut -d"{" -f3 | cut -d"," -f4 | cut -d":" -f2` #port eth 2 eth1Stats=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"NeMo.Intf.eth1\",\"method\":\"getNetDevStats\",\"parameters\":{}}" http://$myLivebox/ws` Lan1StatsRxBytes=`echo $eth1Stats | cut -d"{" -f3 | cut -d"," -f3 | cut -d":" -f2` Lan1StatsTxBytes=`echo $eth1Stats | cut -d"{" -f3 | cut -d"," -f4 | cut -d":" -f2` #port eth 3 eth2Stats=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"NeMo.Intf.eth2\",\"method\":\"getNetDevStats\",\"parameters\":{}}" http://$myLivebox/ws` Lan2StatsRxBytes=`echo $eth2Stats | cut -d"{" -f3 | cut -d"," -f3 | cut -d":" -f2` Lan2StatsTxBytes=`echo $eth2Stats | cut -d"{" -f3 | cut -d"," -f4 | cut -d":" -f2` #port eth 4 eth3Stats=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"NeMo.Intf.eth3\",\"method\":\"getNetDevStats\",\"parameters\":{}}" http://$myLivebox/ws` Lan3StatsRxBytes=`echo $eth3Stats | cut -d"{" -f3 | cut -d"," -f3 | cut -d":" -f2` Lan3StatsTxBytes=`echo $eth3Stats | cut -d"{" -f3 | cut -d"," -f4 | cut -d":" -f2` #Wan veip0Stats=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"NeMo.Intf.veip0\",\"method\":\"getNetDevStats\",\"parameters\":{}}" http://$myLivebox/ws` WanStatsRxBytes=`echo $veip0Stats | cut -d"{" -f3 | cut -d"," -f3 | cut -d":" -f2` WanStatsTxBytes=`echo $veip0Stats | cut -d"{" -f3 | cut -d"," -f4 | cut -d":" -f2` #Signal Strength per Device #dev de la forme: "Devices.Device.mac-adddress" devInfo=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"$dev\",\"method\":\"get\",\"parameters\":{}}" http://$myLivebox/ws` searchstring="SignalStrength" rest=${devInfo#*$searchstring} pos=$(( ${#devInfo} - ${#rest} - ${#searchstring} )) sub=${devInfo:$pos:44} signalStrength=`echo $sub | cut -d"," -f1 | cut -d":" -f2` snr=`echo $sub | cut -d"," -f2 | cut -d":" -f2` on peut aussi récupérer les stats de traffic par device via la "MIB" lan mais elle est assez lourde donc je cherche un autre moyen. Manifestement il y a un event listener qui se trimbale dans le code et qui push les stats de traffic de chacun des devices mais je n'ai pas réussit à me brancher dessus. si quelqu'un sait, je suis preneur
  15. @oracle7 oui mais sysbus je ne l'ai que sous cygwin sur pc et je n'ai pas tous les autres librairies pour extraire le dm. pas envie non plus d'instaler sysbus sur le nas. tant pis. par contre tu m'as pas dit, les commandes tu veux ici ou tu préfères qu'elles alimentent ton thread?
  16. d'ac ! tu veux que je poste ici ou dans ton thread? c'est pas donnant-donnant mais je suis super preneur du data model que tu aurais réussis à extraire, car moi je n'ai les commandes que grâce à l'inspection des appels faits via l'interface (grace aux outils dev de chrome). @oracle7
  17. @.Shad. oui, rrd permet ça nativement avec un COUNTER (là c'est du GAUGE, mais un peut modifié). Les compteurs de la livebox sont cumulatifs (et se reset à 2^32), mais en fait je calcule moi-même le delta entre deux valeurs successives et c'est ça que j'affiche. Avoir la notion de volume n'est pas inutile. Je ferai sûrement à terme les mêmes graphs en bytes/s par la suite. Dans tous les cas même si c'était exprimé en débit ca ne changerait rien au profil et à la quantité de données échangées. Je vais faire qquess test pour comprendre d'où viennent ces valeurs. @oracle7 bonjour. oui sacré déterrage mais étant le posteur originel je me suis permis. Sacré boulot ton tuto! Je peux te donner les commandes (curl) sans soucis, mais suis pas sûr de comprendre ce que tu entends par dynamique.
  18. ca m'a couté qques apprentissages en shell, mais voilà la mesure du signal wifi du pc depuis lequel je rédige ce message. l'axe des ordonnées n'est que pour le snr car la puissance wifi se mesure en dbm < 0. j'ai pas trouvé mieux comme representation que de faire 100 - cette valeur et de le ploter ainsi donc ce sont les couleurs qui parlent. par contre je me demande si il n'y a pas un problème avec les stats de l'ONT: c'est pas très parlant car ce n'est pas en bytes/s mais en bytes (en fait en bytes/5min) mais quand même à ce rythme là je suis en train de me faire siphonner tous mon réseau ! Les stats des interfaces internes sont presque plates. Donc, ou je les mesure mal et je suis vraiment en train de me faire aspirer tout, ou bien le compteur de l'ONT est en vrac, ou bien les valeurs sont en bits et non bytes (malgré les variables qui s'appellent RxBytes et TxBytes). si des personnes sont intéressées je peux partager le script pour la livebox 5.
  19. Quand je vois les tutos sur le monitoring qu'il est possible de mettre en place sur les versions plus récentes des NAS, je me dis que ce thread ne doit plus intéresser grand monde 😑 Pas grave 😀 Comme je suis passé sur une Livebox5 j'ai commencé à mettre en place les scripts adaptés. Voilà les premiers graphs des interfaces (wifi = 2.4+5, 2.4GHZ, 5GHz et les deux ports phy 0 et 3). Prochaine étape: sortir les stats (traffic et qualité signal) par device. Par la suite je regarderai ce que je peux extraire du pont Philipps Hue.
  20. 14 ans depuis le premier message, pfiou ... Entre temps j'ai oublié mon mot de passe et ne sais même plus quelle adresse j'utilisais. Bon, j'ai redémarré un vieux DS107 et j'ai tenté d'y réinstaller cacti ... Long story short: cacti est à la version 1.2.19 et DSM 3.1-1639 (qui est le dernier DSM supporté sur une telle machine) ne permet d'installer que cacti 0.8.8h. Inutile de vous raconter mes déboires dans les détails. Pour faire court, la doc de cacti n'a pas été maintenue à jour et les "requirements" étaient donc trompeurs. A partir de la 1.0.0 il faut rrdtool >=1.3 et ipkg n'offre que 1.2. On peut quand même faire tourner cacti sur un tel système et je vous partage ici l'info même si je pense que ça ne servira pas à beaucoup de monde. Je pars d'un système vierge. DS107> cat /proc/version Linux version 2.4.22-uc0 (root@build1) (gcc version 3.3.4) #1639 Thu Sep 4 10:58:23 CST 2014 DS107> busybox BusyBox v1.16.1 (2014-09-04 11:03:48 CST) multi-call binary. DS107> /usr/syno/apache/bin/httpd -v Server version: Apache/2.2.16 (Unix) DS107> php -v PHP 5.3.3 (cli) (built: Sep 4 2014 11:11:01) DS107> perl -v This is perl, v5.8.6 built for POWERPC DS107> /usr/syno/mysql/libexec/mysqld -V /usr/syno/mysql/libexec/mysqld Ver 5.1.49 for unknown-linux-gnu on powerpc (Source distribution) Installation des programmes necessaires Avant toute chose il faut ipkg: DS107> cd /volume1/public/ DS107> wget http://ipkg.nslu2-linux.org/feeds/optware/ds101g/cross/stable/ds101-bootstrap_1.0-4_powerpc.xsh DS107> sh ds101-bootstrap_1.0-4_powerpc.xsh Une tentative de mise à jour des packages (ipkg update) risque de générer des erreurs, pour contrer cela, il faut instaler manuellement deux packages: DS107> wget http://ipkg.nslu2-linux.org/feeds/optware/ds101g/cross/stable/libidn_1.25-1_powerpc.ipk DS107> /opt/bin/ipkg install libidn_1.25-1_powerpc.ipk DS107> wget http://ipkg.nslu2-linux.org/feeds/optware/ds101g/cross/stable/wget-ssl_1.12-2_powerpc.ipk DS107> /opt/bin/ipkg install wget-ssl_1.12-2_powerpc.ipk puis mettre à jour ipkg et installer les deux packages necessaires à Cacti qui ne sont pas sur le syno: DS107> ipkg update DS107> ipkg install rrdtool DS107> ipkg install net-snmp Petite note en passant, l'installation d'ipkg modifie le $PATH, en y rajoutant des sous-chemins de /opt. Personnellement je préfère mettre ce rajout à la fin plutôt qu'au début afin que le syno cherche préférentiellement dans son arborescence plutôt que dans /opt DS107> vi /etc/profile Apache et PHP La configuration du serveur Apache (/usr/syno/apache/conf/httpd.conf-user) par défaut est la bonne. Il faut démarrer le serveur Apache dans l'interface d'administration du Syno et régler quelques paramètres de PHP. Notamment: - désactiver safe_mode_exec_dir - personnaliser open_basedir en y ajoutant "/opt/bin:/opt/share/rrdtool/fonts". Attention, ne pas oublier d'utiliser le séparateur ":" au début ou à la fin de cette chaine dépendant d'où vous l'inserez. - activer les extensions mysql et sockets. Il peut être necessaire aussi d'activer gd, ldap, pdo-mysql, mysqli, openssl, zlib. Ces extensions se sont avérées necessaires lors de ma tentative d'installation de Cacti 1.1.38 et je ne les ai pas désactivées lors de l'installation de Cacti 0.8.8h. Je ne sais donc pas dire si elles sont indispensables. Je ne sais pas non plus dire si certaines d'entre elles sont activées par défaut. Création d'un utilisateur et d'un groupe associés à Cacti Cette étape n'est pas requise, strictement. J'ai néanmoins créé un tel utilisateur pour cantonner le plus possible les choses. Si vous décidez de ne pas créer un tel utilisateur il faudra adapter les droits sur la base de donnée (voir plus loin) en fonction de vos choix. Via l'interface d'administration créer un groupe (à définir, ci-dessous référencé par nom-du-groupe-cacti) puis un utilisateur (à définir, ci-dessous référencé par nom-du-user-cacti) associés à Cacti. Définir cet utilisateur comme membre de ce groupe. Inutile de donner un quelconque droit à cet utilisateur sur les dossiers partagés ni sur les applications. Il faut ensuite affiner la création de ce nouveau compte. Note: je ne suis pas sûr de l'utilité absolue des actions décrites ci-après. Pour cela il faut tout d'abord récupérer le numéro de groupe de nom-du-groupe-cacti DS107> more /etc/group | grep nom-du-groupe-cacti On obtient une ligne ayant le format suivant: Ensuite, on va, d'un seul coup: * modifier le groupe par défaut de l'utilisateur nom-du-user-cacti . Le groupe par défaut de nom-du-user-cacti est 100 (users), on va le changer en numero-du-groupe * modifier le home de l'utilisateur nom-du-user-cacti . Le home par défaut est /var/services/homes/nom-du-user-cacti, on va le changer en /var/services/web/cacti Pour ces deux points, il faut modifier le fichier /etc/passwd DS107> vi /etc/passwd et changer la ligne suivante: en: Installation de Cacti Téléchargez le tar et placez le par exemple dans /volume1/public/ https://files.cacti.net/cacti/linux/cacti-0.8.8h.tar.gz Exécutez les commandes suivantes pour installer Cacti et paramétrer les droits sur certains répertoires. DS107> cd /volume1/public/ DS107> tar -zxvf cacti-0.8.8h.tar.gz DS107> mv cacti-0.8.8h cacti/ DS107> mv cacti /var/services/web/ DS107> cd /var/services/web DS107> chown root:root -R cacti DS107> chmod 755 cacti DS107> cd cacti DS107> find . -type f -exec chmod 644 '{}' \; DS107> find . -type d -exec chmod 755 '{}' \; DS107> chown -R nom-du-user-cacti:nom-du-groupe-cacti /var/services/web/cacti/rra /var/services/web/cacti/log DS107> chmod 666 /var/services/web/cacti/log/cacti.log Cette dernière commande permet une gestion (et notamment l'effacement) du fichier de log de Cacti, depuis l'interface de contrôle. Autrement l'utilisateur 'nobody' sous lequel tourne le serveur Apache ne dispose pas des droits pour effacer le fichier. MySQL Vérifiez que votre Syno a un nom d'hote défini: DS107> more /etc/hosts devrait indiquer un truc du genre: Si ce n'est pas le cas rajoutez la seconde ligne avec le nom d'hote de votre choix et son IP à la place de a.b.c.d. Vérifiez l'existence du nom d'hote dans mysql: DS107> cd /usr/syno/mysql/bin DS107> ./mysql -u root mysql> SELECT Host, User FROM mysql.user; mysql> exit Recherchez une ligne qui contient root dans la colonne User et quelque chose d'autre que localhost dans la colonne Host. Si ce n'est pas déjà fait, définissez un mot de passe pour root dans mysql (en changeant password ci dessous): DS107> cd /usr/syno/mysql/bin DS107> ./mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('password'); mysql> SET PASSWORD FOR 'root'@'nom-hote' = PASSWORD('password'); mysql> FLUSH PRIVILEGES; mysql> exit Créez une base de données, importez-y les tables de Cacti, définissez les privilèges: Remplacez nom-de-la-base, nom-du-user-cacti, nom-hote, et mot-de-passe, par ce que vous aurez choisi pour votre installation. J'ai utilisé le même mot de passe dans la base que celui associé au compte nom-du-user-cacti. DS107> cd /usr/syno/mysql/bin DS107> ./mysqladmin --user=root -p create nom-de-la-base-cacti DS107> cd /usr/syno/mysql/bin DS107> ./mysql -u root -p nom-de-la-base < /var/services/web/cacti/cacti.sql DS107> ./mysql -u root -p mysql> GRANT ALL PRIVILEGES ON nom-de-la-base.* TO 'nom-du-user-cacti'@'localhost' IDENTIFIED BY 'mot-de-passe'; mysql> GRANT ALL PRIVILEGES ON nom-de-la-base.* TO 'nom-du-user-cacti'@'nom-hote' IDENTIFIED BY 'mot-de-passe'; mysql> GRANT ALL PRIVILEGES ON nom-de-la-base.* TO 'root'@'localhost'; mysql> GRANT ALL PRIVILEGES ON nom-de-la-base.* TO 'root'@'nom-hote'; mysql> FLUSH PRIVILEGES; mysql> exit Configuration de Cacti avant lancement Editez le fichier de configuration de Cacti DS107> vi /var/services/web/cacti/include/config.php Il contient par défaut ces lignes: Adaptez les en fonction de votre installation. Vous devriez pouvoir laisser localhost, mais il est possible de le remplacer par nom-hote. Editez le fichier d'installation pour indiquer à Cacti où aller cercher certains binaires (ceux installés avec ipkg). DS107> vi /var/services/web/cacti/install/index.php Trouvez la variable suivante: et modifiez là en: Certains scripts de base sont sujets à poser quelques problèmes (php -q et grep -w ne seraient potentiellement pas supportés), il est donc conseillé de les éditer: DS107> cd /var/services/web/cacti/resource/script_queries DS107> cp host_cpu.xml host_cpu.xml.bck DS107> vi host_cpu.xml modifiez la ligne: en: DS107> cd /var/services/web/cacti/scripts DS107> cp linux_memory.pl linux_memory.pl.bck DS107> vi linux_memory.pl modifiez la ligne: en: Il y a aussi un script qui utilise l'option (ax) pas supportée sur BusyBox et le filtrage n'est pas non plus le bon : DS107> cd /var/services/web/cacti/scripts DS107> cp unix_processes.pl unix_processes.pl.bck DS107> vi unix_processes.pl modifier la ligne: en: Suite à cela, un test du poller ne devrait pas planter: DS107> /usr/bin/php /var/services/web/cacti/poller.php Pour finir, il faut que le poller tourne toutes les 5 minutes. DS107> cd /usr/syno/etc.defaults/rc.d DS107> ./S04crond.sh stop DS107> vi /etc/crontab rajoutez la ligne: redemarrez cron: DS107> ./S04crond.sh start C'est fini. Lancez un navigateur, allez à http://ip-du-syno/cacti/, suivez les étapes (pour se connecter la première fois il faut utiliser admin/admin, normalement).
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.