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 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)

View File

@ -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"]

View File

@ -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:

View File

@ -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

View File

@ -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)

View File

@ -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(