anaconda/anaconda-40.22.3.13/pyanaconda/core/product.py
2024-11-14 21:39:56 -08:00

116 lines
3.8 KiB
Python

#
# Copyright (C) 2023 Red Hat, Inc.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions of
# the GNU General Public License v.2, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY expressed or implied, including the implied warranties of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details. You should have received a copy of the
# GNU General Public License along with this program; if not, write to the
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
# source code or documentation are not subject to the GNU General Public
# License and may only be used or replicated with the express permission of
# Red Hat, Inc.
#
import os
import configparser
from functools import cache
from collections import namedtuple
ProductData = namedtuple("ProductData", [
"is_final_release",
"name",
"version",
"short_name",
])
def trim_product_version_for_ui(version):
"""Trim off parts of version that should not be displayed in UI.
Example: 8.0.1 -> 8.0
:param str version: Version as read from the system
:return str: Shortened version
"""
if version.count('.') >= 2:
version = '.'.join(version.split('.')[:2])
# Correctly report Rawhide
if version == "development":
version = "rawhide"
return version
def shorten_product_name(long_name):
"""Shorten a product name.
This is used in device names. eg. "fedora", "rhel".
:param str long_name: Name of the product, as read from the system
:return str: Short name for the product
"""
product_short_name = long_name.lower() # pylint: disable=no-member
if long_name.count(" "): # pylint: disable=no-member
product_short_name = ''.join(s[0] for s in product_short_name.split())
return product_short_name
@cache
def get_product_values():
"""Provide product data based on available inputs.
Order of precedence for the values is:
1) Buildstamp file specified by the PRODBUILDPATH environment variable
2) Buildstamp file /.buildstamp
3) Environment variable ANACONDA_ISFINAL
4) In absence of any data, fall back to "false"
:return: Data about product
:rtype: ProductData
"""
# First, load in the defaults. In order of precedence: contents of
# .buildstamp, environment, stupid last ditch hardcoded defaults.
config = configparser.ConfigParser()
config.add_section("Main")
config.set("Main", "IsFinal", os.environ.get("ANACONDA_ISFINAL", "false"))
config.set("Main", "Product", os.environ.get("ANACONDA_PRODUCTNAME", "anaconda"))
config.set("Main", "Version", os.environ.get("ANACONDA_PRODUCTVERSION", "bluesky"))
# Now read in the .buildstamp file, wherever it may be.
config.read(["/.buildstamp", os.environ.get("PRODBUILDPATH", "")])
# Set up some variables we import throughout, applying a couple transforms as necessary.
is_final_release = config.getboolean("Main", "IsFinal")
product_name = config.get("Main", "Product")
product_version = trim_product_version_for_ui(config.get("Main", "Version"))
# for use in device names, eg: "fedora", "rhel"
product_short_name = shorten_product_name(product_name)
result = ProductData(is_final_release, product_name, product_version, product_short_name)
return result
def get_product_is_final_release():
return get_product_values().is_final_release
def get_product_name():
return get_product_values().name
def get_product_short_name():
return get_product_values().short_name
def get_product_version():
return get_product_values().version