[3.15] gh-151929: Get boot ID, machine ID and uptime in test.pythoninfo (GH-152127) (#152134)

gh-151929: Get boot ID, machine ID and uptime in test.pythoninfo (GH-152127)
(cherry picked from commit 3db3bba4d1)


GHA: Run test.pythoninfo on the "Cross build Linux" job.

Co-authored-by: Victor Stinner <vstinner@python.org>
This commit is contained in:
Miss Islington (bot) 2026-06-25 02:00:32 +02:00 committed by GitHub
parent ab8434a3dc
commit 7d5e2dd398
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 59 additions and 8 deletions

View file

@ -648,6 +648,9 @@ jobs:
run: ./configure --prefix="$BUILD_DIR/cross-python" --with-build-python="$BUILD_DIR/host-python/bin/python3"
- name: Install cross Python
run: make -j8 install
- name: Display build info
run: |
"$BUILD_DIR/cross-python/bin/python3" -m test.pythoninfo
- name: Run test subset with host build
run: |
"$BUILD_DIR/cross-python/bin/python3" -m test test_sysconfig test_site test_embed

View file

@ -16,6 +16,15 @@ def normalize_text(text):
return text.strip()
def read_first_line(filename):
# Get the first line of a text file and strip trailing spaces
try:
with open(filename, encoding="utf-8") as fp:
return fp.readline().rstrip()
except OSError:
return ''
class PythonInfo:
def __init__(self):
self.info = {}
@ -1015,14 +1024,9 @@ def collect_fips(info_add):
if _hashlib is not None:
call_func(info_add, 'fips.openssl_fips_mode', _hashlib, 'get_fips_mode')
try:
with open("/proc/sys/crypto/fips_enabled", encoding="utf-8") as fp:
line = fp.readline().rstrip()
if line:
info_add('fips.linux_crypto_fips_enabled', line)
except OSError:
pass
fips_enabled = read_first_line("/proc/sys/crypto/fips_enabled")
if fips_enabled:
info_add('fips.linux_crypto_fips_enabled', fips_enabled)
def collect_tempfile(info_add):
@ -1040,6 +1044,49 @@ def collect_libregrtest_utils(info_add):
info_add('libregrtests.build_info', ' '.join(utils.get_build_info()))
def linux_get_uptime():
# Use CLOCK_BOOTTIME if available
import time
try:
return time.clock_gettime(time.CLOCK_BOOTTIME)
except (AttributeError, OSError):
pass
# Otherwise, parse the first member of /proc/uptime
uptime = read_first_line("/proc/uptime")
if not uptime:
return
try:
parts = uptime.split()
if not parts:
return
return float(parts[0])
except ValueError:
return
def collect_linux(info_add):
boot_id = read_first_line("/proc/sys/kernel/random/boot_id")
if boot_id:
info_add('linux.boot_id', boot_id)
# https://www.freedesktop.org/software/systemd/man/latest/machine-id.html
machine_id = read_first_line("/etc/machine-id")
if machine_id:
info_add('linux.machine_id', machine_id)
uptime = linux_get_uptime()
if uptime is not None:
# truncate microseconds
uptime = int(uptime)
try:
import datetime
uptime = str(datetime.timedelta(seconds=uptime))
except ImportError:
uptime = f'{uptime} sec'
info_add('linux.uptime', uptime)
def collect_info(info):
error = False
info_add = info.add
@ -1081,6 +1128,7 @@ def collect_info(info):
collect_zlib,
collect_zstd,
collect_libregrtest_utils,
collect_linux,
# Collecting from tests should be last as they have side effects.
collect_test_socket,