testsAndMisc/linux_configuration/scripts/single_use/features/lib/nc_packages.sh
Krzysztof kuhy Rudnicki 5bacfa3883
Some checks are pending
Pre-commit checks / pre-commit (push) Waiting to run
Shell tests / shell-tests (push) Waiting to run
Shell tests / arch-tests (push) Waiting to run
Split setup_nextcloud_raspberry.sh 1383 -> 231
Eight libs from the largest script in linux_configuration: five in the
first pass, then three of those carved again since they landed at 272,
292 and 277.

Fixed three more unguarded cd /var/www/nextcloud calls, each right
before an occ command - the installer would have run against whatever
directory the caller was in. Third script with this bug.

check_and_enable_services.sh is reverted and stays at 1337. Its
SERVICE_STATUS array is declared once and written by every check_*
function, so any lib holding them fails SC2034 alone. Fourth file
deferred for shared state, and the clearest: the script is an
accumulator, so there is no seam anywhere in it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011w2Pj4Ek3ZNMQVYcFHgXDY
2026-08-16 19:37:07 +02:00

183 lines
4.5 KiB
Bash
Executable File

#!/bin/bash
# Package installation and the apt lock wait.
#
# Sourced by setup_nextcloud_raspberry.sh; split out to keep it under the 250-line
# cap. Sourced rather than run, so it inherits the caller's strict mode
# and the variables defined above the source line.
# =============================================================================
# PHASE 2: Configure Pi for Remote Access
# =============================================================================
wait_for_apt_lock() {
# Wait for any existing apt/dpkg processes to finish
local max_wait=600 # 10 minutes max
local waited=0
while fuser /var/lib/dpkg/lock-frontend /var/lib/apt/lists/lock /var/cache/apt/archives/lock >/dev/null 2>&1; do
if [[ $waited -eq 0 ]]; then
log_info "Waiting for other apt/dpkg processes to finish..."
log_info "Current apt processes:"
pgrep -a 'apt|dpkg' | head -5 >&2 || true
fi
sleep 5
waited=$((waited + 5))
if [[ $waited -ge $max_wait ]]; then
die "Timeout waiting for apt lock after ${max_wait}s"
fi
if [[ $((waited % 30)) -eq 0 ]]; then
log_info "Still waiting... (${waited}s elapsed)"
fi
done
if [[ $waited -gt 0 ]]; then
log_success "Apt lock acquired after ${waited}s"
fi
}
phase_configure() {
check_root
log_info "=== Phase 2: Configure Raspberry Pi for Remote Access ==="
# Wait for any existing apt processes
wait_for_apt_lock
# Fix any broken packages first
log_info "Fixing any broken packages..."
DEBIAN_FRONTEND=noninteractive dpkg --configure -a --force-confdef --force-confold || true
# Update system - use non-interactive mode and auto-accept config changes
log_info "Updating system packages..."
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade -y
# Set timezone
log_info "Setting timezone to $PI_TIMEZONE..."
timedatectl set-timezone "$PI_TIMEZONE"
# Set locale
log_info "Configuring locale..."
sed -i "s/^# *$PI_LOCALE/$PI_LOCALE/" /etc/locale.gen
locale-gen
update-locale LANG="$PI_LOCALE"
# Configure SSH for security
log_info "Hardening SSH configuration..."
# Backup original config
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
# Apply security settings
cat >>/etc/ssh/sshd_config.d/hardening.conf <<'EOF'
# Security hardening
PermitRootLogin no
PasswordAuthentication yes
PubkeyAuthentication yes
X11Forwarding no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
EOF
# Restart SSH
systemctl restart sshd
# Install useful packages
log_info "Installing useful packages..."
apt-get install -y \
vim \
htop \
curl \
wget \
git \
ufw \
fail2ban \
unattended-upgrades
# Configure firewall
log_info "Configuring firewall..."
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
ufw --force enable
# Configure fail2ban
log_info "Configuring fail2ban..."
cat >/etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
EOF
systemctl enable fail2ban
systemctl restart fail2ban
# Enable automatic security updates
log_info "Enabling automatic security updates..."
cat >/etc/apt/apt.conf.d/50unattended-upgrades <<'EOF'
Unattended-Upgrade::Origins-Pattern {
"origin=Debian,codename=${distro_codename},label=Debian-Security";
"origin=Raspbian,codename=${distro_codename},label=Raspbian";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
EOF
systemctl enable unattended-upgrades
# Display system info
log_info "System information:"
echo "Hostname: $(hostname)"
echo "IP Address: $(hostname -I | awk '{print $1}')"
echo "Kernel: $(uname -r)"
echo "Architecture: $(uname -m)"
log_success "Phase 2 complete!"
echo
log_info "Next step: Run 'sudo ./setup_nextcloud_raspberry.sh nextcloud' to install Nextcloud"
}
# =============================================================================
# PHASE 3: Install Nextcloud
# =============================================================================
install_nextcloud_dependencies() {
log_info "Installing Nextcloud dependencies..."
apt-get update
apt-get install -y \
apache2 \
mariadb-server \
libapache2-mod-php \
php \
php-gd \
php-mysql \
php-curl \
php-mbstring \
php-intl \
php-gmp \
php-bcmath \
php-xml \
php-zip \
php-imagick \
php-apcu \
php-redis \
redis-server \
unzip \
certbot \
python3-certbot-apache
log_success "Dependencies installed"
}