Some checks failed
Comprehensive CI/CD Pipeline / Build and Test (push) Successful in 16m26s
Comprehensive CI/CD Pipeline / Security Audit (push) Failing after 7s
Comprehensive CI/CD Pipeline / Package Validation (push) Successful in 53s
Comprehensive CI/CD Pipeline / Status Report (push) Has been skipped
- Enhanced check_systemd() function to properly detect container environments - Added detection for Docker, Podman, and other container runtimes - Verify systemd is running as PID 1 before attempting service operations - Check systemd D-Bus availability before service configuration - Gracefully skip systemd setup in containers with helpful messages - Provide manual configuration instructions for real systems Fixes container builds and CI/CD pipelines that install apt-ostree while maintaining full functionality on real systems with systemd.
239 lines
7.2 KiB
Bash
Executable file
239 lines
7.2 KiB
Bash
Executable file
#!/bin/sh
|
|
set -e
|
|
|
|
# Source debconf library
|
|
. /usr/share/debconf/confmodule
|
|
|
|
# Define package name
|
|
PACKAGE="apt-ostree"
|
|
|
|
# Function to log messages
|
|
log() {
|
|
echo "$PACKAGE: $1" >&2
|
|
}
|
|
|
|
# Function to setup shell completions
|
|
setup_completions() {
|
|
log "Setting up shell completions..."
|
|
|
|
# Reload bash completion if available (skip if problematic)
|
|
# if [ -f /etc/bash_completion ]; then
|
|
# . /etc/bash_completion || true
|
|
# fi
|
|
|
|
# Reload zsh completion if available
|
|
if [ -d /usr/share/zsh/vendor-completions ]; then
|
|
# Zsh will automatically pick up completions from this directory
|
|
log "Zsh completions installed"
|
|
fi
|
|
}
|
|
|
|
# Function to check if systemd is available and running
|
|
check_systemd() {
|
|
# Check if systemctl command exists
|
|
if ! command -v systemctl >/dev/null 2>&1; then
|
|
log "Warning: systemd not available, skipping service setup"
|
|
return 1
|
|
fi
|
|
|
|
# Enhanced container environment detection
|
|
local in_container=false
|
|
|
|
# Check for Docker container indicators
|
|
if [ -f /.dockerenv ]; then
|
|
log "Detected Docker container environment"
|
|
in_container=true
|
|
fi
|
|
|
|
# Check for Podman container indicators
|
|
if [ -f /run/.containerenv ]; then
|
|
log "Detected Podman container environment"
|
|
in_container=true
|
|
fi
|
|
|
|
# Check for container environment variable
|
|
if [ -n "${container:-}" ]; then
|
|
log "Detected container environment (container=${container})"
|
|
in_container=true
|
|
fi
|
|
|
|
# Check cgroup for container indicators
|
|
if [ -f /proc/1/cgroup ]; then
|
|
if grep -qE "(docker|podman|containerd|kubepods)" /proc/1/cgroup 2>/dev/null; then
|
|
log "Detected container environment via cgroup"
|
|
in_container=true
|
|
fi
|
|
fi
|
|
|
|
# Check for systemd-nspawn container
|
|
if [ -f /run/systemd/container ]; then
|
|
local container_type
|
|
container_type=$(cat /run/systemd/container 2>/dev/null || echo "")
|
|
if [ -n "$container_type" ]; then
|
|
log "Detected systemd-nspawn container (type: $container_type)"
|
|
in_container=true
|
|
fi
|
|
fi
|
|
|
|
# Check for LXC container
|
|
if [ -f /proc/1/environ ] && grep -q "container=lxc" /proc/1/environ 2>/dev/null; then
|
|
log "Detected LXC container environment"
|
|
in_container=true
|
|
fi
|
|
|
|
# If in container, skip systemd setup
|
|
if [ "$in_container" = true ]; then
|
|
log "Running in container environment, skipping systemd service setup"
|
|
log "Container environments typically don't run systemd as PID 1"
|
|
return 1
|
|
fi
|
|
|
|
# Check if systemd is actually running as PID 1
|
|
local init_process
|
|
init_process=$(ps -p 1 -o comm= 2>/dev/null || echo "")
|
|
if [ "$init_process" != "systemd" ]; then
|
|
log "Warning: systemd not running as PID 1 (init process: ${init_process:-unknown}), skipping service setup"
|
|
return 1
|
|
fi
|
|
|
|
# Check if systemd D-Bus is available and responsive
|
|
if ! systemctl is-system-running >/dev/null 2>&1; then
|
|
log "Warning: systemd D-Bus not available or not running, skipping service setup"
|
|
return 1
|
|
fi
|
|
|
|
# Additional check: verify we can actually communicate with systemd
|
|
if ! systemctl list-units --type=service >/dev/null 2>&1; then
|
|
log "Warning: Cannot communicate with systemd, skipping service setup"
|
|
return 1
|
|
fi
|
|
|
|
log "Systemd environment verified, proceeding with service setup"
|
|
return 0
|
|
}
|
|
|
|
# Function to enable and start the service
|
|
setup_service() {
|
|
if ! check_systemd; then
|
|
log "Skipping systemd service configuration"
|
|
log ""
|
|
log "=== Manual Configuration Instructions ==="
|
|
log "To configure apt-ostreed service on a real system with systemd:"
|
|
log " 1. Enable the service: systemctl enable apt-ostreed.service"
|
|
log " 2. Start the service: systemctl start apt-ostreed.service"
|
|
log " 3. Check status: systemctl status apt-ostreed.service"
|
|
log ""
|
|
log "For container environments:"
|
|
log " - apt-ostreed service is not needed in containers"
|
|
log " - Use 'apt-ostree' commands directly as needed"
|
|
log " - Service will be available when running on real systems"
|
|
log ""
|
|
return 0
|
|
fi
|
|
|
|
log "Setting up apt-ostreed service..."
|
|
|
|
# Reload systemd daemon to pick up new service files
|
|
if systemctl daemon-reload; then
|
|
log "Systemd daemon reloaded successfully"
|
|
else
|
|
log "Warning: Failed to reload systemd daemon"
|
|
return 1
|
|
fi
|
|
|
|
# Enable the service
|
|
if systemctl enable apt-ostreed.service; then
|
|
log "apt-ostreed service enabled successfully"
|
|
else
|
|
log "Error: Failed to enable apt-ostreed service"
|
|
return 1
|
|
fi
|
|
|
|
# Start the service if not running
|
|
if ! systemctl is-active --quiet apt-ostreed.service; then
|
|
if systemctl start apt-ostreed.service; then
|
|
log "apt-ostreed service started successfully"
|
|
else
|
|
log "Warning: Failed to start apt-ostreed service (may need manual intervention)"
|
|
log "Try running: systemctl status apt-ostreed.service"
|
|
fi
|
|
else
|
|
log "apt-ostreed service already running"
|
|
fi
|
|
|
|
# Verify service is working
|
|
if systemctl is-active --quiet apt-ostreed.service; then
|
|
log "apt-ostreed service is active and running"
|
|
else
|
|
log "Warning: apt-ostreed service is not active"
|
|
fi
|
|
}
|
|
|
|
# Function to setup directories and permissions
|
|
setup_directories() {
|
|
log "Setting up directories and permissions..."
|
|
|
|
# Create necessary directories with proper permissions
|
|
mkdir -p /var/log/apt-ostreed
|
|
mkdir -p /var/cache/apt-ostree
|
|
mkdir -p /var/lib/apt-ostree
|
|
mkdir -p /var/lib/apt-ostree/repo
|
|
|
|
# Set proper ownership (root:root)
|
|
chown root:root /var/log/apt-ostreed
|
|
chown root:root /var/cache/apt-ostree
|
|
chown root:root /var/lib/apt-ostree
|
|
chown root:root /var/lib/apt-ostree/repo
|
|
|
|
# Set proper permissions
|
|
chmod 755 /var/log/apt-ostreed
|
|
chmod 755 /var/cache/apt-ostree
|
|
chmod 755 /var/lib/apt-ostree
|
|
chmod 755 /var/lib/apt-ostree/repo
|
|
}
|
|
|
|
# Function to reload polkit rules
|
|
reload_polkit() {
|
|
if command -v pkaction >/dev/null 2>&1; then
|
|
log "Reloading polkit rules..."
|
|
# This will trigger polkit to reload its rules
|
|
pkaction --version >/dev/null 2>&1 || true
|
|
fi
|
|
}
|
|
|
|
# Function to check dependencies
|
|
check_dependencies() {
|
|
log "Checking dependencies..."
|
|
|
|
# Check if ostree is available
|
|
if ! command -v ostree >/dev/null 2>&1; then
|
|
log "Warning: ostree command not found. Please install ostree package."
|
|
fi
|
|
|
|
# Check if systemd is available
|
|
if ! command -v systemctl >/dev/null 2>&1; then
|
|
log "Warning: systemd not available. Some features may not work."
|
|
fi
|
|
}
|
|
|
|
# Main execution
|
|
case "$1" in
|
|
configure)
|
|
log "Configuring apt-ostree package..."
|
|
setup_completions
|
|
setup_directories
|
|
setup_service
|
|
reload_polkit
|
|
check_dependencies
|
|
log "Configuration completed successfully"
|
|
;;
|
|
abort-upgrade|abort-remove|abort-deconfigure)
|
|
# Do nothing on abort
|
|
;;
|
|
*)
|
|
log "Unknown action: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
exit 0
|