Generate user agent based on PIO Core environment

This commit is contained in:
Ivan Kravets
2020-04-10 17:59:58 +03:00
parent 030ddf4ea1
commit ae57829190
6 changed files with 33 additions and 27 deletions

View File

@@ -15,6 +15,7 @@
import codecs import codecs
import hashlib import hashlib
import os import os
import platform
import uuid import uuid
from os import environ, getenv, listdir, remove from os import environ, getenv, listdir, remove
from os.path import dirname, isdir, isfile, join, realpath from os.path import dirname, isdir, isfile, join, realpath
@@ -22,7 +23,7 @@ from time import time
import requests 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.compat import WINDOWS, dump_json_to_unicode, hashlib_encode_data
from platformio.proc import is_ci from platformio.proc import is_ci
from platformio.project.helpers import ( from platformio.project.helpers import (
@@ -414,3 +415,14 @@ def get_cid():
if WINDOWS or os.getuid() > 0: # pylint: disable=no-member if WINDOWS or os.getuid() > 0: # pylint: disable=no-member
set_state_item("cid", cid) set_state_item("cid", cid)
return 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)

View File

@@ -19,7 +19,7 @@ from zipfile import ZipFile
import click import click
import requests import requests
from platformio import VERSION, __version__, app, exception, util from platformio import VERSION, __version__, app, exception
from platformio.compat import WINDOWS from platformio.compat import WINDOWS
from platformio.proc import exec_command, get_pythonexe_path from platformio.proc import exec_command, get_pythonexe_path
from platformio.project.helpers import get_project_cache_dir from platformio.project.helpers import get_project_cache_dir
@@ -133,7 +133,7 @@ def get_develop_latest_version():
r = requests.get( r = requests.get(
"https://raw.githubusercontent.com/platformio/platformio" "https://raw.githubusercontent.com/platformio/platformio"
"/develop/platformio/__init__.py", "/develop/platformio/__init__.py",
headers=util.get_request_defheaders(), headers={"User-Agent": app.get_user_agent()},
) )
r.raise_for_status() r.raise_for_status()
for line in r.text.split("\n"): for line in r.text.split("\n"):
@@ -153,7 +153,8 @@ def get_develop_latest_version():
def get_pypi_latest_version(): def get_pypi_latest_version():
r = requests.get( 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() r.raise_for_status()
return r.json()["info"]["version"] return r.json()["info"]["version"]

View File

@@ -23,7 +23,7 @@ from time import mktime
import click import click
import requests import requests
from platformio import util from platformio import app, util
from platformio.exception import ( from platformio.exception import (
FDSHASumMismatch, FDSHASumMismatch,
FDSizeMismatch, FDSizeMismatch,
@@ -38,7 +38,7 @@ class FileDownloader(object):
self._request = requests.get( self._request = requests.get(
url, url,
stream=True, stream=True,
headers=util.get_request_defheaders(), headers={"User-Agent": app.get_user_agent()},
verify=sys.version_info >= (2, 7, 9), verify=sys.version_info >= (2, 7, 9),
) )
if self._request.status_code != 200: if self._request.status_code != 200:

View File

@@ -53,7 +53,7 @@ class PackageRepoIterator(object):
def load_manifest(url): def load_manifest(url):
r = None r = None
try: 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() r.raise_for_status()
return r.json() return r.json()
except: # pylint: disable=bare-except except: # pylint: disable=bare-except

View File

@@ -13,8 +13,8 @@
# limitations under the License. # limitations under the License.
import atexit import atexit
import hashlib
import os import os
import platform
import re import re
import sys import sys
import threading import threading
@@ -27,8 +27,9 @@ import requests
from platformio import __version__, app, exception, util from platformio import __version__, app, exception, util
from platformio.commands import PlatformioCLI 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.proc import is_ci, is_container
from platformio.project.helpers import is_platformio_project
try: try:
import queue import queue
@@ -93,15 +94,7 @@ class MeasurementProtocol(TelemetryBase):
def _prefill_appinfo(self): def _prefill_appinfo(self):
self["av"] = __version__ self["av"] = __version__
self["an"] = app.get_user_agent()
# 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)
def _prefill_sysargs(self): def _prefill_sysargs(self):
args = [] args = []
@@ -127,7 +120,6 @@ class MeasurementProtocol(TelemetryBase):
caller_id = str(app.get_session_var("caller_id")) caller_id = str(app.get_session_var("caller_id"))
self["cd1"] = util.get_systype() self["cd1"] = util.get_systype()
self["cd2"] = "Python/%s %s" % (platform.python_version(), platform.platform())
self["cd4"] = ( self["cd4"] = (
1 if (not util.is_ci() and (caller_id or not is_container())) else 0 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( r = self._http_session.post(
"https://ssl.google-analytics.com/collect", "https://ssl.google-analytics.com/collect",
data=data, data=data,
headers=util.get_request_defheaders(), headers={"User-Agent": app.get_user_agent()},
timeout=1, timeout=1,
) )
r.raise_for_status() r.raise_for_status()
@@ -331,15 +323,20 @@ def measure_ci():
def encode_run_environment(options): def encode_run_environment(options):
non_sensative_keys = [ non_sensative_keys = [
"platform", "platform",
"platform_packages",
"framework", "framework",
"board", "board",
"upload_protocol", "upload_protocol",
"check_tool", "check_tool",
"debug_tool", "debug_tool",
"monitor_filters",
] ]
safe_options = [ safe_options = [
"%s=%s" % (k, v) for k, v in sorted(options.items()) if k in non_sensative_keys "%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) return "&".join(safe_options)

View File

@@ -270,11 +270,6 @@ def get_mdns_services():
return items 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") @memoized(expire="60s")
def _api_request_session(): def _api_request_session():
return requests.Session() return requests.Session()
@@ -284,18 +279,19 @@ def _api_request_session():
def _get_api_result( def _get_api_result(
url, params=None, data=None, auth=None # pylint: disable=too-many-branches 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 = {} result = {}
r = None r = None
verify_ssl = sys.version_info >= (2, 7, 9) verify_ssl = sys.version_info >= (2, 7, 9)
headers = get_request_defheaders()
if not url.startswith("http"): if not url.startswith("http"):
url = __apiurl__ + url url = __apiurl__ + url
if not get_setting("strict_ssl"): if not get_setting("strict_ssl"):
url = url.replace("https://", "http://") url = url.replace("https://", "http://")
headers = {"User-Agent": get_user_agent()}
try: try:
if data: if data:
r = _api_request_session().post( r = _api_request_session().post(