#! /bin/bash
# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

set -e
set -u
set -o pipefail

PROG_NAME="$(basename "${0}")"
readonly PROG_NAME
SECURE_BOOT_CMD="/usr/share/cloud/is-secure-boot"
readonly SECURE_BOOT_CMD
ESP_PARTITION="/dev/sda12"
readonly ESP_PARTITION
PROC_CMDLINE="/proc/cmdline"
readonly PROC_CMDLINE
CGROUP_HYBRID=1
readonly CGROUP_HYBRID
CGROUP_UNIFIED=2
readonly CGROUP_UNIFIED
CGROUP_UNKNOWN=-1
readonly CGROUP_UNKNOWN

#
# usage <exit_code>
#
# Print usage and exit.
#
usage() {
        local exit_code="${1}"

        cat <<EOF
Usage:
        ${PROG_NAME} {show| set { hybrid | unified} |help}
        show         - Shows the current cgroup type.
        set hybrid   - Changes the cgroup to hybrid
                      (only when secure boot is disabled).
        set unified  - Changes the cgroup to unified
                       (only when secure boot is disabled).
        help         - Prints this message.
EOF
        exit "${exit_code}"
}

#
# get_current_cgroup
#
# Checks /proc/cmdline and existance of /sys/fs/cgroup/cgroup.controllers
# and returns the cgroup accordingly.
#
get_current_cgroup() {
  cgroup=$(sed "s/.*systemd.unified_cgroup_hierarchy=\([a-z]*\).*/\\1/g" \
          "${PROC_CMDLINE}")
  local retval=${CGROUP_UNKNOWN}
  if [[ ( "${cgroup}" == "false" ) &&
        ( ! -f /sys/fs/cgroup/cgroup.controllers ) ]]; then
    retval=${CGROUP_HYBRID}
  fi
  if [[ ( "${cgroup}" != "false" ) &&
        ( -f /sys/fs/cgroup/cgroup.controllers ) ]]; then
    retval=${CGROUP_UNIFIED}
  fi
  echo "${retval}"

}

#
# cgroup_hybrid
#
# Configure cgroup as hybrid by modifying kernel commandline in grub.cfg.
# Takes effect after reboot.
#
cgroup_hybrid() {

  if [[ $(get_current_cgroup) -eq ${CGROUP_HYBRID} ]]; then
    echo "Cgroup is already configured as 'hybrid'."
    exit 0
  fi

  local dir
  dir="$(mktemp -d)"
  mount "${ESP_PARTITION}" "${dir}"
  local search='\(.*\)\(init=\)\(.*\)'
  local replace=" systemd.unified_cgroup_hierarchy=false "
  replace+="systemd.legacy_systemd_cgroup_controller=false"
  sed "s/${search}/\\1\\2\\3${replace}/g" -i "${dir}/efi/boot/grub.cfg"
  sync
  umount "${dir}"
  rm -rf "${dir}"
  echo "Cgroup is changed to 'hybrid' and needs a reboot to take effect."
  check_and_print_secure_msg
}

#
# cgroup_unified
#
# Configure cgroup as unified by modifying kernel commandline in grub.cfg.
# Takes effect after reboot.
#
cgroup_unified() {
  if  [[ $(get_current_cgroup) -eq ${CGROUP_UNIFIED} ]]; then
    echo "Cgroup is already configured as 'unified'."
    exit 0
  fi
  local dir="$(mktemp -d)"
  mount "${ESP_PARTITION}" "${dir}"
  local search="systemd.unified_cgroup_hierarchy=false "
  search+="systemd.legacy_systemd_cgroup_controller=false"
  local replace=""
  sed "s/${search}/${replace}/g" -i "${dir}/efi/boot/grub.cfg"
  sync
  umount "${dir}"
  rm -rf "${dir}"
  echo "Cgroup is changed to 'unified' and needs a reboot to take effect."
  check_and_print_secure_msg
}

#
# cgroup_show
#
# Show the current cgroup configuration.
#
cgroup_show() {
  cur_cgroup=$(get_current_cgroup)
  if [[ ${cur_cgroup} -eq ${CGROUP_HYBRID} ]]; then
    echo "Configured cgroup is 'hybrid'."
  elif [[ ${cur_cgroup} -eq ${CGROUP_UNIFIED} ]]; then
    echo "Configured cgroup is 'unified'."
  else
    echo "Inconsistency in cgroup configuration."
  fi
}

check_and_print_secure_msg() {
  if ${SECURE_BOOT_CMD}; then
    echo "secure boot is enabled."
    echo "Cgroup changes won't be effective while secure boot is enabled."
    echo -n "Disable secure boot, and reboot for the cgroup changes to be "
    echo "effective."
  fi
}

main() {
  case "${1-help}" in
    show)
    cgroup_show
    ;;
    set)
      case "${2-help}" in
        hybrid)
          cgroup_hybrid
          ;;
        unified)
          cgroup_unified
          ;;
        *)
          usage 1
          ;;
      esac
      ;;
    help)
    usage 0
    ;;
    *)
    usage 1
    ;;
  esac
}

main "$@"
