#!/bin/bash
# --------------------------------------------------------------------
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed
# with this work for additional information regarding copyright
# ownership. The ASF licenses this file to You 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
#
#    http://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.
#
# --------------------------------------------------------------------
# Container Initialization Script
# --------------------------------------------------------------------
# This script sets up the environment inside the Docker container for
# the Apache Cloudberry Build Environment. It performs the following
# tasks:
#
# 1. Verifies that the container is running with the expected hostname.
# 2. Starts the SSH daemon to allow SSH access to the container.
# 3. Configures passwordless SSH access for the 'gpadmin' user.
# 4. Sets up the necessary directories and configuration files for
#    Apache Cloudberry.
# 5. Displays a welcome banner and system information.
# 6. Starts an interactive bash shell.
#
# This script is intended to be used as an entrypoint or initialization
# script for the Docker container.
# --------------------------------------------------------------------

# --------------------------------------------------------------------
# Check if the hostname is 'cdw'
# --------------------------------------------------------------------
# The script checks if the container's hostname is set to 'cdw'. This is
# a requirement for this environment, and if the hostname does not match,
# the script will exit with an error message. This ensures consistency
# across different environments.
# --------------------------------------------------------------------
if [ "$(hostname)" != "cdw" ]; then
    echo "Error: This container must be run with the hostname 'cdw'."
    echo "Use the following command: docker run -h cdw ..."
    exit 1
fi

# --------------------------------------------------------------------
# Start SSH daemon and setup for SSH access
# --------------------------------------------------------------------
# The SSH daemon is started to allow remote access to the container via
# SSH. This is useful for development and debugging purposes. If the SSH
# daemon fails to start, the script exits with an error.
# --------------------------------------------------------------------
if ! sudo /usr/sbin/sshd; then
    echo "Failed to start SSH daemon" >&2
    exit 1
fi

# --------------------------------------------------------------------
# Remove /run/nologin to allow logins
# --------------------------------------------------------------------
# The /run/nologin file, if present, prevents users from logging into
# the system. This file is removed to ensure that users can log in via SSH.
# --------------------------------------------------------------------
sudo rm -rf /run/nologin

# --------------------------------------------------------------------
# Configure passwordless SSH access for 'gpadmin' user
# --------------------------------------------------------------------
# The script sets up SSH key-based authentication for the 'gpadmin' user,
# allowing passwordless SSH access. It generates a new SSH key pair if one
# does not already exist, and configures the necessary permissions.
# --------------------------------------------------------------------
mkdir -p /home/gpadmin/.ssh
chmod 700 /home/gpadmin/.ssh

if [ ! -f /home/gpadmin/.ssh/id_rsa ]; then
    ssh-keygen -t rsa -b 4096 -C gpadmin -f /home/gpadmin/.ssh/id_rsa -P "" > /dev/null 2>&1
fi

cat /home/gpadmin/.ssh/id_rsa.pub >> /home/gpadmin/.ssh/authorized_keys
chmod 600 /home/gpadmin/.ssh/authorized_keys

# Add the container's hostname to the known_hosts file to avoid SSH warnings
ssh-keyscan -t rsa cdw > /home/gpadmin/.ssh/known_hosts 2>/dev/null

