- Create debian/ directory structure with all required files: - control: Package metadata and dependencies - compat: Debhelper compatibility level - changelog: Version history - rules: Build instructions - install: File installation mappings - postinst: Post-installation setup (user, venv, setcap) - prerm: Pre-removal script (stop service) - postrm: Post-removal script (cleanup, preserve config) - sensorpajen.service: System-wide systemd unit - Update config.py to support dual-mode operation: - Auto-detects system installation (/opt/sensorpajen) - Uses /etc/sensorpajen for config in system mode - Falls back to PROJECT_ROOT/config for development - Update scripts/approve-sensors.sh for system paths: - Detects system vs development installation - Uses correct venv and config paths - Create scripts/verify-deb.sh: Automated build and verification - Create debian/README.md: Comprehensive packaging documentation Package features: - System-wide installation to /opt/sensorpajen/ - Configuration in /etc/sensorpajen/ (preserved on upgrade/remove) - Dedicated sensorpajen system user - Automatic venv creation with dependencies - Bluetooth capabilities set automatically - Service auto-enabled but waits for config before starting - Dual-mode code supports both system and development installations
127 lines
5.3 KiB
Bash
Executable File
127 lines
5.3 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
case "$1" in
|
|
configure)
|
|
# Create sensorpajen system user if it doesn't exist
|
|
if ! getent passwd sensorpajen > /dev/null; then
|
|
useradd --system --no-create-home --shell /usr/sbin/nologin sensorpajen
|
|
echo "Created system user: sensorpajen"
|
|
fi
|
|
|
|
# Create config directory with proper permissions
|
|
mkdir -p /etc/sensorpajen
|
|
chown sensorpajen:sensorpajen /etc/sensorpajen
|
|
chmod 750 /etc/sensorpajen
|
|
|
|
# Copy example configs to /etc/sensorpajen if they don't exist
|
|
for sample in sensorpajen.env.example sensors.json.example discovered_sensors.json.example; do
|
|
source_file="/usr/share/doc/sensorpajen/examples/$sample"
|
|
target_file="/etc/sensorpajen/${sample%.example}"
|
|
|
|
if [ -f "$source_file" ] && [ ! -f "$target_file" ]; then
|
|
cp "$source_file" "$target_file"
|
|
chown sensorpajen:sensorpajen "$target_file"
|
|
|
|
# Set restrictive permissions on env file (contains credentials)
|
|
if [ "$sample" = "sensorpajen.env.example" ]; then
|
|
chmod 600 "$target_file"
|
|
echo "Created $target_file (edit this file with your MQTT credentials)"
|
|
else
|
|
chmod 640 "$target_file"
|
|
echo "Created $target_file"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# Create virtual environment in /opt/sensorpajen
|
|
cd /opt/sensorpajen
|
|
if [ ! -d "venv" ]; then
|
|
echo "Creating Python virtual environment..."
|
|
python3 -m venv venv
|
|
venv/bin/pip install --upgrade pip setuptools wheel
|
|
fi
|
|
|
|
# Install Python dependencies from pyproject.toml
|
|
echo "Installing Python dependencies..."
|
|
venv/bin/pip install -e . || {
|
|
echo "Warning: pip install failed. You may need to install dependencies manually."
|
|
}
|
|
|
|
# Set Bluetooth capabilities on Python executable
|
|
PYTHON_PATH=$(readlink -f /opt/sensorpajen/venv/bin/python3)
|
|
if command -v setcap >/dev/null 2>&1; then
|
|
setcap cap_net_raw,cap_net_admin+eip "$PYTHON_PATH" || {
|
|
echo "Warning: setcap failed. You may need to run Bluetooth operations as root."
|
|
echo "Try: sudo setcap cap_net_raw,cap_net_admin+eip $PYTHON_PATH"
|
|
}
|
|
else
|
|
echo "Warning: setcap not found (install libcap2-bin package)"
|
|
fi
|
|
|
|
# Set ownership of application directory
|
|
chown -R sensorpajen:sensorpajen /opt/sensorpajen
|
|
|
|
# Install systemd service file
|
|
if [ -f /opt/sensorpajen/debian/sensorpajen.service ]; then
|
|
cp /opt/sensorpajen/debian/sensorpajen.service /etc/systemd/system/
|
|
elif [ -f /usr/share/doc/sensorpajen/sensorpajen.service ]; then
|
|
cp /usr/share/doc/sensorpajen/sensorpajen.service /etc/systemd/system/
|
|
fi
|
|
|
|
# Reload systemd
|
|
systemctl daemon-reload
|
|
|
|
# Enable service (but don't start - needs configuration first)
|
|
systemctl enable sensorpajen.service || {
|
|
echo "Warning: Could not enable sensorpajen service"
|
|
}
|
|
|
|
# Check if configuration is ready
|
|
if [ -f /etc/sensorpajen/sensorpajen.env ] && [ -f /etc/sensorpajen/sensors.json ]; then
|
|
# Check if env file has been configured (not default values)
|
|
if grep -q "MQTT_HOST=192.168.0.114" /etc/sensorpajen/sensorpajen.env; then
|
|
echo ""
|
|
echo "======================================================================"
|
|
echo " Configuration needed!"
|
|
echo "======================================================================"
|
|
echo " Edit /etc/sensorpajen/sensorpajen.env with your MQTT settings"
|
|
echo " Edit /etc/sensorpajen/sensors.json with your sensor list"
|
|
echo " Then run: sudo systemctl start sensorpajen"
|
|
echo "======================================================================"
|
|
echo ""
|
|
else
|
|
# Configuration appears to be customized, restart service
|
|
systemctl restart sensorpajen.service && {
|
|
echo "Sensorpajen service started"
|
|
echo "View logs: sudo journalctl -u sensorpajen -f"
|
|
} || {
|
|
echo "Failed to start service. Check: sudo systemctl status sensorpajen"
|
|
}
|
|
fi
|
|
else
|
|
echo ""
|
|
echo "======================================================================"
|
|
echo " Sensorpajen installed successfully!"
|
|
echo "======================================================================"
|
|
echo " Next steps:"
|
|
echo " 1. Edit /etc/sensorpajen/sensorpajen.env"
|
|
echo " 2. Edit /etc/sensorpajen/sensors.json"
|
|
echo " 3. sudo systemctl start sensorpajen"
|
|
echo " 4. sudo journalctl -u sensorpajen -f"
|
|
echo "======================================================================"
|
|
echo ""
|
|
fi
|
|
;;
|
|
|
|
abort-upgrade|abort-remove|abort-deconfigure)
|
|
;;
|
|
|
|
*)
|
|
echo "postinst called with unknown argument \`$1'" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
exit 0
|