Files
oculog/clients/ubuntu/install.sh
2026-02-12 14:52:37 -06:00

190 lines
6.6 KiB
Bash
Executable File

#!/bin/bash
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo -e "${GREEN}Oculog Client Installation${NC}"
echo "=================================="
echo ""
# Check if running as root
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}Please run as root (use sudo)${NC}"
exit 1
fi
# Check if Python 3 is installed
if ! command -v python3 &> /dev/null; then
echo -e "${RED}Python 3 is not installed. Please install it first:${NC}"
echo " sudo apt update && sudo apt install -y python3 python3-pip"
exit 1
fi
# Get installation directory
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
INSTALL_DIR="/opt/oculog"
# Check if this is an upgrade
IS_UPGRADE=false
SERVICE_WAS_RUNNING=false
SERVICE_WAS_ENABLED=false
# Check if service unit file exists
if [ -f /etc/systemd/system/oculog-client.service ] || systemctl list-unit-files | grep -q "^oculog-client.service"; then
IS_UPGRADE=true
echo -e "${YELLOW}Detected existing installation - performing upgrade...${NC}"
echo ""
# Check if service is enabled
if systemctl is-enabled --quiet oculog-client.service 2>/dev/null; then
SERVICE_WAS_ENABLED=true
fi
# Check if service is running
if systemctl is-active --quiet oculog-client.service 2>/dev/null; then
SERVICE_WAS_RUNNING=true
echo -e "${YELLOW}Service is currently running. Stopping it...${NC}"
systemctl stop oculog-client.service || true
sleep 1
if systemctl is-active --quiet oculog-client.service 2>/dev/null; then
echo -e "${RED}Warning: Service did not stop cleanly${NC}"
else
echo -e "${GREEN}Service stopped${NC}"
fi
fi
else
echo -e "${GREEN}Fresh installation detected${NC}"
echo ""
fi
echo -e "${GREEN}Step 1: Creating installation directory...${NC}"
mkdir -p "$INSTALL_DIR"
mkdir -p /var/log/oculog
mkdir -p /etc/oculog
echo -e "${GREEN}Step 2: Copying client files...${NC}"
cp "$SCRIPT_DIR/client.py" "$INSTALL_DIR/"
chmod +x "$INSTALL_DIR/client.py"
echo -e "${GREEN}Step 3: Installing Python dependencies...${NC}"
# Try to install via apt first (for newer Ubuntu versions with externally-managed environment)
if apt-cache show python3-psutil >/dev/null 2>&1 && apt-cache show python3-requests >/dev/null 2>&1; then
echo -e "${YELLOW}Installing via apt (system-managed packages)...${NC}"
apt-get update
if apt-get install -y python3-psutil python3-requests; then
PYTHON_BIN="/usr/bin/python3"
echo -e "${GREEN}System packages installed successfully${NC}"
else
echo -e "${YELLOW}Apt installation failed, using virtual environment...${NC}"
USE_VENV=1
fi
else
echo -e "${YELLOW}System packages not available, using virtual environment...${NC}"
USE_VENV=1
fi
# If apt packages aren't available, use a virtual environment
if [ "$USE_VENV" = "1" ]; then
if [ -d "$INSTALL_DIR/venv" ]; then
echo -e "${YELLOW}Updating existing virtual environment...${NC}"
PYTHON_BIN="$INSTALL_DIR/venv/bin/python3"
else
echo -e "${YELLOW}Setting up virtual environment...${NC}"
apt-get update
apt-get install -y python3-venv python3-pip || true
# Create virtual environment
python3 -m venv "$INSTALL_DIR/venv"
PYTHON_BIN="$INSTALL_DIR/venv/bin/python3"
fi
# Install/upgrade packages in virtual environment
"$INSTALL_DIR/venv/bin/pip" install --quiet --upgrade pip
"$INSTALL_DIR/venv/bin/pip" install --quiet --upgrade -r "$SCRIPT_DIR/requirements.txt"
echo -e "${GREEN}Virtual environment ready and packages installed${NC}"
fi
# Update shebang in client script to use correct Python
sed -i "1s|.*|#!${PYTHON_BIN}|" "$INSTALL_DIR/client.py"
echo -e "${GREEN}Step 4: Creating symlink...${NC}"
ln -sf "$INSTALL_DIR/client.py" /usr/local/bin/oculog-client
echo -e "${GREEN}Step 5: Setting up configuration...${NC}"
if [ ! -f /etc/oculog/client.conf ]; then
# Fresh installation - create new config
if [ -f "$SCRIPT_DIR/client.conf.example" ]; then
cp "$SCRIPT_DIR/client.conf.example" /etc/oculog/client.conf
echo -e "${YELLOW}Configuration file created at /etc/oculog/client.conf${NC}"
echo -e "${YELLOW}Please edit it with your server URL and server ID${NC}"
else
cat > /etc/oculog/client.conf << EOF
{
"server_url": "http://localhost:3001",
"server_id": "$(hostname)",
"interval": 30
}
EOF
echo -e "${YELLOW}Default configuration created at /etc/oculog/client.conf${NC}"
fi
else
# Existing installation - preserve config
if [ "$IS_UPGRADE" = true ]; then
# Backup existing config before upgrade
BACKUP_FILE="/etc/oculog/client.conf.backup.$(date +%Y%m%d_%H%M%S)"
cp /etc/oculog/client.conf "$BACKUP_FILE"
echo -e "${GREEN}Configuration file preserved (backup: $BACKUP_FILE)${NC}"
else
echo -e "${GREEN}Configuration file already exists, preserving...${NC}"
fi
fi
echo -e "${GREEN}Step 6: Installing systemd service...${NC}"
# Update service file to use correct Python binary
sed "s|ExecStart=/usr/local/bin/oculog-client|ExecStart=${PYTHON_BIN} $INSTALL_DIR/client.py|" "$SCRIPT_DIR/oculog-client.service" > /etc/systemd/system/oculog-client.service
systemctl daemon-reload
systemctl enable oculog-client.service
# Restart service if it was running before upgrade
if [ "$IS_UPGRADE" = true ]; then
if [ "$SERVICE_WAS_RUNNING" = true ] || [ "$SERVICE_WAS_ENABLED" = true ]; then
echo -e "${GREEN}Step 7: Starting service...${NC}"
systemctl start oculog-client.service || true
sleep 2
if systemctl is-active --quiet oculog-client.service 2>/dev/null; then
echo -e "${GREEN}Service started successfully${NC}"
else
echo -e "${YELLOW}Warning: Service may have failed to start. Check status with: systemctl status oculog-client${NC}"
fi
fi
fi
echo ""
if [ "$IS_UPGRADE" = true ]; then
echo -e "${GREEN}Upgrade completed successfully!${NC}"
else
echo -e "${GREEN}Installation completed successfully!${NC}"
fi
echo ""
if [ "$IS_UPGRADE" = false ]; then
echo "Next steps:"
echo "1. Edit /etc/oculog/client.conf with your server URL"
echo "2. Start the service: sudo systemctl start oculog-client"
echo "3. Check status: sudo systemctl status oculog-client"
echo "4. View logs: sudo journalctl -u oculog-client -f"
else
echo "Upgrade complete. Service status:"
systemctl status oculog-client.service --no-pager -l || true
echo ""
echo "View logs: sudo journalctl -u oculog-client -f"
fi
echo ""