201 lines
5.7 KiB
Bash
201 lines
5.7 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# Install socktop binaries and man pages
|
||
|
|
# This script builds the binaries, generates man pages, and installs everything
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
|
|
|
||
|
|
# Color output
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
BLUE='\033[0;34m'
|
||
|
|
NC='\033[0m' # No Color
|
||
|
|
|
||
|
|
print_header() {
|
||
|
|
echo -e "${BLUE}==>${NC} ${1}"
|
||
|
|
}
|
||
|
|
|
||
|
|
print_success() {
|
||
|
|
echo -e "${GREEN}✓${NC} ${1}"
|
||
|
|
}
|
||
|
|
|
||
|
|
print_error() {
|
||
|
|
echo -e "${RED}✗${NC} ${1}"
|
||
|
|
}
|
||
|
|
|
||
|
|
print_warning() {
|
||
|
|
echo -e "${YELLOW}!${NC} ${1}"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Parse arguments
|
||
|
|
SYSTEM_INSTALL=false
|
||
|
|
MAN_ONLY=false
|
||
|
|
|
||
|
|
while [ $# -gt 0 ]; do
|
||
|
|
case "$1" in
|
||
|
|
--system)
|
||
|
|
SYSTEM_INSTALL=true
|
||
|
|
shift
|
||
|
|
;;
|
||
|
|
--man-only)
|
||
|
|
MAN_ONLY=true
|
||
|
|
shift
|
||
|
|
;;
|
||
|
|
--help|-h)
|
||
|
|
echo "Usage: $0 [OPTIONS]"
|
||
|
|
echo ""
|
||
|
|
echo "Build and install socktop binaries and man pages"
|
||
|
|
echo ""
|
||
|
|
echo "Options:"
|
||
|
|
echo " --system Install system-wide (requires sudo)"
|
||
|
|
echo " --man-only Only install man pages (skip binary build)"
|
||
|
|
echo " --help Show this help message"
|
||
|
|
echo ""
|
||
|
|
echo "Examples:"
|
||
|
|
echo " $0 # Build and install for current user"
|
||
|
|
echo " sudo $0 --system # Build and install system-wide"
|
||
|
|
echo " $0 --man-only # Only install man pages"
|
||
|
|
exit 0
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
print_error "Unknown option: $1"
|
||
|
|
echo "Run '$0 --help' for usage information"
|
||
|
|
exit 1
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
done
|
||
|
|
|
||
|
|
cd "$PROJECT_ROOT"
|
||
|
|
|
||
|
|
# Step 1: Build binaries (unless --man-only)
|
||
|
|
if [ "$MAN_ONLY" = false ]; then
|
||
|
|
print_header "Building binaries..."
|
||
|
|
cargo build --release
|
||
|
|
print_success "Binaries built successfully"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Step 2: Extract generated man pages from OUT_DIR
|
||
|
|
print_header "Extracting generated man pages..."
|
||
|
|
|
||
|
|
# Find the build output directory
|
||
|
|
SOCKTOP_OUT_DIR=$(find target/release/build/socktop-*/out -type d -name "man" 2>/dev/null | head -1)
|
||
|
|
AGENT_OUT_DIR=$(find target/release/build/socktop_agent-*/out -type d -name "man" 2>/dev/null | head -1)
|
||
|
|
|
||
|
|
if [ -z "$SOCKTOP_OUT_DIR" ] || [ -z "$AGENT_OUT_DIR" ]; then
|
||
|
|
print_error "Generated man pages not found. Building to generate them..."
|
||
|
|
cargo build --release
|
||
|
|
SOCKTOP_OUT_DIR=$(find target/release/build/socktop-*/out -type d -name "man" 2>/dev/null | head -1)
|
||
|
|
AGENT_OUT_DIR=$(find target/release/build/socktop_agent-*/out -type d -name "man" 2>/dev/null | head -1)
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ -z "$SOCKTOP_OUT_DIR" ] || [ ! -f "$SOCKTOP_OUT_DIR/socktop.1" ]; then
|
||
|
|
print_error "Failed to find generated socktop.1 man page"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ -z "$AGENT_OUT_DIR" ] || [ ! -f "$AGENT_OUT_DIR/socktop_agent.1" ]; then
|
||
|
|
print_error "Failed to find generated socktop_agent.1 man page"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
print_success "Found generated man pages"
|
||
|
|
|
||
|
|
# Step 3: Determine installation directories
|
||
|
|
if [ "$SYSTEM_INSTALL" = true ]; then
|
||
|
|
if [ "$EUID" -ne 0 ]; then
|
||
|
|
print_error "System-wide installation requires root privileges"
|
||
|
|
echo "Please run with sudo: sudo $0 --system"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
BIN_DIR="/usr/local/bin"
|
||
|
|
MAN_DIR="/usr/local/share/man/man1"
|
||
|
|
else
|
||
|
|
BIN_DIR="$HOME/.cargo/bin"
|
||
|
|
MAN_DIR="$HOME/.local/share/man/man1"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Step 4: Install binaries (unless --man-only)
|
||
|
|
if [ "$MAN_ONLY" = false ]; then
|
||
|
|
print_header "Installing binaries to $BIN_DIR..."
|
||
|
|
|
||
|
|
if [ "$SYSTEM_INSTALL" = true ]; then
|
||
|
|
install -m 755 target/release/socktop "$BIN_DIR/socktop"
|
||
|
|
install -m 755 target/release/socktop_agent "$BIN_DIR/socktop_agent"
|
||
|
|
else
|
||
|
|
# For user install, cargo already puts binaries in ~/.cargo/bin
|
||
|
|
# But we can copy from release if needed
|
||
|
|
if [ ! -f "$BIN_DIR/socktop" ]; then
|
||
|
|
cp target/release/socktop "$BIN_DIR/"
|
||
|
|
chmod 755 "$BIN_DIR/socktop"
|
||
|
|
fi
|
||
|
|
if [ ! -f "$BIN_DIR/socktop_agent" ]; then
|
||
|
|
cp target/release/socktop_agent "$BIN_DIR/"
|
||
|
|
chmod 755 "$BIN_DIR/socktop_agent"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
print_success "Binaries installed to $BIN_DIR"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Step 5: Install man pages
|
||
|
|
print_header "Installing man pages to $MAN_DIR..."
|
||
|
|
|
||
|
|
mkdir -p "$MAN_DIR"
|
||
|
|
|
||
|
|
if [ "$SYSTEM_INSTALL" = true ]; then
|
||
|
|
install -m 644 "$SOCKTOP_OUT_DIR/socktop.1" "$MAN_DIR/socktop.1"
|
||
|
|
install -m 644 "$AGENT_OUT_DIR/socktop_agent.1" "$MAN_DIR/socktop_agent.1"
|
||
|
|
else
|
||
|
|
cp "$SOCKTOP_OUT_DIR/socktop.1" "$MAN_DIR/socktop.1"
|
||
|
|
cp "$AGENT_OUT_DIR/socktop_agent.1" "$MAN_DIR/socktop_agent.1"
|
||
|
|
chmod 644 "$MAN_DIR/socktop.1"
|
||
|
|
chmod 644 "$MAN_DIR/socktop_agent.1"
|
||
|
|
fi
|
||
|
|
|
||
|
|
print_success "Man pages installed to $MAN_DIR"
|
||
|
|
|
||
|
|
# Update man database if available
|
||
|
|
if [ "$SYSTEM_INSTALL" = true ]; then
|
||
|
|
if command -v mandb &>/dev/null; then
|
||
|
|
print_header "Updating man database..."
|
||
|
|
mandb 2>/dev/null || true
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Final summary
|
||
|
|
echo ""
|
||
|
|
print_success "Installation complete!"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
if [ "$MAN_ONLY" = false ]; then
|
||
|
|
echo "Binaries installed:"
|
||
|
|
echo " socktop -> $BIN_DIR/socktop"
|
||
|
|
echo " socktop_agent -> $BIN_DIR/socktop_agent"
|
||
|
|
echo ""
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "Man pages installed:"
|
||
|
|
echo " socktop(1) -> $MAN_DIR/socktop.1"
|
||
|
|
echo " socktop_agent(1) -> $MAN_DIR/socktop_agent.1"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo "Try it out:"
|
||
|
|
if [ "$MAN_ONLY" = false ]; then
|
||
|
|
echo " socktop --help"
|
||
|
|
echo " socktop_agent --help"
|
||
|
|
fi
|
||
|
|
echo " man socktop"
|
||
|
|
echo " man socktop_agent"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Check if MANPATH needs updating for user install
|
||
|
|
if [ "$SYSTEM_INSTALL" = false ]; then
|
||
|
|
if ! man -w socktop &>/dev/null 2>&1; then
|
||
|
|
print_warning "If 'man socktop' doesn't work, add to your shell rc file:"
|
||
|
|
echo " export MANPATH=\"\$HOME/.local/share/man:\$MANPATH\""
|
||
|
|
fi
|
||
|
|
fi
|