#!/bin/sh

bios_reset_if_needed() {
  resetval=$(fw_printenv -n rwreset 2>/dev/nell)
  if [ "$resetval" = "0" ] || [ "$resetval" = "1" ]; then
    varstore="/media/hostfw/reset-gpio-val"
    if [ -f "$varstore" ]; then
      if [ "$resetval" != "$(cat $varstore)" ]; then
        if busctl call org.open_power.Software.Host.Updater /xyz/openbmc_project/software xyz.openbmc_project.Common.FactoryReset Reset; then
          echo "$resetval" > "$varstore"
        fi
      fi
    else
      echo "$resetval" > "$varstore"
    fi
  fi
}

mmc_init() {
  base_dir="/media/hostfw"
  ro_dir="${base_dir}/running-ro"
  running_dir="${base_dir}/running"
  prsv_dir="${base_dir}/prsv"
  staging_dir="${base_dir}/staging"
  nvram_dir="${base_dir}/nvram"

  if [ ! -d "${ro_dir}" ]; then
    mkdir -p "${ro_dir}"
  fi
  if [ ! -d "${running_dir}" ]; then
    mkdir -p ${running_dir}
  fi
  if [ ! -d "${prsv_dir}" ]; then
    mkdir -p "${prsv_dir}"
  fi
  if [ ! -d "${staging_dir}" ]; then
    mkdir -p "${staging_dir}"
  fi
  if [ ! -d "${nvram_dir}" ]; then
    mkdir -p "${nvram_dir}"
  fi

  # Mount the image that corresponds to the boot label as read-only to be used
  # to populate the running directory.
  boot_label="$(fw_printenv -n bootside)"
  if ! grep -q "${ro_dir}" /proc/mounts; then
    mount ${base_dir}/hostfw-"${boot_label}" ${ro_dir} -o ro
  fi

  # Determine if the running dir contains the running version
  running_label=""
  running_label_file="${running_dir}/partlabel"
  if [ -f "${running_label_file}" ]; then
    running_label=$(cat ${running_label_file})
  fi
  if [ "${running_label}" != "${boot_label}" ]; then
    # Copy off the preserved partitions
    # A line in the pnor.toc (81e00994.lid) looks like this:
    # partition05=SECBOOT,0x00381000,0x003a5000,00,ECC,PRESERVED
    rm -f ${prsv_dir}/*
    if [ -f "${ro_dir}/81e00994.lid" ]; then
      prsvs=$(grep PRESERVED "${ro_dir}/81e00994.lid")
      for prsv in ${prsvs}; do
        prsv=${prsv##partition*=}
        prsv=$(echo "${prsv}" | cut -d "," -f 1)
        if [ -L "${running_dir}/${prsv}" ]; then
          # Preserve the symlink target file
          prsv="$(readlink "${running_dir}/${prsv}")"
          runsize="$(stat -c '%s' "${running_dir}/${prsv}")"
          rosize="$(stat -c '%s' "${ro_dir}/${prsv}")"
          if [ "$runsize" != "$rosize" ]; then
              # Partition size may have changed or became corrupted
              # So it will not be copied to the preserved directory
              # Log PEL to indicate such
              busctl call xyz.openbmc_project.Logging \
              /xyz/openbmc_project/logging \
              xyz.openbmc_project.Logging.Create Create "ssa{ss}" \
              xyz.openbmc_project.Software.Version.Error.HostFile \
              xyz.openbmc_project.Logging.Entry.Level.Error 3 "FILE_NAME" \
              "${prsv}" "CURRENT_FILE_SIZE" "${runsize}" "EXPECTED_FILE_SIZE" \
              "${rosize}"
              # Initiate dump
              busctl call xyz.openbmc_project.Dump.Manager \
              /xyz/openbmc_project/dump/bmc xyz.openbmc_project.Dump.Create \
              CreateDump "a{sv}" 0
          else
              cp -p ${running_dir}/"${prsv}" ${prsv_dir}
          fi
        fi
      done
    fi

    # Copy lid contents of running image to running dir
    rm -f ${running_dir}/*
    cp -p ${ro_dir}/*.lid ${running_dir}/

    # Restore the preserved partitions. Ignore error, there may be none.
    cp -p ${prsv_dir}/* ${running_dir}/ 2>/dev/null || true
    rm -f "${prsv_dir:?}/"*

    # Clean up the staging dir in case of a failed update
    rm -rf "${staging_dir:?}/"*

    # Save the label
    echo "${boot_label}" > "${running_label_file}"

  fi

  # Mount alternate dir
  if [ "${boot_label}" = "a" ]; then
    alternate_label="b"
  else
    alternate_label="a"
  fi
  alternate_dir="${base_dir}/alternate"
  if [ ! -d "${alternate_dir}" ]; then
    mkdir -p ${alternate_dir}
  fi
  if ! grep -q "${alternate_dir}" /proc/mounts; then
    mount ${base_dir}/hostfw-${alternate_label} ${alternate_dir} -o ro
  fi
}

mmc_patch() {
  # Patching is disabled if field mode is set
  if [ "$(fw_printenv fieldmode 2>/dev/null)" = "fieldmode=true" ]; then
    return 0
  fi

  boot_label="$(fw_printenv -n bootside)"
  if [ "${boot_label}" = "a" ]; then
    alternate_label="b"
  else
    alternate_label="a"
  fi

  # Create patch directories
  patch_dir="/media/hostfw/patch-"
  running_patch_dir="${patch_dir}${boot_label}"
  if [ ! -d "${running_patch_dir}" ]; then
    mkdir -p "${running_patch_dir}"
  fi
  alternate_patch_dir="${patch_dir}${alternate_label}"
  if [ ! -d "${alternate_patch_dir}" ]; then
    mkdir -p "${alternate_patch_dir}"
  fi

  # Create patch symlinks
  symlink_base="/usr/local/share"
  if [ ! -d "${symlink_base}" ]; then
    mkdir -p "${symlink_base}"
  fi
  hostfw_symlink_base="${symlink_base}/hostfw"
  if [ ! -d "${hostfw_symlink_base}" ]; then
    mkdir -p "${hostfw_symlink_base}"
  fi

  if [ "$(readlink -f "${symlink_base}/pnor")" != "${running_patch_dir}" ]; then
    ln -s "${running_patch_dir}" "${symlink_base}/pnor"
  fi
  if [ "$(readlink -f "${hostfw_symlink_base}/running")" != "${running_patch_dir}" ]; then
    ln -s "${running_patch_dir}" "${hostfw_symlink_base}/running"
  fi
  if [ "$(readlink -f "${hostfw_symlink_base}/alternate")" != "${alternate_patch_dir}" ]; then
    ln -s "${alternate_patch_dir}" "${hostfw_symlink_base}/alternate"
  fi
}

case "$1" in
  bios-reset-if-needed)
    bios_reset_if_needed
    ;;
  mmc-init)
    mmc_init
    ;;
  mmc-patch)
    mmc_patch
    ;;
  *)
    echo "Invalid argument: $1" >&2
    exit 1
    ;;
esac
