Files
freebox-exporter-telegraf/freebox-monit.py

1100 lines
54 KiB
Python
Executable File

#!/usr/bin/python3
#-*- coding: utf-8 -*-
# coding: utf-8
# pylint: disable=C0103,C0111,W0621
from __future__ import print_function
from __future__ import unicode_literals
import requests
import os
import json
import hmac
import time
import argparse
import sys
import time
from time import strftime, gmtime
from datetime import datetime
from hashlib import sha1
# To install the latest version of Unidecode from the Python package index, use these commands:
# $ pip install unidecode
from unidecode import unidecode
#
if sys.version_info >= (3, 0):
import configparser as configp
else:
import ConfigParser as configp
#
# Freebox API SDK / Docs: http://dev.freebox.fr/sdk/os/login/
# version 8
#
VERSION = "0.6.1 2021/04/27"
# version 059
# prise en compte api v8 (option -H en particulier)
# meilleure prise en compte des autres plateforme que Fbox Rev.
# avec en particulier meilleur traitement des listes de paramètres.
# version 060
# le Rasp Pi vu sans nom depuis le DHCP freebox n'apparait pas dans la liste des hotes !
# verifier ce qui se passe si on a l'addr MAC mais pas de nom
# => aller prendre les données DHCP statiques et dynamiques
# version 061
# prise en compte de l agregation xdsl / lte
# prise en compte corrections xdsl en cas de connexion state=down
# prise en compte test présence disk
def get_creation_date(file):
stat = os.stat(file)
return stat.st_mtime
def get_challenge(freebox_app_id):
api_url = '%s/login/authorize/%s' % (ENDPOINT, freebox_app_id)
r = requests.get(api_url)
if r.status_code == 200:
return r.json()
else:
print("Failed request: %s\n" % r.text)
def open_session(password, freebox_app_id):
api_url = '%s/login/session/' % ENDPOINT
app_info = {
'app_id': freebox_app_id,
'password': password
}
json_payload = json.dumps(app_info)
r = requests.post(api_url, data=json_payload)
if r.status_code == 200:
return r.json()
else:
print("Failed request: %s\n" % r.text)
def get_internal_disk_stats(headers):
api_url = '%s/storage/disk/' % ENDPOINT
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print("Failed request: %s\n" % r.text)
def get_connection_stats(headers):
api_url = '%s/connection/' % ENDPOINT
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print("Failed request: %s\n" % r.text)
def get_ftth_status(headers):
api_url = '%s/connection/ftth/' % ENDPOINT
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_xdsl_status(headers):
api_url = '%s/connection/xdsl/' % ENDPOINT
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_lteconfig_status(headers):
api_url = '%s/connection/lte/config' % ENDPOINT
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_cnx_status(headers):
api_url = '%s/connection/' % ENDPOINT
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_system_config(headers):
api_url = '%s/system/' % ENDPOINT
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_switch_status(headers):
api_url = '%s/switch/status/' % ENDPOINT
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_switch_port_stats(headers, port):
# -P => update pour avec POP
api_url = '%s/switch/port/%s/stats/' % (ENDPOINT, port)
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_lan_config(headers):
api_url = '%s/lan/config/' % ENDPOINT
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_wifi_stats(headers, num):
api_url = '%s/wifi/ap/%s/stations' % (ENDPOINT, num)
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_wifi_statsx(headers):
api_url = '%s/wifi/ap/' % (ENDPOINT)
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_lan_interfaces(headers):
api_url = '%s/lan/browser/interfaces/' % ENDPOINT
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_interfaces_hosts(headers, interf):
api_url = '%s/lan/browser/%s/' % (ENDPOINT, interf)
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_static_dhcp(headers):
api_url = '%s/dhcp/static_lease/' % ENDPOINT
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_dynamic_dhcp(headers):
api_url = '%s/dhcp/dynamic_lease/' % ENDPOINT
r = requests.get(api_url, headers=headers)
if r.status_code == 200:
return r.json()
else:
print('Failed request: %s\n' % r.text)
def get_and_print_metrics(creds, s_switch, s_ports, s_sys, s_disk, s_lan, s_wifi, s_lan_interfaces, s_interfaces_hosts, s_static_dhcp, s_dynamic_dhcp, s_xdsl_tunnel):
#freebox_app_id = "fr.freebox.seximonitor"
#freebox_app_id = "fr.freebox.grafanamonitor"
freebox_app_id = creds['app_id']
#
# setup output dataformat, default Graphite
# tag for influxdb
# regle de nommage : mettre les informations (rx, tx, port 1, ...) dans les tags.
# ne mettre que des noms de valeurs de variables generiques : bytes, bits, rate, bandwidth, firmware .....
# les tags sont la pour donnner le contexte
# cela permettra des tris et regroupements plus complets sous grafana
# 3 tags séparé par des "."
# chaque valeur aura donc un nom de la forme : tag1.tag2.tag3.valeur
#
tag1=tag2=tag3=""
dataformat='influxdb'
# Fetch challenge
resp = get_challenge(creds['track_id'])
challenge = resp['result']['challenge']
# Generate session password
if sys.version_info >= (3, 0):
h = hmac.new(bytearray(creds['app_token'], 'ASCII'), bytearray(challenge, 'ASCII'), sha1)
else:
h = hmac.new(creds['app_token'], challenge, sha1)
password = h.hexdigest()
# Fetch session_token
resp = open_session(password, freebox_app_id)
session_token = resp['result']['session_token']
# Setup headers with the generated session_token
headers = {
'X-Fbx-App-Auth': session_token
}
# Setup hashtable for results
my_data = {}
# Fetch connection stats
json_raw = get_connection_stats(headers)
#Additionnal informations when state is down
connection_media = ""
if 'result' in json_raw:
if 'state' in json_raw['result']:
if json_raw['result']['state'] == 'down':
json_raw['result']['ipv4'] = 'None'
json_raw['result']['ipv6'] = 'None'
json_raw['result']['ipv4_port_range'] = [0,0]
connection_media = 'None'
# fbx telegraf docker info
tag1="python"
tag2="version"
tag3="NULL"
my_data[tag1+"."+tag2+"."+tag3+"."+'version_script'] = VERSION
tag2="fichier"
my_data[tag1+"."+tag2+"."+tag3+"."+'nom_fichier'] = __file__
tag2="derniere modification"
# Convertir Timestamp en datetime
update_date = datetime.fromtimestamp(get_creation_date(__file__))
update_str = datetime.ctime(update_date)
my_data[tag1+"."+tag2+"."+tag3+"."+'last_updated'] = update_str
# Generic datas, same for FFTH or xDSL
# ffth for FFTH (default)
# xdsl for xDSL, with or without 4G
if connection_media != 'None' :
connection_media = json_raw['result']['media']
tag1="box"
if 'result' in json_raw:
tag3 = "NULL"
tag2 = "down"
my_data[tag1+"."+tag2+"."+tag3+"."+'bytes'] = json_raw['result']['bytes_down'] # total in bytes since last connection
my_data[tag1+"."+tag2+"."+tag3+"."+'rate'] = json_raw['result']['rate_down'] # current rate in byte/s
my_data[tag1+"."+tag2+"."+tag3+"."+'bandwidth'] = json_raw['result']['bandwidth_down'] # available bw in bit/s
my_data[tag1+"."+tag2+"."+tag3+"."+'bytes'] = json_raw['result']['bytes_down']
tag2 = "up"
my_data[tag1+"."+tag2+"."+tag3+"."+'bytes'] = json_raw['result']['bytes_up']
my_data[tag1+"."+tag2+"."+tag3+"."+'rate'] = json_raw['result']['rate_up']
my_data[tag1+"."+tag2+"."+tag3+"."+'bandwidth'] = json_raw['result']['bandwidth_up']
my_data[tag1+"."+tag2+"."+tag3+"."+'bytes'] = json_raw['result']['bytes_up']
tag2 = "NULL"
my_data[tag1+"."+tag2+"."+tag3+"."+'media'] = connection_media
my_data[tag1+"."+tag2+"."+tag3+"."+'ipv4'] = json_raw['result']['ipv4']
my_data[tag1+"."+tag2+"."+tag3+"."+'ipv6'] = json_raw['result']['ipv6']
tag2 = "ip_port_range"
my_data[tag1+"."+tag2+"."+tag3+"."+'ipv4_port_range_low'] = json_raw['result']['ipv4_port_range'][0]
my_data[tag1+"."+tag2+"."+tag3+"."+'ipv4_port_range_up'] = json_raw['result']['ipv4_port_range'][1]
tag2 = "state"
my_data[tag1+"."+tag2+"."+tag3+"."+'cnx_state'] = json_raw['result']['state']
cnx_status = get_cnx_status(headers)
# FTTH specific
if connection_media == "ftth":
json_raw = get_ftth_status(headers)
if 'result' in json_raw:
tag1="box"
tag2="signal"
tag3 = "NULL"
my_data[tag1+"."+tag2+"."+tag3+"."+'sfp_has_signal'] = json_raw['result']['sfp_has_signal'] # BrW : cet attribu est bien présent: boolean
# xDSL specific (galm : ajout condition state=up)
if connection_media == "xdsl" and json_raw['result']['state'] == 'up':
json_raw = get_xdsl_status(headers)
tag1="box"
tag2="xDSL"
tag3 = "NULL"
if 'result' in json_raw:
my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_modulation'] = json_raw['result']['status']['modulation'] + " ("+json_raw['result']['status']['protocol']+")" # in seconds
my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_uptime'] = json_raw['result']['status']['uptime'] # in seconds
my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_status_string'] = json_raw['result']['status']['status']
if json_raw['result']['status']['status'] == "down": # unsynchronized
my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_status'] = 0
elif json_raw['result']['status']['status'] == "training": # synchronizing step 1/4
my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_status'] = 1
elif json_raw['result']['status']['status'] == "started": # synchronizing step 2/4
my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_status'] = 2
elif json_raw['result']['status']['status'] == "chan_analysis": # synchronizing step 3/4
my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_status'] = 3
elif json_raw['result']['status']['status'] == "msg_exchange": # synchronizing step 4/4
my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_status'] = 4
elif json_raw['result']['status']['status'] == "showtime": # ready
my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_status'] = 5
elif json_raw['result']['status']['status'] == "disabled": # disabled
my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_status'] = 6
else: # unknown
my_data['xdsl_status'] = 999
if 'es' in json_raw['result']['down']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_down_es'] = json_raw['result']['down']['es'] # increment
if 'attn' in json_raw['result']['down']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_down_attn'] = json_raw['result']['down']['attn'] # in dB
if 'snr' in json_raw['result']['down']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_down_snr'] = json_raw['result']['down']['snr'] # in dB
if 'rate' in json_raw['result']['down']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_down_rate'] = json_raw['result']['down']['rate'] # ATM rate in kbit/s
if 'hec' in json_raw['result']['down']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_down_hec'] = json_raw['result']['down']['hec'] # increment
if 'crc' in json_raw['result']['down']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_down_crc'] = json_raw['result']['down']['crc'] # increment
if 'ses' in json_raw['result']['down']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_down_ses'] = json_raw['result']['down']['ses'] # increment
if 'fec' in json_raw['result']['down']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_down_fec'] = json_raw['result']['down']['fec'] # increment
if 'maxrate' in json_raw['result']['down']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_down_maxrate'] = json_raw['result']['down']['maxrate'] # ATM max rate in kbit/s
if 'rtx_tx' in json_raw['result']['down']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_down_rtx_tx'] = json_raw['result']['down']['rtx_tx'] # G.INP on/off
if 'rtx_c' in json_raw['result']['down']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_down_rtx_c'] = json_raw['result']['down']['rtx_c'] # G.INP corrected
if 'rtx_uc' in json_raw['result']['down']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_down_rtx_uc'] = json_raw['result']['down']['rtx_uc'] # G.INP uncorrected
if 'es' in json_raw['result']['up']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_up_es'] = json_raw['result']['up']['es']
if 'attn' in json_raw['result']['up']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_up_attn'] = json_raw['result']['up']['attn']
if 'snr' in json_raw['result']['up']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_up_snr'] = json_raw['result']['up']['snr']
if 'rate' in json_raw['result']['up']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_up_rate'] = json_raw['result']['up']['rate']
if 'hec' in json_raw['result']['up']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_up_hec'] = json_raw['result']['up']['hec']
if 'crc' in json_raw['result']['up']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_up_crc'] = json_raw['result']['up']['crc']
if 'ses' in json_raw['result']['up']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_up_ses'] = json_raw['result']['up']['ses']
if 'fec' in json_raw['result']['up']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_up_fec'] = json_raw['result']['up']['fec']
if 'maxrate' in json_raw['result']['up']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_up_maxrate'] = json_raw['result']['up']['maxrate']
if 'rtx_tx' in json_raw['result']['up']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_up_rtx_tx'] = json_raw['result']['up']['rtx_tx']
if 'rtx_c' in json_raw['result']['up']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_up_rtx_c'] = json_raw['result']['up']['rtx_c'] # G.INP corrected
if 'rtx_uc' in json_raw['result']['up']: my_data[tag1+"."+tag2+"."+tag3+"."+'xdsl_up_rtx_uc'] = json_raw['result']['up']['rtx_uc'] # G.INP uncorrected
# -4 4G lte xdsl tunnel
if s_xdsl_tunnel and connection_media == "xdsl" :
json_raw2 = get_lteconfig_status(headers)
tag1="4G_lte"
tag2="NULL"
tag3="NULL"
if 'result' in json_raw2:
if 'antenna' in json_raw2['result']: my_data[tag1+"."+tag2+"."+tag3+"."+'antenna_']=json_raw2['result']['antenna']
if 'enabled' in json_raw2['result']: my_data[tag1+"."+tag2+"."+tag3+"."+'enabled_']=json_raw2['result']['enabled']
if 'fsm_state' in json_raw2['result']: my_data[tag1+"."+tag2+"."+tag3+"."+'fsm_state_']=json_raw2['result']['fsm_state']
if 'has_external_antennas' in json_raw2['result']: my_data[tag1+"."+tag2+"."+tag3+"."+'has_external_antennas_']=json_raw2['result']['has_external_antennas']
if 'state' in json_raw2['result']: my_data[tag1+"."+tag2+"."+tag3+"."+'state']=json_raw2['result']['state']
if 'network' in json_raw2['result']:
tag2="network"
if 'has_ipv4' in json_raw2['result']['network']: my_data[tag1+"."+tag2+"."+tag3+"."+'network_has_ipv4']=json_raw2['result']['network']['has_ipv4']
if 'has_ipv6' in json_raw2['result']['network']: my_data[tag1+"."+tag2+"."+tag3+"."+'network_has_ipv6']=json_raw2['result']['network']['has_ipv6']
if 'ipv4' in json_raw2['result']['network']: my_data[tag1+"."+tag2+"."+tag3+"."+'network_ipv4']=json_raw2['result']['network']['ipv4']
if 'ipv4_dns' in json_raw2['result']['network']: my_data[tag1+"."+tag2+"."+tag3+"."+'network_ipv4_dns']=json_raw2['result']['network']['ipv4_dns']
if 'ipv4_netmask' in json_raw2['result']['network']: my_data[tag1+"."+tag2+"."+tag3+"."+'network_ipv4_netmask']=json_raw2['result']['network']['ipv4_netmask']
if 'ipv6' in json_raw2['result']['network']: my_data[tag1+"."+tag2+"."+tag3+"."+'network_ipv6']=json_raw2['result']['network']['ipv6']
if 'ipv6_dns' in json_raw2['result']['network']: my_data[tag1+"."+tag2+"."+tag3+"."+'network_ipv6_dns']=json_raw2['result']['network']['ipv6_dns']
if 'ipv6_netmask' in json_raw2['result']['network']: my_data[tag1+"."+tag2+"."+tag3+"."+'network_ipv6_netmask']=json_raw2['result']['network']['ipv6_netmask']
if 'pdn_up' in json_raw2['result']['network']: my_data[tag1+"."+tag2+"."+tag3+"."+'network_pdn_up']=json_raw2['result']['network']['pdn_up']
if 'radio' in json_raw2['result']:
tag2="radio"
if 'associated' in json_raw2['result']['radio']: my_data[tag1+"."+tag2+"."+tag3+"."+'radio_associated']=json_raw2['result']['radio']['associated']
if 'bands' in json_raw2['result']['radio']: # liste
l=len(json_raw2['result']['radio']['bands'])
i=0
while i<l:
tag3=("Band#%s" % i)
if 'band' in json_raw2['result']['radio']['bands'][i]: my_data[tag1+"."+tag2+"."+tag3+"."+'radio_bands_band']=json_raw2['result']['radio']['bands'][i]['band']
if 'bandwidth' in json_raw2['result']['radio']['bands'][i]: my_data[tag1+"."+tag2+"."+tag3+"."+'radio_bands_bandwidth']=json_raw2['result']['radio']['bands'][i]['bandwidth']
if 'enabled' in json_raw2['result']['radio']['bands'][i]: my_data[tag1+"."+tag2+"."+tag3+"."+'radio_bands_enabled']=json_raw2['result']['radio']['bands'][i]['enabled']
if 'pci' in json_raw2['result']['radio']['bands'][i]: my_data[tag1+"."+tag2+"."+tag3+"."+'radio_bands_pci']=json_raw2['result']['radio']['bands'][i]['pci']
if 'rsrp' in json_raw2['result']['radio']['bands'][i]: my_data[tag1+"."+tag2+"."+tag3+"."+'radio_bands_rsrp']=json_raw2['result']['radio']['bands'][i]['rsrp']
if 'rsrq' in json_raw2['result']['radio']['bands'][i]: my_data[tag1+"."+tag2+"."+tag3+"."+'radio_bands_rsrq']=json_raw2['result']['radio']['bands'][i]['rsrq']
if 'rssi' in json_raw2['result']['radio']['bands'][i]: my_data[tag1+"."+tag2+"."+tag3+"."+'radio_bands_rssi']=json_raw2['result']['radio']['bands'][i]['rssi']
i=i+1
if 'sim' in json_raw2['result']:
tag2="sim"
tag3="NULL"
if 'iccid' in json_raw2['result']['sim']: my_data[tag1+"."+tag2+"."+tag3+"."+'sim_iccid']=json_raw2['result']['sim']['iccid']
if 'pin_locked' in json_raw2['result']['sim']: my_data[tag1+"."+tag2+"."+tag3+"."+'sim_pin_locked']=json_raw2['result']['sim']['pin_locked']
if 'pin_remaining' in json_raw2['result']['sim']: my_data[tag1+"."+tag2+"."+tag3+"."+'sim_pin_remaining']=json_raw2['result']['sim']['pin_remaining']
if 'present' in json_raw2['result']['sim']: my_data[tag1+"."+tag2+"."+tag3+"."+'sim_present']=json_raw2['result']['sim']['present']
if 'puk_locked' in json_raw2['result']['sim']: my_data[tag1+"."+tag2+"."+tag3+"."+'sim_puk_locked']=json_raw2['result']['sim']['puk_locked']
if 'puk_remaining' in json_raw2['result']['sim']: my_data[tag1+"."+tag2+"."+tag3+"."+'sim_puk_remaining']=json_raw2['result']['sim']['puk_remaining']
if 'tunnel' in json_raw2['result']:
tag2="tunnel"
if 'lte' in json_raw2['result']['tunnel']:
tag3="lte"
if 'connected' in json_raw2['result']['tunnel']['lte']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_lte_connected']=json_raw2['result']['tunnel']['lte']['connected']
if 'last_error' in json_raw2['result']['tunnel']['lte']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_lte_last_error']=json_raw2['result']['tunnel']['lte']['last_error']
if 'rx_flows_rate' in json_raw2['result']['tunnel']['lte']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_lte_rx_flows_rate']=json_raw2['result']['tunnel']['lte']['rx_flows_rate']
if 'rx_max_rate' in json_raw2['result']['tunnel']['lte']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_lte_rx_max_rate']=json_raw2['result']['tunnel']['lte']['rx_max_rate']
if 'rx_used_rate' in json_raw2['result']['tunnel']['lte']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_lte_rx_used_rate']=json_raw2['result']['tunnel']['lte']['rx_used_rate']
if 'tx_flows_rate' in json_raw2['result']['tunnel']['lte']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_lte_tx_flows_rate']=json_raw2['result']['tunnel']['lte']['tx_flows_rate']
if 'tx_max_rate' in json_raw2['result']['tunnel']['lte']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_lte_tx_max_rate']=json_raw2['result']['tunnel']['lte']['tx_max_rate']
if 'tx_used_rate' in json_raw2['result']['tunnel']['lte']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_lte_tx_used_rate']=json_raw2['result']['tunnel']['lte']['tx_used_rate']
if 'xdsl' in json_raw2['result']['tunnel']:
tag3="xdsl"
if 'connected' in json_raw2['result']['tunnel']['xdsl']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_xdsl_connected']=json_raw2['result']['tunnel']['xdsl']['connected']
if 'last_error' in json_raw2['result']['tunnel']['xdsl']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_xdsl_last_error']=json_raw2['result']['tunnel']['xdsl']['last_error']
if 'rx_flows_rate' in json_raw2['result']['tunnel']['xdsl']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_xdsl_rx_flows_rate']=json_raw2['result']['tunnel']['xdsl']['rx_flows_rate']
if 'rx_max_rate' in json_raw2['result']['tunnel']['xdsl']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_xdsl_rx_max_rate']=json_raw2['result']['tunnel']['xdsl']['rx_max_rate']
if 'rx_used_rate' in json_raw2['result']['tunnel']['xdsl']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_xdsl_rx_used_rate']=json_raw2['result']['tunnel']['xdsl']['rx_used_rate']
if 'tx_flows_rate' in json_raw2['result']['tunnel']['xdsl']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_xdsl_tx_flows_rate']=json_raw2['result']['tunnel']['xdsl']['tx_flows_rate']
if 'tx_max_rate' in json_raw2['result']['tunnel']['xdsl']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_xdsl_tx_max_rate']=json_raw2['result']['tunnel']['xdsl']['tx_max_rate']
if 'tx_used_rate' in json_raw2['result']['tunnel']['xdsl']: my_data[tag1+"."+tag2+"."+tag3+"."+'tunnel_xdsl_tx_used_rate']=json_raw2['result']['tunnel']['xdsl']['tx_used_rate']
# -Y static dhcp
if s_static_dhcp:
sys_json_raw = get_static_dhcp(headers)
tag1="static"
tag2="NULL"
tag3="NULL"
if 'result' in sys_json_raw:
l=len(sys_json_raw['result'])
i=0
while i<l:
tag2=("DHCP_S#%s" % i)
tag3="NULL"
if sys_json_raw['result'][i]['mac'] == sys_json_raw['result'][i]['hostname'] :
tag3=sys_json_raw['result'][i]['mac']
my_data[tag1+"."+tag2+"."+tag3+"."+'mac']=tag3
my_data[tag1+"."+tag2+"."+tag3+"."+'comment']=sys_json_raw['result'][i]['comment']
my_data[tag1+"."+tag2+"."+tag3+"."+'id']=sys_json_raw['result'][i]['id']
my_data[tag1+"."+tag2+"."+tag3+"."+'ip_static']=sys_json_raw['result'][i]['ip']
i=i+1
# -Z dynamic
if s_dynamic_dhcp:
sys_json_raw = get_dynamic_dhcp(headers)
tag1="actif"
tag2="NULL"
tag3="NULL"
if 'result' in sys_json_raw:
l=len(sys_json_raw['result'])
i=0
while i<l:
tag2=("DHCP_D#%s" % i)
tag3="NULL"
if sys_json_raw['result'][i]['mac'] == sys_json_raw['result'][i]['hostname'] :
tag3=sys_json_raw['result'][i]['mac']
my_data[tag1+"."+tag2+"."+tag3+"."+'mac']=tag3
my_data[tag1+"."+tag2+"."+tag3+"."+'is_static']=sys_json_raw['result'][i]['is_static']
my_data[tag1+"."+tag2+"."+tag3+"."+'ip_dyn']=sys_json_raw['result'][i]['ip']
my_data[tag1+"."+tag2+"."+tag3+"."+'lease_remaining']=sys_json_raw['result'][i]['lease_remaining']
my_data[tag1+"."+tag2+"."+tag3+"."+'assign_time']=sys_json_raw['result'][i]['assign_time']
my_data[tag1+"."+tag2+"."+tag3+"."+'refresh_time']=sys_json_raw['result'][i]['refresh_time']
i=i+1
# option -L
#
if s_lan:
sys_json_raw = get_lan_config(headers)
tag1="Lan Config"
tag2="NULL"
tag3="NULL"
if 'result' in sys_json_raw:
if 'mode' in sys_json_raw['result']:my_data[tag1+"."+tag2+"."+tag3+"."+'lan_mode'] = sys_json_raw['result']['mode']
if 'ip' in sys_json_raw['result']:my_data[tag1+"."+tag2+"."+tag3+"."+'lan_ip'] = sys_json_raw['result']['ip']
if 'name' in sys_json_raw['result']:my_data[tag1+"."+tag2+"."+tag3+"."+'lan_name'] = sys_json_raw['result']['name']
if 'name_dns' in sys_json_raw['result']:my_data[tag1+"."+tag2+"."+tag3+"."+'lan_name_dns'] = sys_json_raw['result']['name_dns']
if 'name_mdns' in sys_json_raw['result']:my_data[tag1+"."+tag2+"."+tag3+"."+'lan_name_mdns'] = sys_json_raw['result']['name_mdns']
if 'name_netbios' in sys_json_raw['result']:my_data[tag1+"."+tag2+"."+tag3+"."+'lan_name_netbios'] = sys_json_raw['result']['name_netbios']
#
# option -I
#
if s_lan_interfaces:
sys_json_raw = get_lan_interfaces(headers)
tag1="Interfaces"
tag2="NULL"
tag3="NULL"
if 'result' in sys_json_raw:
l=len(sys_json_raw['result'])
i=0
while i<l:
tag2=("if#%s" % i)
my_data[tag1+"."+tag2+"."+tag3+"."+'name']=sys_json_raw['result'][i]['name']
my_data[tag1+"."+tag2+"."+tag3+"."+'host_count']=sys_json_raw['result'][i]['host_count']
i=i+1
#
# liste des stations -X
# API V8
if s_interfaces_hosts:
# API V8
# chercher la liste des interfaces
sys_json_raw = get_lan_interfaces(headers)
if 'result' in sys_json_raw:
l=len(sys_json_raw['result'])
listeinterfaces=[]
interf_objet = sys_json_raw['result']
for intobject in interf_objet :
listeinterfaces.append(intobject['name'])
for interface in listeinterfaces :
sys_json_raw = get_interfaces_hosts(headers, interface)
if 'result' in sys_json_raw:
l=len(sys_json_raw['result'])
tag1="hosts_list"
k=0
while k<l :
tag2=interface
tag3="NULL"
if 'l3connectivities' in sys_json_raw['result'][k]:
length_l3_conn = len(sys_json_raw['result'][k]['l3connectivities'])
j=0
while j<length_l3_conn :
if sys_json_raw['result'][k]['l3connectivities'][j]['addr'] != "" :
if 'id' in sys_json_raw['result'][k]['l2ident']:
tag3=sys_json_raw['result'][k]['l2ident']['id']
if sys_json_raw['result'][k]['l3connectivities'][j]['af']=="ipv4":
my_data[tag1+"."+tag2+"."+tag3+"."+'addr']=sys_json_raw['result'][k]['l3connectivities'][j]['addr']
my_data[tag1+"."+tag2+"."+tag3+"."+'last_activity']=datetime.fromtimestamp(sys_json_raw['result'][k]['l3connectivities'][j]['last_activity']).strftime("%c")
if 'primary_name' in sys_json_raw['result'][k]:my_data[tag1+"."+tag2+"."+tag3+"."+'primary_name']=sys_json_raw['result'][k]['primary_name']
if 'host_type' in sys_json_raw['result'][k]:my_data[tag1+"."+tag2+"."+tag3+"."+'host_type']=sys_json_raw['result'][k]['host_type']
if 'active' in sys_json_raw['result'][k]:my_data[tag1+"."+tag2+"."+tag3+"."+'active']=sys_json_raw['result'][k]['active']
j=j+1
k=k+1
#
# option -H
# updated for V8
if s_sys:
sys_json_raw = get_system_config(headers)
tag1="System"
tag2="NULL"
tag3="NULL"
if 'result' in sys_json_raw:
if 'uptime_val' in sys_json_raw['result']:my_data[tag1+"."+tag2+"."+tag3+"."+'sys_uptime_val'] = sys_json_raw['result']['uptime_val'] # Uptime, in seconds
if 'uptime' in sys_json_raw['result']:my_data[tag1+"."+tag2+"."+tag3+"."+'uptime'] = sys_json_raw['result']['uptime'] # uptime in readable format ?
if 'firmware_version' in sys_json_raw['result']:my_data[tag1+"."+tag2+"."+tag3+"."+'firmware_version'] = sys_json_raw['result']['firmware_version'] # Firmware version
if 'board_name' in sys_json_raw['result']:my_data[tag1+"."+tag2+"."+tag3+"."+'board_name'] = sys_json_raw['result']['board_name']
if 'disk_status' in sys_json_raw['result']:my_data[tag1+"."+tag2+"."+tag3+"."+'disk_status'] = sys_json_raw['result']['disk_status']
if 'user_main_storage' in sys_json_raw['result']:my_data[tag1+"."+tag2+"."+tag3+"."+'user_main_storage'] = sys_json_raw['result']['user_main_storage']
if 'mac' in sys_json_raw['result']:
if 'model_info' in sys_json_raw['result']:
if 'has_ext_telephony' in sys_json_raw['result']['model_info']:my_data[tag1+"."+tag2+"."+tag3+"."+'has_ext_telephony'] = sys_json_raw['result']['model_info']['has_ext_telephony']
if 'has_ext_telephony' in sys_json_raw['result']['model_info']:my_data[tag1+"."+tag2+"."+tag3+"."+'has_ext_telephony'] = sys_json_raw['result']['model_info']['has_ext_telephony']
if 'has_speakers_jack' in sys_json_raw['result']['model_info']:my_data[tag1+"."+tag2+"."+tag3+"."+'has_speakers_jack'] = sys_json_raw['result']['model_info']['has_speakers_jack']
if 'wifi_type' in sys_json_raw['result']['model_info']:my_data[tag1+"."+tag2+"."+tag3+"."+'wifi_type'] = sys_json_raw['result']['model_info']['wifi_type']
if 'pretty_name' in sys_json_raw['result']['model_info']:my_data[tag1+"."+tag2+"."+tag3+"."+'pretty_name'] = sys_json_raw['result']['model_info']['pretty_name']
if 'customer_hdd_slots' in sys_json_raw['result']['model_info']:my_data[tag1+"."+tag2+"."+tag3+"."+'customer_hdd_slots'] = sys_json_raw['result']['model_info']['customer_hdd_slots']
if 'name' in sys_json_raw['result']['model_info']:my_data[tag1+"."+tag2+"."+tag3+"."+'name'] = sys_json_raw['result']['model_info']['name']
if 'has_speakers' in sys_json_raw['result']['model_info']:my_data[tag1+"."+tag2+"."+tag3+"."+'has_speakers'] = sys_json_raw['result']['model_info']['has_speakers']
if 'internal_hdd_size' in sys_json_raw['result']['model_info']:my_data[tag1+"."+tag2+"."+tag3+"."+'internal_hdd_size'] = sys_json_raw['result']['model_info']['internal_hdd_size']
if 'has_femtocell_exp' in sys_json_raw['result']['model_info']:my_data[tag1+"."+tag2+"."+tag3+"."+'has_femtocell_exp'] = sys_json_raw['result']['model_info']['has_femtocell_exp']
if 'has_internal_hdd' in sys_json_raw['result']['model_info']:my_data[tag1+"."+tag2+"."+tag3+"."+'has_internal_hdd'] = sys_json_raw['result']['model_info']['has_internal_hdd']
if 'has_dect' in sys_json_raw['result']['model_info']:my_data[tag1+"."+tag2+"."+tag3+"."+'has_dect'] = sys_json_raw['result']['model_info']['has_dect']
if 'fans' in sys_json_raw['result']: # c'est une liste
i=1
for fan_object in sys_json_raw['result']['fans']:
tag2 = "Fan"
my_data[tag1+"."+tag2+"."+tag3+"."+'id'] = fan_object['id']
my_data[tag1+"."+tag2+"."+tag3+"."+'name'] = fan_object['name']
my_data[tag1+"."+tag2+"."+tag3+"."+'value'] = fan_object['value']
i=i+1
if 'sensors' in sys_json_raw['result']: # c'est une liste
i=1
for sensor_object in sys_json_raw['result']['sensors']:
tag2 = "Sensor"
tag3 = sensor_object['id']
my_data[tag1+"."+tag2+"."+tag3+"."+'id'] = sensor_object['id']
my_data[tag1+"."+tag2+"."+tag3+"."+'name'] = sensor_object['name']
my_data[tag1+"."+tag2+"."+tag3+"."+'value'] = sensor_object['value']
i=i+1
#
# option -S
if s_switch:
switch_json_raw = get_switch_status(headers)
tag1="Switch"
tag2="NULL"
tag3="NULL"
if 'result' in switch_json_raw:
for i in switch_json_raw['result']:
# 0 down, 1 up
tag2="link#"+str(i['id'])
if i['link'] == "up" : my_data[tag1+"."+tag2+"."+tag3+"."+'Etat'] = 1
else: my_data[tag1+"."+tag2+"."+tag3+"."+'Etat'] = 0
# 0 auto, 1 10Base-T, 2 100Base-T, 3 1000Base-T
# Fbox POP : ?? pour port#3 2.5G ??
# In fact the duplex is appended like 10BaseT-HD, 1000BaseT-FD, 1000BaseT-FD
# So just is an "in" because duplex isn't really usefull
if "10BaseT" in i['mode']:
my_data[tag1+"."+tag2+"."+tag3+"."+'mode'] = 1
elif "100BaseT" in i['mode']:
my_data[tag1+"."+tag2+"."+tag3+"."+'mode'] = 2
elif "1000BaseT" in i['mode']:
my_data[tag1+"."+tag2+"."+tag3+"."+'mode'] = 3
else:
my_data[tag1+"."+tag2+"."+tag3+"."+'mode'] = 0 # auto
#
# Option -P
# Switch ports status
if s_ports:
tag1="Ports"
tag2="NULL"
tag3="NULL"
switch_json_raw = get_switch_status(headers)
listeid=[]
if 'result' in switch_json_raw:
for i in switch_json_raw['result']:
listeid.append(i['id'])
for i in listeid :
switch_port_stats = get_switch_port_stats(headers, i)
tag1="Port#"+str(i)
tag2="Rx"
my_data[tag1+"."+tag2+"."+tag3+"."+'bytes_rate'] = switch_port_stats['result']['rx_bytes_rate'] # bytes/s (?)
# my_data[tag1+"."+tag2+"."+tag3+"."+'bytes'] = switch_port_stats['result']['rx_bytes'] # pas de rx_bytes dans l'api !
tag2="Tx"
my_data[tag1+"."+tag2+"."+tag3+"."+'bytes_rate'] = switch_port_stats['result']['tx_bytes_rate']
my_data[tag1+"."+tag2+"."+tag3+"."+'bytes'] = switch_port_stats['result']['tx_bytes']
#
# Option -D
# updated for V8 (liste de disque)
# Fetch internal disk stats
if s_disk:
json_raw = get_internal_disk_stats(headers)
tag1="Disque"
tag2="NULL"
tag3="NULL"
if json_raw['success'] :
i=1
if 'result' in json_raw: # verifier la presence de 'result' car sur Fbox Mini4K pas de disque
for disk_object in json_raw['result']:
tag2 = "dd-" + str(i)
if 'idle_duration' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'idle_duration'] = disk_object['idle_duration']
if 'read_error_requests' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'read_error_requests'] = disk_object['read_error_requests']
if 'read_requests' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'read_requests'] = disk_object['read_requests']
if 'spinning' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'spinning'] = disk_object['spinning']
if 'table_type' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'table_type'] = disk_object['table_type']
if 'firmware' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'firmware'] = disk_object['firmware']
if 'type' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'type'] = disk_object['type']
if 'idle' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'idle'] = disk_object['idle']
if 'connector' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'connector'] = disk_object['connector']
if 'id' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'dd_id'] = disk_object['id']
if 'write_error_requests' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'write_error_requests'] = disk_object['write_error_requests']
if 'state' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'state'] = disk_object['state']
if 'write_requests' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'write_requests'] = disk_object['write_requests']
if 'total_bytes' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'total_bytes'] = disk_object['total_bytes']
if 'model' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'model'] = disk_object['model']
if 'active_duration' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'active_duration'] = disk_object['active_duration']
if 'temp' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'temp'] = disk_object['temp']
if 'serial' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'serial'] = disk_object['serial']
if 'id' in disk_object:my_data[tag1+"."+tag2+"."+tag3+"."+'disk_id'] = disk_object['id']
# partitions :
#
if disk_object['partitions'] :
j=1
for partition in disk_object['partitions'] :
tag3="Part-"+str(j)
my_data[tag1+"."+tag2+"."+tag3+"."+'partition#'] = j
if 'fstype' in partition : my_data[tag1+"."+tag2+"."+tag3+"."+'fstype'] = partition['fstype']
if 'disk_id' in partition : my_data[tag1+"."+tag2+"."+tag3+"."+'part_disk_id'] = partition['disk_id']
if 'total_bytes' in partition : my_data[tag1+"."+tag2+"."+tag3+"."+'total_bytes'] = partition['total_bytes']
if 'free_bytes' in partition : my_data[tag1+"."+tag2+"."+tag3+"."+'free_bytes'] = partition['free_bytes']
if 'used_bytes' in partition : my_data[tag1+"."+tag2+"."+tag3+"."+'used_bytes'] = partition['used_bytes']
if 'label' in partition : my_data[tag1+"."+tag2+"."+tag3+"."+'label'] = partition['label']
if 'id' in partition : my_data[tag1+"."+tag2+"."+tag3+"."+'part_id'] = partition['id']
if 'disk_id' in partition : my_data[tag1+"."+tag2+"."+tag3+"."+'part_disk_id'] = partition['disk_id']
j=j+1
i=i+1
#
# Option -W
# update for V8, prise en compte de la liste des AP.
# Wifi stats
#
if s_wifi:
sys_json_raw1 = get_wifi_statsx(headers)
if sys_json_raw1['success'] :
apwifilist = sys_json_raw1['result']
for ap in apwifilist :
sys_json_raw = get_wifi_stats(headers, ap['id'])
if 'result' in sys_json_raw:
l=len(sys_json_raw['result'])
tag1="wifi_list"
tag2=ap['name']
# verifier qu'il n'y a pas de "." dans tag2 ! on les supprime
j=0
tagtemp = list(tag2)
while j < len(tagtemp):
if tagtemp[j] == ".":
tagtemp[j] = ""
j=j+1
tag2 = "".join(tagtemp)
tag3="NULL"
k=0
while k<l :
if 'mac' in sys_json_raw['result'][k]:
tag3=sys_json_raw['result'][k]['mac']
if 'host' in sys_json_raw['result'][k]:
length_l3_conn = len(sys_json_raw['result'][k]['host']['l3connectivities'])
if 'primary_name' in sys_json_raw['result'][k]['host']:
if sys_json_raw['result'][k]['host']['primary_name'] != "" :
if 'interface' in sys_json_raw['result'][k]['host']:
if sys_json_raw['result'][k]['host']['interface'] != "" :
m=0
while m < length_l3_conn :
if sys_json_raw['result'][k]['host']['l3connectivities'][m]['af'] == "ipv4":
my_data[tag1+"."+tag2+"."+tag3+"."+'primary_name']=sys_json_raw['result'][k]['host']['primary_name']
my_data[tag1+"."+tag2+"."+tag3+"."+'host_type']=sys_json_raw['result'][k]['host']['host_type']
my_data[tag1+"."+tag2+"."+tag3+"."+'interface']=sys_json_raw['result'][k]['host']['interface']
my_data[tag1+"."+tag2+"."+tag3+"."+'addripv4']=sys_json_raw['result'][k]['host']['l3connectivities'][m]['addr']
my_data[tag1+"."+tag2+"."+tag3+"."+'reachable']=sys_json_raw['result'][k]['host']['l3connectivities'][m]['reachable']
my_data[tag1+"."+tag2+"."+tag3+"."+'active']=sys_json_raw['result'][k]['host']['l3connectivities'][m]['active']
# tx/rx bytes
my_data[tag1+"."+tag2+"."+tag3+"."+'rx_bytes']=sys_json_raw['result'][k]['rx_bytes']
my_data[tag1+"."+tag2+"."+tag3+"."+'rx_rate']=sys_json_raw['result'][k]['rx_rate']
my_data[tag1+"."+tag2+"."+tag3+"."+'tx_bytes']=sys_json_raw['result'][k]['tx_bytes']
my_data[tag1+"."+tag2+"."+tag3+"."+'tx_rate']=sys_json_raw['result'][k]['tx_rate']
lasttimeactivity=sys_json_raw['result'][k]['host']['l3connectivities'][m]['last_activity']
date_last_activity=datetime.fromtimestamp(lasttimeactivity)
my_data[tag1+"."+tag2+"."+tag3+"."+'last_activity_date']=date_last_activity.strftime("%c")
my_data[tag1+"."+tag2+"."+tag3+"."+'AP_ref']=ap['id']
m=m+1
k=k+1
########################################################################################################################################################
# Switching between outputs formats
# c'est args.format qu'il faut utiliser, et non pas args.data_format.
# if args.format == 'influxdb':
if dataformat == 'influxdb' :
# Prepping Influxdb Data format
timestamp = int(time.time()) * 1000000
# Output the information
if tag1 == "": tag1="test-tag1"
if tag2 == "": tag2="test-tag2"
if tag3 == "": tag2="test-tag3"
#
# extraire les 3 tags
#
# positions des 3 "." points séparateurs de tags
for i in my_data:
pos=[0,0,0]
j=0
k=0
while j < len(i):
if i[j] == ".":
pos[k]=j
k=k+1
j=j+1
tag1=i[0:pos[0]]
tag2=i[pos[0]+1:pos[1]]
tag3=i[pos[1]+1:pos[2]]
#
# supprimer les blancs " " dans les tags par des "-"
#
tag1=tag1.replace(" ","-")
tag2=tag2.replace(" ","-")
tag3=tag3.replace(" ","-")
if type(my_data[i]) == str:
# et dans le print on enlève les 3 tags de la partie my_data
# on va de pos[2]+1 à la fin de i
# je rajoute la suppression des accents
my_data[i] = unidecode(my_data[i])
print("freebox,endpoint=%s,tag1=%s,tag2=%s,tag3=%s %s=\"%s\"" % (args.Endpoint,tag1,tag2,tag3, i[pos[2]+1:], my_data[i]))
else:
print("freebox,endpoint=%s,tag1=%s,tag2=%s,tag3=%s %s=%s" % (args.Endpoint,tag1,tag2,tag3, i[pos[2]+1:], my_data[i]))
else:
# Prepping Graphite Data format
timestamp = int(time.time())
# Output the information
for i in my_data:
print("freebox.%s %s %d" % (i, my_data[i], timestamp))
def get_auth():
script_dir = os.path.dirname(os.path.realpath(__file__))
cfg_file = os.path.join(script_dir, ".credentials")
ret_args={}
f = configp.RawConfigParser()
f.read(cfg_file)
try:
_ = f.has_section(args.Endpoint)
ret_args.update(track_id= f.get(args.Endpoint, "track_id"))
ret_args.update(app_token= f.get(args.Endpoint, "app_token"))
if f.has_option(args.Endpoint, "app_id"):
ret_args.update(app_id= f.get(args.Endpoint, "app_id"))
else:
ret_args.update(app_id= app_id)
if f.has_option(args.Endpoint, "app_name"):
ret_args.update(app_name= f.get(args.Endpoint, "app_name"))
else:
ret_args.update(app_name= app_name)
if f.has_option(args.Endpoint, "device_name"):
ret_args.update(device_name= f.get(args.Endpoint, "device_name"))
else:
ret_args.update(device_name= device_name)
except configp.NoSectionError:
if args.register:
return None
else:
exit();
return ret_args
def write_auth(auth_infos):
script_dir = os.path.dirname(os.path.realpath(__file__))
cfg_file = os.path.join(script_dir, ".credentials")
f = configp.RawConfigParser()
f.add_section(args.Endpoint)
f.set(args.Endpoint, "track_id", auth_infos['track_id'])
f.set(args.Endpoint, "app_token", auth_infos["app_token"])
f.set(args.Endpoint, "app_id", app_id)
f.set(args.Endpoint, "app_name", app_name)
f.set(args.Endpoint, "device_name", device_name)
# with open(cfg_file, "ab") as authFile:
with open(cfg_file, "a") as authFile:
f.write(authFile)
def do_register(creds):
#global app_id,app_name,device_name
if creds is not None:
if 'track_id' in creds and 'app_token' in creds:
print("Already registered, exiting")
return
print("Doing registration")
headers = {'Content-type': 'application/json'}
app_info = {
'app_id': app_id,
'app_name': app_name,
'app_version': VERSION,
'device_name': device_name
}
json_payload = json.dumps(app_info)
r = requests.post('%s/login/authorize/' % ENDPOINT, headers=headers, data=json_payload)
register_infos = None
if r.status_code == 200:
register_infos = r.json()
else:
print('Failed registration: %s\n' % r.text)
write_auth(register_infos['result'])
print("Don't forget to accept auth on the Freebox panel !")
def register_status(creds):
if not creds:
print("Status: invalid config, auth not done.")
print("Please run `%s --register` to register app." % sys.argv[0])
return
print("Status: auth already done")
# Main
if __name__ == '__main__':
app_id='fr.freebox.grafanamonitor'
app_name='GrafanaMonitor'
device_name='GrafanServer'
parser = argparse.ArgumentParser(add_help=False)
#helpgroup = parser.add_argument_group()
parser.add_argument("-h", "--help", action="help", help="show this help message and exit")
parser.add_argument('-s', '--register-status', dest='status', action='store_true', help="Get register status")
parser.add_argument('-r', '--register', action='store_true', help="Register app with Freebox API")
parser.add_argument('-n', '--appname',
dest='app_name',
metavar='app_name',
help="Register with app_name")
parser.add_argument('-i', '--appid',
dest='app_id',
metavar='app_id',
help="Register with app_id")
parser.add_argument('-d', '--devicename',
dest='device_name',
metavar='device_name',
help="Register with device_name")
parser.add_argument('-f', '--format',
dest='format',
metavar='format',
default='graphite',
help="Specify output format between graphite and influxdb")
parser.add_argument('-e', '--endpoint',
dest='Endpoint',
metavar='endpoint',
default='mafreebox.freebox.fr',
help="Specify endpoint name or address")
parser.add_argument('-S', '--status-switch',
dest='status_switch',
action='store_true',
help="Get and show switch status")
parser.add_argument('-P', '--status-ports',
dest='status_ports',
action='store_true',
help="Get and show switch ports stats")
parser.add_argument('-H', '--status-sys',
dest='status_sys',
action='store_true',
help="Get and show system status")
parser.add_argument('-D', '--internal-disk-usage',
dest='disk_usage',
action='store_true',
help="Get and show internal disk usage")
parser.add_argument('-L', '--lan-config',
dest='lan_config',
action='store_true',
help="Get and show LAN config")
parser.add_argument('-W', '--wifi-usage',
dest='wifi_usage',
action='store_true',
help="Get and show wifi usage")
parser.add_argument('-I', '--lan-interfaces',
dest='lan_interfaces',
action='store_true',
help="Get and show lan interfaces")
parser.add_argument('-X', '--interfaces-hosts',
dest='interfaces_hosts',
action='store_true',
help="Get and show interfaces hosts")
parser.add_argument('-Y', '--static-dhcp',
dest='static_dhcp',
action='store_true',
help="Get and show static dhcp")
parser.add_argument('-Z', '--dynamic-dhcp',
dest='dynamic_dhcp',
action='store_true',
help="Get and show dynamic dhcp")
parser.add_argument('-4', '--xdsl_tunnel',
dest='xdsl_tunnel',
action='store_true',
help="Get and show 4G/lte xdsl aggregation counters")
args = parser.parse_args()
if args.app_id is not None:
app_id=args.app_id
if args.app_name is not None:
app_name=args.app_name
if args.device_name is not None:
device_name=args.device_name
ENDPOINT="http://"+args.Endpoint+"/api/v8/"
auth = get_auth()
if args.register:
do_register(auth)
elif args.status:
register_status(auth)
else:
get_and_print_metrics(auth, args.status_switch, args.status_ports, args.status_sys, args.disk_usage, args.lan_config, args.wifi_usage, args.lan_interfaces, args.interfaces_hosts, args.static_dhcp, args.dynamic_dhcp, args.xdsl_tunnel)