#!/bin/bash
#############################################################################
# Title           : xcat
# Description     : This script initialises a standard xCAT VM in OSS
# Author          : OCF Limited
# Date            : 20250424
# Version         : 2504.0
# Usage           : xcat
# Notes           : requires internet access to OCF Gitlab and Steel Stack websites
#############################################################################

phase1() {
  # Set SELINUX to permissive mode
  echo "OCF Steel Stack: Set SELINUX to permissive mode"
  sudo setenforce permissive
  sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config

  sudo firewall-cmd --permanent --zone=trusted --add-service=http
  sudo firewall-cmd --permanent --change-interface=ens18 --zone=trusted
  sudo firewall-cmd --permanent --change-interface=ens19 --zone=trusted
  sudo firewall-cmd --permanent --change-interface=ens20 --zone=public
  sudo firewall-cmd --zone=public --remove-service=cockpit
  sudo firewall-cmd --zone=public --remove-service=dhcpv6-client
  sudo firewall-cmd --zone=public --remove-service=ssh
  sudo firewall-cmd --zone=trusted --add-service=ssh
  sudo firewall-cmd --reload

  sudo tee -a /etc/hosts >/dev/null <<EOF
${_OSS_REPOS_IP} yum
EOF

  sudo mkdir /etc/yum.repos.d/net_repos/
  sudo mv -f /etc/yum.repos.d/\!\(caster.repo\|net_repos\) /etc/yum.repos.d/net_repos/

  sudo tee /etc/yum.repos.d/caster.repo >/dev/null <<EOF
[baseos]
name=baseos
baseurl=http://yum/x86_64/rocky/9/baseos
enabled=1
gpgcheck=0

[appstream]
name=appstream
baseurl=http://yum/x86_64/rocky/9/appstream
enabled=1
gpgcheck=0

[epel]
name=epel
baseurl=http://yum/x86_64/el/9/epel
enabled=1
gpgcheck=0

[xcat-core]
name=xcat-core
baseurl=http://yum/x86_64/el/9/xcat-core
enabled=1
gpgcheck=0

[xcat-dep]
name=xcat-dep
baseurl=http://yum/x86_64/el/9/xcat-dep
enabled=1
gpgcheck=0
EOF

  sudo yum clean all
  sudo yum upgrade -y
  sudo mv -f /etc/yum.repos.d/\!\(caster.repo\|net_repos\) /etc/yum.repos.d/net_repos/

  # Set OSS setup variables for xcat and Ansible
  OSS_HOME="/opt/ocf/steel"
  OSS_TMP="/tmp/oss"
  OSS_DL="https://gitlab.ocf.co.uk"
  OSS_XCAT_MODULE="xcat"
  OSS_XCAT_PROJECT_ID="567"
  OSS_ANSIBLE_MODULE="ansible"
  OSS_ANSIBLE_PROJECT_ID="565"

  sudo mkdir -p $OSS_TMP/$OSS_XCAT_MODULE $OSS_TMP/$OSS_ANSIBLE_MODULE $OSS_HOME/$OSS_XCAT_MODULE $OSS_HOME/$OSS_ANSIBLE_MODULE
  sudo chown ocflocal:osscontrol $OSS_TMP/$OSS_XCAT_MODULE $OSS_TMP/$OSS_ANSIBLE_MODULE $OSS_HOME/$OSS_XCAT_MODULE $OSS_HOME/$OSS_ANSIBLE_MODULE

  curl -s -o $OSS_TMP/$OSS_XCAT_MODULE/checksums https://verify.steelstack.io/$OSS_XCAT_MODULE/checksums
  XCAT_LATESTHASH=$(head -1 $OSS_TMP/$OSS_XCAT_MODULE/checksums | awk '{ print $2 }')
  #XCAT_LATESTVERSION=$(grep $XCAT_LATESTHASH $OSS_TMP/$OSS_XCAT_MODULE/checksums | awk '{ print $1 }')
  XCAT_LATESTVERSION=master

  curl -s -o $OSS_TMP/$OSS_ANSIBLE_MODULE/checksums https://verify.steelstack.io/$OSS_ANSIBLE_MODULE/checksums
  ANSIBLE_LATESTHASH=$(head -1 $OSS_TMP/$OSS_ANSIBLE_MODULE/checksums | awk '{ print $2 }')

  #ANSIBLE_LATESTVERSION=$(grep $ANSIBLE_LATESTHASH $OSS_TMP/$OSS_ANSIBLE_MODULE/checksums | awk '{ print $1 }')
  ANSIBLE_LATESTVERSION=master

  curl --header "PRIVATE-TOKEN: $OSS_USER_TOKEN" \
     --url "$OSS_DL/api/v4/projects/$OSS_XCAT_PROJECT_ID/repository/archive.tar.gz?sha=$XCAT_LATESTVERSION" \
     --output $OSS_TMP/$OSS_XCAT_MODULE/$XCAT_LATESTVERSION.tar.gz
  curl --header "PRIVATE-TOKEN: $OSS_USER_TOKEN" \
     --url "$OSS_DL/api/v4/projects/$OSS_ANSIBLE_PROJECT_ID/repository/archive.tar.gz?sha=$ANSIBLE_LATESTVERSION" \
     --output $OSS_TMP/$OSS_ANSIBLE_MODULE/$ANSIBLE_LATESTVERSION.tar.gz
  tar --strip-components=1 -xzf $OSS_TMP/$OSS_XCAT_MODULE/$XCAT_LATESTVERSION.tar.gz -C $OSS_HOME/$OSS_XCAT_MODULE/
  tar --strip-components=1 -xzf $OSS_TMP/$OSS_ANSIBLE_MODULE/$ANSIBLE_LATESTVERSION.tar.gz -C $OSS_HOME/$OSS_ANSIBLE_MODULE/

  cd /opt/ocf/steel/xcat/setup
  cp example-cluster-data.yaml cluster-data.yaml
}

