diff --git a/.gitignore b/.gitignore index 72364f9..84c3713 100644 --- a/.gitignore +++ b/.gitignore @@ -87,3 +87,6 @@ ENV/ # Rope project settings .ropeproject + +.credentials +.idea diff --git a/README.md b/README.md index 883e305..838fa7c 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ This is what I used, you can of course adapt the collector script to talk to inf First thing to do is to register an app, to generate a specific `freebox_app_token`. -Use the `freebox_register_app.py` script. +Run `python freebox_monitoring.py --register` to do that. *PS: You can modify the app name/versions etc as shown below (Optional)* @@ -45,7 +45,7 @@ Head to your Freebox Server device. Press the `>` to authorize the app registration process. -Be sure to save the `freebox_app_token` and `track_id` somewhere safe, you will need them to authenticate later on. +If you need to re-auth you can delete the authorization credentials by removing the file `.credentials` in the directory where `freebox_monitor.py` is. # Step 2: Use the script to display freebox statistics information @@ -55,13 +55,6 @@ Once you have your `freebox_app_token`, the process to authenticate happens in 2 (This avoids sending the token over the network) -Edit the `freebox_monitor.py` script and set your `freebox_app_token` and `track_id` (line 73-74) - -```python - freebox_app_token = "CHANGE_THIS" - track_id = "CHANGE_THIS" -``` - Then execute it, to make sure it connects and displays information. ![freebox monitor](freebox_monitor.png) diff --git a/freebox_monitor.py b/freebox_monitor.py index 32bfaf7..303f55f 100644 --- a/freebox_monitor.py +++ b/freebox_monitor.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # pylint: disable=C0103,C0111,W0621 - +from __future__ import print_function # # Freebox API SDK / Docs: http://dev.freebox.fr/sdk/os/login/ @@ -10,10 +10,15 @@ import os import json import hmac import time +import argparse +import ConfigParser +import sys from hashlib import sha1 import requests +VERSION = "0.4.3" + def get_challenge(freebox_app_id): api_url = 'http://mafreebox.freebox.fr/api/v3/login/authorize/%s' % freebox_app_id @@ -23,7 +28,8 @@ def get_challenge(freebox_app_id): if r.status_code == 200: return r.json() else: - print 'Failed request: %s\n' % r.text + print("Failed request: %s\n" % r.text) + def open_session(password, freebox_app_id): api_url = 'http://mafreebox.freebox.fr/api/v3/login/session/' @@ -39,8 +45,7 @@ def open_session(password, freebox_app_id): if r.status_code == 200: return r.json() else: - print 'Failed request: %s\n' % r.text - + print("Failed request: %s\n" % r.text) def get_connection_stats(headers): @@ -51,8 +56,7 @@ def get_connection_stats(headers): if r.status_code == 200: return r.json() else: - print 'Failed request: %s\n' % r.text - + print("Failed request: %s\n" % r.text) def get_ftth_status(headers): @@ -63,12 +67,10 @@ def get_ftth_status(headers): if r.status_code == 200: return r.json() else: - print 'Failed request: %s\n' % r.text + print('Failed request: %s\n' % r.text) -# Main -if __name__ == '__main__': - +def get_and_print_metrics(): freebox_app_id = "fr.freebox.seximonitor" freebox_app_token = "CHANGE_THIS" track_id = "CHANGE_THIS" @@ -115,10 +117,94 @@ if __name__ == '__main__': timestamp = int(time.time()) # Output the information - print "freebox.bytes_down %s %d" % (myData['bytes_down'], timestamp) - print "freebox.bytes_up %s %d" % (myData['bytes_up'], timestamp) - print "freebox.rate_down %s %d" % (myData['rate_down'], timestamp) - print "freebox.rate_up %s %d" % (myData['rate_up'], timestamp) - print "freebox.state %s %d" % (myData['state'], timestamp) - print "freebox.sfp_pwr_rx %s %d" % (myData['sfp_pwr_rx'], timestamp) - print "freebox.sfp_pwr_tx %s %d" % (myData['sfp_pwr_tx'], timestamp) + print("freebox.bytes_down %s %d" % (myData['bytes_down'], timestamp)) + print("freebox.bytes_up %s %d" % (myData['bytes_up'], timestamp)) + print("freebox.rate_down %s %d" % (myData['rate_down'], timestamp)) + print("freebox.rate_up %s %d" % (myData['rate_up'], timestamp)) + print("freebox.state %s %d" % (myData['state'], timestamp)) + print("freebox.sfp_pwr_rx %s %d" % (myData['sfp_pwr_rx'], timestamp)) + print("freebox.sfp_pwr_tx %s %d" % (myData['sfp_pwr_tx'], timestamp)) + + +def get_auth(): + script_dir = os.path.dirname(os.path.realpath(__file__)) + cfg_file = os.path.join(script_dir, ".credentials") + + f = ConfigParser.RawConfigParser() + f.read(cfg_file) + + try: + _ = f.get("general", "track_id") + _ = f.get("general", "app_token") + except ConfigParser.NoSectionError as err: + print("Config is invalid, auth not done.") + return None + + return {'track_id': f.get('general', 'track_id'), + 'app_token': f.get('general', 'app_token')} + + +def write_auth(auth_infos): + script_dir = os.path.dirname(os.path.realpath(__file__)) + cfg_file = os.path.join(script_dir, ".credentials") + f = ConfigParser.RawConfigParser() + f.add_section("general") + f.set("general", "track_id", auth_infos['track_id']) + f.set("general", "app_token", auth_infos["app_token"]) + with open(cfg_file, "wb") as authFile: + f.write(authFile) + + +def do_register(creds): + 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': 'fr.freebox.seximonitor', + 'app_name': 'SexiMonitor', + 'app_version': VERSION, + 'device_name': 'SexiServer' + } + json_payload = json.dumps(app_info) + + r = requests.post('http://mafreebox.freebox.fr/api/v3/login/authorize/', 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") + print(" track_id: %s" % creds["track_id"]) + print(" app_token: %s" % creds["app_token"]) + + +# Main +if __name__ == '__main__': + parser = argparse.ArgumentParser() + 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") + args = parser.parse_args() + + auth = get_auth() + + if args.register: + do_register(auth) + elif args.status: + register_status(auth) + else: + get_and_print_metrics() \ No newline at end of file diff --git a/freebox_register_app.py b/freebox_register_app.py deleted file mode 100644 index 478a497..0000000 --- a/freebox_register_app.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python -# pylint: disable=C0103,C0111 - -import json -import requests - -def get_authorization(): - api_url = 'http://mafreebox.freebox.fr/api/v3/login/authorize/' - headers = {'Content-type': 'application/json'} - app_info = { - 'app_id': 'fr.freebox.seximonitor', - 'app_name': 'SexiMonitor', - 'app_version': '0.4.2', - 'device_name': 'SexiServer' - } - json_payload = json.dumps(app_info) - - r = requests.post(api_url, headers=headers, data=json_payload) - - if r.status_code == 200: - return r.json() - else: - print 'Failed registration: %s\n' % r.text - -if __name__ == '__main__': - resp = get_authorization() - - print '[Track ID] {}'.format(resp['result']['track_id']) - print '[App token] {}'.format(resp['result']['app_token']) - print 'Press on the right arrow on the Freebox Server and validate the app registration'