diff --git a/freebox_monitor.py b/freebox_monitor.py index bacb1df..7d8a7c5 100644 --- a/freebox_monitor.py +++ b/freebox_monitor.py @@ -2,25 +2,23 @@ # pylint: disable=C0103,C0111,W0621 from __future__ import print_function -# -# Freebox API SDK / Docs: http://dev.freebox.fr/sdk/os/login/ -# - +import requests import os import json import hmac import time import argparse import sys +from hashlib import sha1 -if sys.version_info >= (3,0): +if sys.version_info >= (3, 0): import configparser as configp else: import ConfigParser as configp - -from hashlib import sha1 -import requests +# +# Freebox API SDK / Docs: http://dev.freebox.fr/sdk/os/login/ +# VERSION = "0.4.3" ENDPOINT = "http://mafreebox.freebox.fr/api/v3" @@ -144,116 +142,114 @@ def get_and_print_metrics(creds, s_switch, s_ports, s_sys): } # Setup hashtable for results - myData = {} + my_data = {} # Fetch connection stats - jsonRaw = get_connection_stats(headers) + json_raw = get_connection_stats(headers) # Generic datas, same for FFTH or xDSL - myData['bytes_down'] = jsonRaw['result']['bytes_down'] # total in bytes since last connection - myData['bytes_up'] = jsonRaw['result']['bytes_up'] + my_data['bytes_down'] = json_raw['result']['bytes_down'] # total in bytes since last connection + my_data['bytes_up'] = json_raw['result']['bytes_up'] - myData['rate_down'] = jsonRaw['result']['rate_down'] # current rate in byte/s - myData['rate_up'] = jsonRaw['result']['rate_up'] + my_data['rate_down'] = json_raw['result']['rate_down'] # current rate in byte/s + my_data['rate_up'] = json_raw['result']['rate_up'] - myData['bandwidth_down'] = jsonRaw['result']['bandwidth_down'] # available bw in bit/s - myData['bandwidth_up'] = jsonRaw['result']['bandwidth_up'] + my_data['bandwidth_down'] = json_raw['result']['bandwidth_down'] # available bw in bit/s + my_data['bandwidth_up'] = json_raw['result']['bandwidth_up'] - if jsonRaw['result']['state'] == "up": - myData['state'] = 1 + if json_raw['result']['state'] == "up": + my_data['state'] = 1 else: - myData['state'] = 0 + my_data['state'] = 0 # ffth for FFTH (default) # xdsl for xDSL - connection_media = jsonRaw['result']['media'] + connection_media = json_raw['result']['media'] ### # FFTH specific if connection_media == "ffth": - jsonRaw = get_ftth_status(headers) + json_raw = get_ftth_status(headers) - myData['sfp_pwr_rx'] = jsonRaw['result']['sfp_pwr_rx'] # scaled by 100 (in dBm) - myData['sfp_pwr_tx'] = jsonRaw['result']['sfp_pwr_tx'] + my_data['sfp_pwr_rx'] = json_raw['result']['sfp_pwr_rx'] # scaled by 100 (in dBm) + my_data['sfp_pwr_tx'] = json_raw['result']['sfp_pwr_tx'] ### # xDSL specific if connection_media == "xdsl": - jsonRaw = get_xdsl_status(headers) + json_raw = get_xdsl_status(headers) - myData['xdsl_uptime'] = jsonRaw['result']['status']['uptime'] # in seconds + my_data['xdsl_uptime'] = json_raw['result']['status']['uptime'] # in seconds - myData['xdsl_down_es'] = jsonRaw['result']['down']['es'] # increment - myData['xdsl_down_attn'] = jsonRaw['result']['down']['attn'] # in dB - myData['xdsl_down_snr'] = jsonRaw['result']['down']['snr'] # in dB - myData['xdsl_down_rate'] = jsonRaw['result']['down']['rate'] # ATM rate in kbit/s - myData['xdsl_down_hec'] = jsonRaw['result']['down']['hec'] # increment - myData['xdsl_down_crc'] = jsonRaw['result']['down']['crc'] # increment - myData['xdsl_down_ses'] = jsonRaw['result']['down']['ses'] # increment - myData['xdsl_down_fec'] = jsonRaw['result']['down']['fec'] # increment - myData['xdsl_down_maxrate'] = jsonRaw['result']['down']['maxrate'] # ATM max rate in kbit/s - myData['xdsl_down_rtx_tx'] = jsonRaw['result']['down']['rtx_tx'] # G.INP on/off - myData['xdsl_down_rtx_c'] = jsonRaw['result']['down']['rtx_c'] # G.INP corrected - myData['xdsl_down_rtx_uc'] = jsonRaw['result']['down']['rtx_uc'] # G.INP uncorrected - - myData['xdsl_up_es'] = jsonRaw['result']['up']['es'] - myData['xdsl_up_attn'] = jsonRaw['result']['up']['attn'] - myData['xdsl_up_snr'] = jsonRaw['result']['up']['snr'] - myData['xdsl_up_rate'] = jsonRaw['result']['up']['rate'] - myData['xdsl_up_hec'] = jsonRaw['result']['up']['hec'] - myData['xdsl_up_crc'] = jsonRaw['result']['up']['crc'] - myData['xdsl_up_ses'] = jsonRaw['result']['up']['ses'] - myData['xdsl_up_fec'] = jsonRaw['result']['up']['fec'] - myData['xdsl_up_maxrate'] = jsonRaw['result']['up']['maxrate'] - myData['xdsl_up_rtx_tx'] = jsonRaw['result']['up']['rtx_tx'] # G.INP on/off - myData['xdsl_up_rtx_c'] = jsonRaw['result']['up']['rtx_c'] # G.INP corrected - myData['xdsl_up_rtx_uc'] = jsonRaw['result']['up']['rtx_uc'] # G.INP uncorrected + my_data['xdsl_down_es'] = json_raw['result']['down']['es'] # increment + my_data['xdsl_down_attn'] = json_raw['result']['down']['attn'] # in dB + my_data['xdsl_down_snr'] = json_raw['result']['down']['snr'] # in dB + my_data['xdsl_down_rate'] = json_raw['result']['down']['rate'] # ATM rate in kbit/s + my_data['xdsl_down_hec'] = json_raw['result']['down']['hec'] # increment + my_data['xdsl_down_crc'] = json_raw['result']['down']['crc'] # increment + my_data['xdsl_down_ses'] = json_raw['result']['down']['ses'] # increment + my_data['xdsl_down_fec'] = json_raw['result']['down']['fec'] # increment + my_data['xdsl_down_maxrate'] = json_raw['result']['down']['maxrate'] # ATM max rate in kbit/s + my_data['xdsl_down_rtx_tx'] = json_raw['result']['down']['rtx_tx'] # G.INP on/off + my_data['xdsl_down_rtx_c'] = json_raw['result']['down']['rtx_c'] # G.INP corrected + my_data['xdsl_down_rtx_uc'] = json_raw['result']['down']['rtx_uc'] # G.INP uncorrected + my_data['xdsl_up_es'] = json_raw['result']['up']['es'] + my_data['xdsl_up_attn'] = json_raw['result']['up']['attn'] + my_data['xdsl_up_snr'] = json_raw['result']['up']['snr'] + my_data['xdsl_up_rate'] = json_raw['result']['up']['rate'] + my_data['xdsl_up_hec'] = json_raw['result']['up']['hec'] + my_data['xdsl_up_crc'] = json_raw['result']['up']['crc'] + my_data['xdsl_up_ses'] = json_raw['result']['up']['ses'] + my_data['xdsl_up_fec'] = json_raw['result']['up']['fec'] + my_data['xdsl_up_maxrate'] = json_raw['result']['up']['maxrate'] + my_data['xdsl_up_rtx_tx'] = json_raw['result']['up']['rtx_tx'] # G.INP on/off + my_data['xdsl_up_rtx_c'] = json_raw['result']['up']['rtx_c'] # G.INP corrected + my_data['xdsl_up_rtx_uc'] = json_raw['result']['up']['rtx_uc'] # G.INP uncorrected ## # General infos if s_sys: - sysJsonRaw = get_system_config(headers) - myData['sys_fan_rpm'] = sysJsonRaw['result']['fan_rpm'] # rpm - myData['sys_temp_sw'] = sysJsonRaw['result']['temp_sw'] # Temp Switch, degree Celcius - myData['sys_uptime'] = sysJsonRaw['result']['uptime_val'] # Uptime, in seconds - myData['sys_temp_cpub'] = sysJsonRaw['result']['temp_cpub'] # Temp CPU Broadcom, degree Celcius - myData['sys_temp_cpum'] = sysJsonRaw['result']['temp_cpum'] # Temp CPU Marvell, degree Celcius - + sys_json_raw = get_system_config(headers) + my_data['sys_fan_rpm'] = sys_json_raw['result']['fan_rpm'] # rpm + my_data['sys_temp_sw'] = sys_json_raw['result']['temp_sw'] # Temp Switch, degree Celcius + my_data['sys_uptime'] = sys_json_raw['result']['uptime_val'] # Uptime, in seconds + my_data['sys_temp_cpub'] = sys_json_raw['result']['temp_cpub'] # Temp CPU Broadcom, degree Celcius + my_data['sys_temp_cpum'] = sys_json_raw['result']['temp_cpum'] # Temp CPU Marvell, degree Celcius ## # Switch status if s_switch: - switchJsonRaw = get_switch_status(headers) - for i in switchJsonRaw['result']: + switch_json_raw = get_switch_status(headers) + for i in switch_json_raw['result']: # 0 down, 1 up - myData['switch_%s_link' % i['id']] = 0 if i['link'] == "down" else 1 + my_data['switch_%s_link' % i['id']] = 0 if i['link'] == "down" else 1 # 0 auto, 1 10Base-T, 2 100Base-T, 3 1000Base-T # In fact the duplex is appended like 10BaseT-HD, 1000BaseT-FD, 1000BaseT-FD # So juse is an "in" because duplex isn't really usefull if "10BaseT" in i['mode']: - myData['switch_%s_mode' % i['id']] = 1 + my_data['switch_%s_mode' % i['id']] = 1 elif "100BaseT" in i['mode']: - myData['switch_%s_mode' % i['id']] = 2 + my_data['switch_%s_mode' % i['id']] = 2 elif "1000BaseT" in i['mode']: - myData['switch_%s_mode' % i['id']] = 3 + my_data['switch_%s_mode' % i['id']] = 3 else: - myData['switch_%s_mode' % i['id']] = 0 # auto + my_data['switch_%s_mode' % i['id']] = 0 # auto ## # Switch ports status if s_ports: - for i in [1,2,3,4]: - switchPortStats = get_switch_port_stats(headers, i) - myData['switch_%s_rx_bytes_rate' % i] = switchPortStats['result']['rx_bytes_rate'] # bytes/s (?) - myData['switch_%s_tx_bytes_rate' % i] = switchPortStats['result']['tx_bytes_rate'] + for i in [1, 2, 3, 4]: + switch_port_stats = get_switch_port_stats(headers, i) + my_data['switch_%s_rx_bytes_rate' % i] = switch_port_stats['result']['rx_bytes_rate'] # bytes/s (?) + my_data['switch_%s_tx_bytes_rate' % i] = switch_port_stats['result']['tx_bytes_rate'] # Prepping Graphite Data format timestamp = int(time.time()) # Output the information - for i in myData: - print("freebox.%s %s %d" % (i, myData[i], timestamp)) + for i in my_data: + print("freebox.%s %s %d" % (i, my_data[i], timestamp)) def get_auth(): @@ -266,7 +262,7 @@ def get_auth(): try: _ = f.get("general", "track_id") _ = f.get("general", "app_token") - except configp.NoSectionError as err: + except configp.NoSectionError: print("Config is invalid, auth not done.") return None @@ -329,9 +325,20 @@ if __name__ == '__main__': parser.add_argument('-r', '--register', action='store_true', help="Register app with Freebox API") parser.add_argument('-s', '--register-status', dest='status', action='store_true', help="Get register status") - 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('-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") args = parser.parse_args() auth = get_auth() @@ -341,4 +348,4 @@ if __name__ == '__main__': elif args.status: register_status(auth) else: - get_and_print_metrics(auth, args.status_switch, args.status_ports, args.status_sys) \ No newline at end of file + get_and_print_metrics(auth, args.status_switch, args.status_ports, args.status_sys)