oss_banner() {
  echo "$(printf '\u001b[38;5;33m')-------------------------------------------------------------------$(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;38m')        ____    ____  _______    |    ____  _            _         $(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;38m')      /      \ /     |       |   |   / ___|| |_ ___  ___| |        $(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;39m')     |   __   |   ___|   ____|   |   \___ \| __/ _ \/ _ \ |        $(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;39m')     |  |  |  |  |   |  |        |    ___) | ||  __/  __/ |        $(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;33m')     |  |  |  |  |   |  |___     |   |____/ \__\___|\___|_|        $(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;33m')     |  |  |  |  |___|   ___|    |    ____  _             _        $(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;33m')     |  |__|  |      |  |        |   / ___|| |_ __ _  ___| | __    $(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;33m')      \______/ \_____|__|        |   \___ \| __/ _  |/ __| |/ /    $(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;39m')    (========================)   |    ___) | || (_| | (__|   <     $(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;39m')      Brilliance. Together.      |   |____/ \__\__,_|\___|_|\_\    $(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;38m')---------------------------------|---------------------------------$(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;38m')     HPC, Storage, Cloud & AI    |         Version: 2504.0        $(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;33m')-------------------------------------------------------------------$(printf '\033[0m')"
  echo "$(printf '\u001b[38;5;34m';printf '\u001b[1m')OCF Steel Stack xCAT initialisation $(printf '\033[0m')"
}

oss_banner

read -p "Please enter the IP address of the repos VM: " _OSS_REPOS_IP
read -sp "Please enter your OCF Gitlab access token: " OSS_USER_TOKEN

phase1

echo "OCF Steel Stack: phase 2 initialisation complete. Continue with setup_xcat01.sh."
echo "========================================"
echo "  cd /opt/ocf/steel/xcat/setup"
echo "  Edit 'cluster-data.yaml'"
echo "  Run the setup using 'sudo ./setup_xcat01.sh'"
echo "========================================"
echo "OCF Steel Stack: remember to reboot the node for Kernel updates to be loaded."

