blob: 3ea7e34b0ff4214252228db349dc862d36a3a777 [file]
#!/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