diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index 0743d95f8eb..2185b00805a 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -39,7 +39,10 @@ rm -f /ready # Restore FDB and ARP table ASAP fast_reboot -HWSKU=`sonic-cfggen -d -v "DEVICE_METADATA['localhost']['hwsku']"` +# read SONiC immutable variables +[ -f /etc/sonic/sonic-environment ] && . /etc/sonic/sonic-environment + +HWSKU=${HWSKU:-`sonic-cfggen -d -v "DEVICE_METADATA['localhost']['hwsku']"`} # Don't load json config if system warm start or # swss docker warm start is enabled, the data already exists in appDB. diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 4f265a5ceb9..7d266e7d650 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -156,7 +156,7 @@ start() { BOOT_TYPE=`getBootType` # Obtain our platform as we will mount directories with these names in each docker - PLATFORM=`$SONIC_CFGGEN -H -v DEVICE_METADATA.localhost.platform` + PLATFORM=${PLATFORM:-`$SONIC_CFGGEN -H -v DEVICE_METADATA.localhost.platform`} # Parse the device specific asic conf file, if it exists ASIC_CONF=/usr/share/sonic/device/$PLATFORM/asic.conf @@ -169,7 +169,7 @@ start() { HWSKU="" {%- else %} # Obtain our HWSKU as we will mount directories with these names in each docker - HWSKU=`$SONIC_CFGGEN -d -v 'DEVICE_METADATA["localhost"]["hwsku"]'` + HWSKU=${HWSKU:-`$SONIC_CFGGEN -d -v 'DEVICE_METADATA["localhost"]["hwsku"]'`} {%- endif %} DOCKERCHECK=`docker inspect --type container {{docker_container_name}}$DEV 2>/dev/null` @@ -362,6 +362,9 @@ if [ "$DEV" ]; then SONIC_DB_CLI="sonic-db-cli" fi +# read SONiC immutable variables +[ -f /etc/sonic/sonic-environment ] && . /etc/sonic/sonic-environment + case "$1" in start|wait|stop) $1 diff --git a/files/image_config/config-setup/config-setup b/files/image_config/config-setup/config-setup index 1f95a10bb05..d3860caf7c2 100755 --- a/files/image_config/config-setup/config-setup +++ b/files/image_config/config-setup/config-setup @@ -208,7 +208,7 @@ load_config() generate_config() { # Collect all information needed to generate configuration - PLATFORM=`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform` + PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} PRESET=(`head -n 1 /usr/share/sonic/device/$PLATFORM/default_sku`) HW_KEY=${PRESET[0]} DEFAULT_PRESET=${PRESET[1]} @@ -403,8 +403,11 @@ boot_config() fi } +# read SONiC immutable variables +[ -f /etc/sonic/sonic-environment ] && . /etc/sonic/sonic-environment + ### Execution starts here ### -PLATFORM=`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform` +PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} # Parse the device specific asic conf file, if it exists ASIC_CONF=/usr/share/sonic/device/$PLATFORM/asic.conf if [[ -f "$ASIC_CONF" ]]; then diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index 2beec7500cf..bf4e0b631cd 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -11,9 +11,17 @@ # # By default this script does nothing. -SONIC_VERSION=$(sonic-cfggen -y /etc/sonic/sonic_version.yml -v build_version) +SONIC_VERSION=$(cat /etc/sonic/sonic_version.yml | grep "build_version" | sed -e "s/build_version: //g;s/'//g") FIRST_BOOT_FILE="/host/image-${SONIC_VERSION}/platform/firsttime" +# Move sonic-environment to /etc/sonic +SONIC_CONFIG_DIR="/host/image-${SONIC_VERSION}/sonic-config" +SONIC_ENV_FILE=${SONIC_CONFIG_DIR}/sonic-environment +if [ -d ${SONIC_CONFIG_DIR} -a -f ${SONIC_ENV_FILE} ]; then + echo "moving file ${SONIC_ENV_FILE} to /etc/sonic" 1>&2 + mv ${SONIC_ENV_FILE} /etc/sonic +fi + # In case the unit is migrating from another NOS, save the logs log_migration() { echo $1 >> /host/migration/migration.log diff --git a/files/image_config/secureboot/allowlist_paths.conf b/files/image_config/secureboot/allowlist_paths.conf index fe5b890e067..c80b39d74bc 100644 --- a/files/image_config/secureboot/allowlist_paths.conf +++ b/files/image_config/secureboot/allowlist_paths.conf @@ -25,6 +25,7 @@ etc/sonic/config_db.json etc/sonic/minigraph.xml etc/sonic/old_config/.* etc/sonic/snmp.yml +etc/sonic/sonic-environment etc/sonic/updategraph.conf etc/ssh/ssh_host_rsa_key.pub etc/ssh/ssh_host_rsa_key diff --git a/files/image_config/topology/topology.sh b/files/image_config/topology/topology.sh index dde7da24748..aba7565c821 100755 --- a/files/image_config/topology/topology.sh +++ b/files/image_config/topology/topology.sh @@ -7,17 +7,20 @@ start() { TOPOLOGY_SCRIPT="topology.sh" - PLATFORM=`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform` - HWSKU=`sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["hwsku"]'` + PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} + HWSKU=${HWSKU:-`sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["hwsku"]'`} /usr/share/sonic/device/$PLATFORM/$HWSKU/$TOPOLOGY_SCRIPT start } stop() { TOPOLOGY_SCRIPT="topology.sh" - PLATFORM=`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform` - HWSKU=`sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["hwsku"]'` + PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} + HWSKU=${HWSKU:-`sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["hwsku"]'`} usr/share/sonic/device/$PLATFORM/$HWSKU/$TOPOLOGY_SCRIPT stop } +# read SONiC immutable variables +[ -f /etc/sonic/sonic-environment ] && . /etc/sonic/sonic-environment + case "$1" in start|stop) $1 diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph index 86ee8a800ae..5c767b83d95 100755 --- a/files/image_config/updategraph/updategraph +++ b/files/image_config/updategraph/updategraph @@ -7,6 +7,9 @@ reload_minigraph() config save -y } +# read SONiC immutable variables +[ -f /etc/sonic/sonic-environment ] && . /etc/sonic/sonic-environment + if [ ! -f /etc/sonic/updategraph.conf ]; then echo "No updategraph.conf found, generating a default one." echo "enabled=false" >/etc/sonic/updategraph.conf @@ -46,7 +49,7 @@ if [ "$src" = "dhcp" ]; then if [ "`cat /tmp/dhcp_graph_url`" = "N/A" ]; then echo "No graph_url option in DHCP response. Skipping graph update and generating an empty configuration." - PLATFORM=`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform` + PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} if [ -f /etc/sonic/minigraph.xml ]; then sonic-cfggen -H -m /etc/sonic/minigraph.xml --preset empty > /tmp/device_meta.json else diff --git a/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/s6000_platform.sh b/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/s6000_platform.sh index 98fb13b1522..f2e95f5130f 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/s6000_platform.sh +++ b/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/s6000_platform.sh @@ -76,7 +76,7 @@ switch_board_qsfp_lpmode() { install_python_api_package() { device="/usr/share/sonic/device" - platform=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) + platform=${PLATFORM:-`/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} if [ -e $device/$platform/sonic_platform-1.0-py2-none-any.whl ]; then rv=$(pip install $device/$platform/sonic_platform-1.0-py2-none-any.whl) @@ -90,6 +90,9 @@ remove_python_api_package() { fi } +# read SONiC immutable variables +[ -f /etc/sonic/sonic-environment ] && . /etc/sonic/sonic-environment + if [[ "$1" == "init" ]]; then depmod -a modprobe nvram diff --git a/src/sonic-daemon-base/sonic_daemon_base/daemon_base.py b/src/sonic-daemon-base/sonic_daemon_base/daemon_base.py index ae4b3b916cc..ee0fa673e44 100644 --- a/src/sonic-daemon-base/sonic_daemon_base/daemon_base.py +++ b/src/sonic-daemon-base/sonic_daemon_base/daemon_base.py @@ -18,6 +18,9 @@ # Platform root directory inside docker PLATFORM_ROOT_DOCKER = '/usr/share/sonic/platform' SONIC_CFGGEN_PATH = '/usr/local/bin/sonic-cfggen' +SONIC_ENV_FILE = '/etc/sonic/sonic-environment' +PLATFORM_ENVVAR = 'PLATFORM' +HWSKU_ENVVAR = 'HWSKU' HWSKU_KEY = 'DEVICE_METADATA.localhost.hwsku' PLATFORM_KEY = 'DEVICE_METADATA.localhost.platform' @@ -126,21 +129,32 @@ def signal_handler(self, sig, frame): # Returns platform and hwsku def get_platform_and_hwsku(self): try: - proc = subprocess.Popen([SONIC_CFGGEN_PATH, '-H', '-v', PLATFORM_KEY], - stdout=subprocess.PIPE, - shell=False, - stderr=subprocess.STDOUT) - stdout = proc.communicate()[0] - proc.wait() - platform = stdout.rstrip('\n') - - proc = subprocess.Popen([SONIC_CFGGEN_PATH, '-d', '-v', HWSKU_KEY], - stdout=subprocess.PIPE, - shell=False, - stderr=subprocess.STDOUT) - stdout = proc.communicate()[0] - proc.wait() - hwsku = stdout.rstrip('\n') + platform = hwsku = None + if os.path.exists(SONIC_ENV_FILE): + with open(SONIC_ENV_FILE, "r") as env_file: + for line in env_file: + if PLATFORM_ENVVAR in line: + platform = line.split('=')[1] + if HWSKU_ENVVAR in line: + hwsku = line.split('=')[1] + + if not platform: + proc = subprocess.Popen([SONIC_CFGGEN_PATH, '-H', '-v', PLATFORM_KEY], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=False) + stdout, stderr = proc.communicate() + assert not stderr and not proc.returncode, "Failed to detect platform: %s, rc: %s" % (stderr, proc.returncode) + platform = stdout.rstrip('\n') + + if not hwsku: + proc = subprocess.Popen([SONIC_CFGGEN_PATH, '-d', '-v', HWSKU_KEY], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=False) + stdout, stderr = proc.communicate() + assert not stderr and not proc.returncode, "Failed to detect hwsku: %s, rc: %s" % (stderr, proc.returncode) + hwsku = stdout.rstrip('\n') except OSError, e: raise OSError("Failed to detect platform: %s" % (str(e)))