diff --git a/platformio/app.py b/platformio/app.py index f53b17d0..e32004ab 100644 --- a/platformio/app.py +++ b/platformio/app.py @@ -15,6 +15,7 @@ import codecs import hashlib import os +import platform import uuid from os import environ, getenv, listdir, remove from os.path import dirname, isdir, isfile, join, realpath @@ -22,7 +23,7 @@ from time import time import requests -from platformio import exception, fs, lockfile +from platformio import __version__, exception, fs, lockfile from platformio.compat import WINDOWS, dump_json_to_unicode, hashlib_encode_data from platformio.proc import is_ci from platformio.project.helpers import ( @@ -414,3 +415,14 @@ def get_cid(): if WINDOWS or os.getuid() > 0: # pylint: disable=no-member set_state_item("cid", cid) return cid + + +def get_user_agent(): + data = ["PlatformIO/%s" % __version__, "CI/%d" % int(is_ci())] + if get_session_var("caller_id"): + data.append("Caller/%s" % get_session_var("caller_id")) + if os.getenv("PLATFORMIO_IDE"): + data.append("IDE/%s" % os.getenv("PLATFORMIO_IDE")) + data.append("Python/%s" % platform.python_version()) + data.append("Platform/%s" % platform.platform()) + return " ".join(data) diff --git a/platformio/commands/upgrade.py b/platformio/commands/upgrade.py index 947b7a0b..6303ea69 100644 --- a/platformio/commands/upgrade.py +++ b/platformio/commands/upgrade.py @@ -19,7 +19,7 @@ from zipfile import ZipFile import click import requests -from platformio import VERSION, __version__, app, exception, util +from platformio import VERSION, __version__, app, exception from platformio.compat import WINDOWS from platformio.proc import exec_command, get_pythonexe_path from platformio.project.helpers import get_project_cache_dir @@ -133,7 +133,7 @@ def get_develop_latest_version(): r = requests.get( "https://raw.githubusercontent.com/platformio/platformio" "/develop/platformio/__init__.py", - headers=util.get_request_defheaders(), + headers={"User-Agent": app.get_user_agent()}, ) r.raise_for_status() for line in r.text.split("\n"): @@ -153,7 +153,8 @@ def get_develop_latest_version(): def get_pypi_latest_version(): r = requests.get( - "https://pypi.org/pypi/platformio/json", headers=util.get_request_defheaders() + "https://pypi.org/pypi/platformio/json", + headers={"User-Agent": app.get_user_agent()}, ) r.raise_for_status() return r.json()["info"]["version"] diff --git a/platformio/downloader.py b/platformio/downloader.py index c6ecda80..21f5477b 100644 --- a/platformio/downloader.py +++ b/platformio/downloader.py @@ -23,7 +23,7 @@ from time import mktime import click import requests -from platformio import util +from platformio import app, util from platformio.exception import ( FDSHASumMismatch, FDSizeMismatch, @@ -38,7 +38,7 @@ class FileDownloader(object): self._request = requests.get( url, stream=True, - headers=util.get_request_defheaders(), + headers={"User-Agent": app.get_user_agent()}, verify=sys.version_info >= (2, 7, 9), ) if self._request.status_code != 200: diff --git a/platformio/managers/package.py b/platformio/managers/package.py index d6481541..adb9dcb5 100644 --- a/platformio/managers/package.py +++ b/platformio/managers/package.py @@ -53,7 +53,7 @@ class PackageRepoIterator(object): def load_manifest(url): r = None try: - r = requests.get(url, headers=util.get_request_defheaders()) + r = requests.get(url, headers={"User-Agent": app.get_user_agent()}) r.raise_for_status() return r.json() except: # pylint: disable=bare-except diff --git a/platformio/telemetry.py b/platformio/telemetry.py index 54bd8c4b..1e12584d 100644 --- a/platformio/telemetry.py +++ b/platformio/telemetry.py @@ -13,8 +13,8 @@ # limitations under the License. import atexit +import hashlib import os -import platform import re import sys import threading @@ -27,8 +27,9 @@ import requests from platformio import __version__, app, exception, util from platformio.commands import PlatformioCLI -from platformio.compat import string_types +from platformio.compat import hashlib_encode_data, string_types from platformio.proc import is_ci, is_container +from platformio.project.helpers import is_platformio_project try: import queue @@ -93,15 +94,7 @@ class MeasurementProtocol(TelemetryBase): def _prefill_appinfo(self): self["av"] = __version__ - - # gather dependent packages - dpdata = [] - dpdata.append("PlatformIO/%s" % __version__) - if app.get_session_var("caller_id"): - dpdata.append("Caller/%s" % app.get_session_var("caller_id")) - if os.getenv("PLATFORMIO_IDE"): - dpdata.append("IDE/%s" % os.getenv("PLATFORMIO_IDE")) - self["an"] = " ".join(dpdata) + self["an"] = app.get_user_agent() def _prefill_sysargs(self): args = [] @@ -127,7 +120,6 @@ class MeasurementProtocol(TelemetryBase): caller_id = str(app.get_session_var("caller_id")) self["cd1"] = util.get_systype() - self["cd2"] = "Python/%s %s" % (platform.python_version(), platform.platform()) self["cd4"] = ( 1 if (not util.is_ci() and (caller_id or not is_container())) else 0 ) @@ -269,7 +261,7 @@ class MPDataPusher(object): r = self._http_session.post( "https://ssl.google-analytics.com/collect", data=data, - headers=util.get_request_defheaders(), + headers={"User-Agent": app.get_user_agent()}, timeout=1, ) r.raise_for_status() @@ -331,15 +323,20 @@ def measure_ci(): def encode_run_environment(options): non_sensative_keys = [ "platform", + "platform_packages", "framework", "board", "upload_protocol", "check_tool", "debug_tool", + "monitor_filters", ] safe_options = [ "%s=%s" % (k, v) for k, v in sorted(options.items()) if k in non_sensative_keys ] + if is_platformio_project(os.getcwd()): + phash = hashlib.sha1(hashlib_encode_data(app.get_cid())) + safe_options.append("pid=%s" % phash.hexdigest()) return "&".join(safe_options) diff --git a/platformio/util.py b/platformio/util.py index d35ce6a2..9cda5ebf 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -270,11 +270,6 @@ def get_mdns_services(): return items -def get_request_defheaders(): - data = (__version__, int(is_ci()), requests.utils.default_user_agent()) - return {"User-Agent": "PlatformIO/%s CI/%d %s" % data} - - @memoized(expire="60s") def _api_request_session(): return requests.Session() @@ -284,18 +279,19 @@ def _api_request_session(): def _get_api_result( url, params=None, data=None, auth=None # pylint: disable=too-many-branches ): - from platformio.app import get_setting # pylint: disable=import-outside-toplevel + # pylint: disable=import-outside-toplevel + from platformio.app import get_user_agent, get_setting result = {} r = None verify_ssl = sys.version_info >= (2, 7, 9) - headers = get_request_defheaders() if not url.startswith("http"): url = __apiurl__ + url if not get_setting("strict_ssl"): url = url.replace("https://", "http://") + headers = {"User-Agent": get_user_agent()} try: if data: r = _api_request_session().post(