#!/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