Cybersecurity-Projects/PROJECTS/beginner/firewall-rule-engine/install.sh

151 lines
4.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# ©AngelaMos | 2026
# install.sh
set -euo pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m'
info() { echo -e "${CYAN}[INFO]${NC} $1"; }
success() { echo -e "${GREEN}[OK]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
fail() { echo -e "${RED}[FAIL]${NC} $1"; exit 1; }
PROJECT="fwrule"
INSTALL_DIR="${HOME}/.local/bin"
echo -e "${BOLD}${CYAN}"
cat << 'BANNER'
┌─────────────────────────────────────────┐
│ FWRULE Installer │
│ Firewall Rule Engine for iptables/nft │
└─────────────────────────────────────────┘
BANNER
echo -e "${NC}"
check_v() {
if command -v v &> /dev/null; then
V_VERSION=$(v version 2>/dev/null || echo "unknown")
success "V compiler found: ${V_VERSION}"
return 0
fi
return 1
}
install_v() {
info "V compiler not found. Installing from source..."
if ! command -v git &> /dev/null; then
fail "git is required to install V. Please install git first."
fi
if ! command -v make &> /dev/null; then
fail "make is required to install V. Please install build tools first."
fi
V_DIR="${HOME}/.local/share/vlang"
if [[ -d "${V_DIR}" ]]; then
info "Updating existing V installation..."
cd "${V_DIR}"
git pull --quiet
else
info "Cloning V repository..."
git clone --depth 1 https://github.com/vlang/v "${V_DIR}"
cd "${V_DIR}"
fi
info "Building V compiler..."
make --quiet
mkdir -p "${INSTALL_DIR}"
ln -sf "${V_DIR}/v" "${INSTALL_DIR}/v"
success "V compiler installed to ${INSTALL_DIR}/v"
if ! echo "$PATH" | grep -q "${INSTALL_DIR}"; then
warn "${INSTALL_DIR} is not in your PATH"
SHELL_NAME=$(basename "${SHELL:-bash}")
case "${SHELL_NAME}" in
zsh) RC_FILE="${HOME}/.zshrc" ;;
fish) RC_FILE="${HOME}/.config/fish/config.fish" ;;
*) RC_FILE="${HOME}/.bashrc" ;;
esac
if [[ "${SHELL_NAME}" == "fish" ]]; then
PATH_LINE="fish_add_path ${INSTALL_DIR}"
else
PATH_LINE="export PATH=\"${INSTALL_DIR}:\$PATH\""
fi
if [[ -f "${RC_FILE}" ]] && grep -q "${INSTALL_DIR}" "${RC_FILE}" 2>/dev/null; then
info "PATH entry already in ${RC_FILE}"
else
echo "${PATH_LINE}" >> "${RC_FILE}"
success "Added ${INSTALL_DIR} to PATH in ${RC_FILE}"
warn "Run 'source ${RC_FILE}' or restart your shell"
fi
export PATH="${INSTALL_DIR}:${PATH}"
fi
}
build_project() {
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "${SCRIPT_DIR}"
info "Building ${PROJECT}..."
mkdir -p bin/
v -prod -o "bin/${PROJECT}" src/
success "Built bin/${PROJECT}"
BINARY_SIZE=$(ls -lh "bin/${PROJECT}" | awk '{print $5}')
info "Binary size: ${BINARY_SIZE}"
}
install_binary() {
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
mkdir -p "${INSTALL_DIR}"
cp "${SCRIPT_DIR}/bin/${PROJECT}" "${INSTALL_DIR}/${PROJECT}"
chmod +x "${INSTALL_DIR}/${PROJECT}"
success "Installed ${PROJECT} to ${INSTALL_DIR}/${PROJECT}"
}
verify_install() {
if command -v "${PROJECT}" &> /dev/null; then
VERSION=$("${PROJECT}" version 2>/dev/null || echo "unknown")
success "Verification passed: ${VERSION}"
else
warn "Binary installed but not found in PATH"
info "Run: ${INSTALL_DIR}/${PROJECT} version"
fi
}
if ! check_v; then
install_v
fi
build_project
install_binary
verify_install
echo ""
echo -e "${GREEN}${BOLD}Installation complete!${NC}"
echo ""
echo -e "${BOLD}Usage:${NC}"
echo " ${PROJECT} load rules.txt"
echo " ${PROJECT} analyze /etc/iptables.rules"
echo " ${PROJECT} harden -s ssh,http,https -f nftables"
echo " ${PROJECT} export rules.txt -f nftables"
echo " ${PROJECT} diff old.rules new.rules"
echo ""
echo -e "${BOLD}Run tests:${NC}"
echo " just test"
echo ""