fetch_ml/scripts/lib/common.sh
Jeremie Fraeys 1dcc1e11d5
chore(build): update build system, scripts, and additional tests
- Update Makefile with native build targets (preparing for C++)
- Add profiler and performance regression detector commands
- Update CI/testing scripts
- Add additional unit tests for API, jupyter, queue, manifest
2026-02-12 12:05:55 -05:00

183 lines
4 KiB
Bash
Executable file

#!/usr/bin/env bash
# Common shell functions for FetchML scripts
# Source this file in other scripts: source "$(dirname "$0")/lib/common.sh"
# Colors for output
export BOLD='\033[1m'
export GREEN='\033[0;32m'
export BLUE='\033[0;34m'
export YELLOW='\033[0;33m'
export RED='\033[0;31m'
export NC='\033[0m'
###################
# Logging functions
###################
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1" >&2
}
log_step() {
local step=$1
local total=$2
local message=$3
echo -e "${BLUE}[$step/$total]${NC} $message"
}
print_header() {
local title=$1
echo ""
echo -e "${BOLD}=== $title ===${NC}"
echo ""
}
###################
# System detection
###################
detect_distro() {
if [ -f /etc/os-release ]; then
. /etc/os-release
export DISTRO=$ID
export DISTRO_VERSION=$VERSION_ID
elif [ -f /etc/redhat-release ]; then
export DISTRO="rhel"
export DISTRO_VERSION="unknown"
else
export DISTRO="unknown"
export DISTRO_VERSION="unknown"
fi
# Detect package manager
if command -v dnf &>/dev/null; then
export PKG_MANAGER="dnf"
elif command -v yum &>/dev/null; then
export PKG_MANAGER="yum"
elif command -v apt-get &>/dev/null; then
export PKG_MANAGER="apt"
elif command -v pacman &>/dev/null; then
export PKG_MANAGER="pacman"
elif command -v zypper &>/dev/null; then
export PKG_MANAGER="zypper"
else
log_warn "No known package manager found"
export PKG_MANAGER="unknown"
fi
log_info "Detected: $DISTRO $DISTRO_VERSION (using $PKG_MANAGER)"
}
###################
# Utility functions
###################
check_command() {
local cmd=$1
local install_hint=$2
if ! command -v "$cmd" &>/dev/null; then
log_error "$cmd not found"
if [ -n "$install_hint" ]; then
log_info "Install with: $install_hint"
fi
return 1
fi
return 0
}
check_root() {
if [ "$EUID" -ne 0 ]; then
log_error "This script must be run with sudo"
exit 1
fi
}
confirm() {
local prompt=$1
local default=${2:-n}
if [ "$default" = "y" ]; then
read -p "$prompt [Y/n]: " -n 1 -r
else
read -p "$prompt [y/N]: " -n 1 -r
fi
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
return 0
else
return 1
fi
}
###################
# Firewall management
###################
setup_firewall() {
local port=$1
local comment=${2:-"FetchML"}
if command -v firewall-cmd &>/dev/null; then
# RHEL/Rocky/Fedora (firewalld)
sudo firewall-cmd --permanent --add-port="${port}/tcp" >/dev/null 2>&1
log_success "Firewall rule added (firewalld): ${port}/tcp"
return 0
elif command -v ufw &>/dev/null; then
# Ubuntu/Debian (ufw)
sudo ufw allow "${port}/tcp" comment "$comment" >/dev/null 2>&1
log_success "Firewall rule added (ufw): ${port}/tcp"
return 0
else
log_warn "No firewall detected. Manually open port ${port}/tcp"
return 1
fi
}
reload_firewall() {
if command -v firewall-cmd &>/dev/null; then
sudo firewall-cmd --reload >/dev/null 2>&1
log_success "Firewall reloaded (firewalld)"
elif command -v ufw &>/dev/null; then
sudo ufw reload >/dev/null 2>&1 || true
log_success "Firewall reloaded (ufw)"
fi
}
###################
# File/directory management
###################
create_dir() {
local dir=$1
local owner=${2:-$USER}
local group=${3:-$(id -gn)}
sudo mkdir -p "$dir"
sudo chown "$owner:$group" "$dir"
sudo chmod 755 "$dir"
log_success "Created: $dir"
}
check_service() {
local service=$1
if systemctl list-unit-files | grep -q "^${service}"; then
return 0
else
return 1
fi
}