# --------------------------------------------------------------------
# Cloudberry Data Directories Setup
# --------------------------------------------------------------------
# The script sets up the necessary directories for Apache Cloudberry,
# including directories for the coordinator, standby coordinator, primary
# segments, and mirror segments. It also sets up the configuration files
# required for initializing the database.
# --------------------------------------------------------------------
sudo rm -rf /data1/*
sudo mkdir -p /data1/coordinator /data1/standby_coordinator /data1/primary /data1/mirror
sudo chown -R gpadmin.gpadmin /data1

# Copy the gpinitsystem configuration file to the home directory
cp /tmp/gpinitsystem.conf /home/gpadmin

# Set up the hostfile for cluster initialization
echo $(hostname) > /home/gpadmin/hostfile_gpinitsystem

# Change to the home directory of the current user
cd $HOME

# --------------------------------------------------------------------
# Display a Welcome Banner
# --------------------------------------------------------------------
# The following ASCII art and welcome message are displayed when the
# container starts. This banner provides a visual indication that the
# container is running in the Apache Cloudberry Build Environment.
# --------------------------------------------------------------------
cat <<-'EOF'

======================================================================

                          ++++++++++       ++++++
                        ++++++++++++++   +++++++
                       ++++        +++++ ++++
                      ++++          +++++++++
                   =+====         =============+
                 ========       =====+      =====
                ====  ====     ====           ====
               ====    ===     ===             ====
               ====            === ===         ====
               ====            ===  ==--       ===
                =====          ===== --       ====
                 =====================     ======
                   ============================
                                     =-----=
     ____  _                    _  _
    / ___|| |  ___   _   _   __| || |__    ___  _ __  _ __  _   _
   | |    | | / _ \ | | | | / _` || '_ \  / _ \| '__|| '__|| | | |
   | |___ | || (_) || |_| || (_| || |_) ||  __/| |   | |   | |_| |
    \____||_| \____  \__,_| \__,_||_.__/  \___||_|   |_|    \__, |
                                                            |___/
----------------------------------------------------------------------

EOF

# --------------------------------------------------------------------
# Display System Information
# --------------------------------------------------------------------
# The script sources the /etc/os-release file to retrieve the operating
# system name and version. It then displays the following information:
# - OS name and version
# - Current user
# - Container hostname
# - IP address
# - CPU model name and number of cores
# - Total memory available
# - Cloudberry version (if installed)
# This information is useful for users to understand the environment they
# are working in.
# --------------------------------------------------------------------
source /etc/os-release

# First, create the CPU info detection function
get_cpu_info() {
   ARCH=$(uname -m)
   if [ "$ARCH" = "x86_64" ]; then
       lscpu | grep 'Model name:' | awk '{print substr($0, index($0,$3))}'
   elif [ "$ARCH" = "aarch64" ]; then
       VENDOR=$(lscpu | grep 'Vendor ID:' | awk '{print $3}')
       if [ "$VENDOR" = "Apple" ] || [ "$VENDOR" = "0x61" ]; then
           echo "Apple Silicon ($ARCH)"
       else
           if [ -f /proc/cpuinfo ]; then
               IMPL=$(grep "CPU implementer" /proc/cpuinfo | head -1 | awk '{print $3}')
               PART=$(grep "CPU part" /proc/cpuinfo | head -1 | awk '{print $3}')
               if [ ! -z "$IMPL" ] && [ ! -z "$PART" ]; then
                   echo "ARM $ARCH (Implementer: $IMPL, Part: $PART)"
               else
                   echo "ARM $ARCH"
               fi
           else
               echo "ARM $ARCH"
           fi
       fi
   else
       echo "Unknown architecture: $ARCH"
   fi
}

# Check if Apache Cloudberry is installed and display its version
if rpm -q apache-cloudberry-db-incubating > /dev/null 2>&1; then
    CBDB_VERSION=$(/usr/local/cbdb/bin/postgres --gp-version)
else
    CBDB_VERSION="Not installed"
fi

cat <<-EOF
Welcome to the Apache Cloudberry Test Environment!

Cloudberry version .. : $CBDB_VERSION
Container OS ........ : $NAME $VERSION
User ................ : $(whoami)
Container hostname .. : $(hostname)
IP Address .......... : $(hostname -I | awk '{print $1}')
CPU Info ............ : $(get_cpu_info)
CPU(s) .............. : $(nproc)
Memory .............. : $(free -h | grep Mem: | awk '{print $2}') total
======================================================================

EOF

# --------------------------------------------------------------------
# Start an interactive bash shell
# --------------------------------------------------------------------
# Finally, the script starts an interactive bash shell to keep the
# container running and allow the user to interact with the environment.
# --------------------------------------------------------------------
/bin/bash
