Files
o11pro-unpacked/install.sh
T
2026-06-27 12:39:52 +08:00

232 lines
8.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/sh
# install.sh One-command installer for o11pro-unpacked
#
# Usage:
# sh -c "$(curl -fsSL https://raw.githubusercontent.com/Ap0dexMe0/o11pro-unpacked/main/install.sh)"
# sh -c "$(wget -O- https://raw.githubusercontent.com/Ap0dexMe0/o11pro-unpacked/main/install.sh)"
# sh -c "$(fetch -o - https://raw.githubusercontent.com/Ap0dexMe0/o11pro-unpacked/main/install.sh)"
#
# Environment:
# O11PRO_DIR Install directory (default: /root/o11pro-unpacked, root required)
# O11PRO_PORT Server port (default: 1337)
# O11PRO_VERBOSE Log level 0-5 (default: 2)
# O11PRO_USER Admin username
# O11PRO_PASS Admin password
# O11PRO_YES Skip confirmation prompts (set to 1)
# O11PRO_BRANCH Git branch to clone (default: main)
#
# Options:
# --yes, -y Non-interactive mode (auto-confirm all prompts)
# --help, -h Show this help message
set -eu
REPO_URL="https://github.com/Ap0dexMe0/o11pro-unpacked.git"
REPO_RAW="https://raw.githubusercontent.com/Ap0dexMe0/o11pro-unpacked"
BRANCH="${O11PRO_BRANCH:-main}"
# ─── Parse flags ─────────────────────────────────────────────────────────
FORCE=0
for arg in "$@"; do
case "$arg" in
--yes|-y) FORCE=1 ;;
--help|-h)
sed -n '2,/^$/p' "$0" | sed 's/^# \?//'
exit 0
;;
esac
done
[ "${O11PRO_YES:-0}" = "1" ] && FORCE=1
# ─── Symbols ─────────────────────────────────────────────────────────────
# Use Unicode symbols in bash/zsh, ASCII fallback in POSIX sh (dash).
_ok='*'; _info='>'; _warn='!'; _fail='x'
_test=$(printf '\xE2\x9C\x94' 2>/dev/null) || true
case "$_test" in *\\*) ;; *)
_ok='\xE2\x9C\x94'; _info='\xE2\x96\xB6'; _warn='\xE2\x9A\xA0'; _fail='\xE2\x9C\x98'
esac
ok() { printf " ${_ok} %s %s\n" "$1" "${2-}"; }
info() { printf " ${_info} %s\n" "$1"; }
warn() { printf " ${_warn} %s %s\n" "$1" "${2-}"; }
fail() { printf " ${_fail} %s\n" "$1"; exit 1; }
sep() { printf " ----------------------------------------\n"; }
header(){ printf "\n%s\n%s\n\n" "$1" "${2-}"; }
# ─── Check prerequisites ─────────────────────────────────────────────────
header "o11pro Installer" "One-command setup for o11pro-unpacked"
has_cmd() { command -v "$1" >/dev/null 2>&1; }
info "Checking prerequisites..."
if ! has_cmd git; then
fail "git is required but not installed.\n Install it with your package manager (apt install git, yum install git, etc.)"
fi
ok "git" "$(git --version 2>/dev/null)"
if ! has_cmd python3; then
fail "python3 is required but not installed."
fi
ok "python3" "$(python3 --version 2>/dev/null)"
FETCH_CMD=""
DOWNLOAD_CMD=""
DOWNLOAD_PIPE=""
if has_cmd curl; then
FETCH_CMD="curl -fsSL"
DOWNLOAD_CMD="curl -fsSL -o"
DOWNLOAD_PIPE="curl -fsSL"
ok "curl" "available"
elif has_cmd wget; then
FETCH_CMD="wget -O-"
DOWNLOAD_CMD="wget -O"
DOWNLOAD_PIPE="wget -O-"
ok "wget" "available"
elif has_cmd fetch; then
FETCH_CMD="fetch -o -"
DOWNLOAD_CMD="fetch -o"
DOWNLOAD_PIPE="fetch -o -"
ok "fetch" "available"
else
fail "curl, wget, or fetch is required to download files."
fi
# ─── Determine install directory ─────────────────────────────────────────
INSTALL_DIR="${O11PRO_DIR:-/root/o11pro-unpacked}"
# ─── Root check ──────────────────────────────────────────────────────────
if [ "$(id -u)" -ne 0 ]; then
fail "This installer must be run as root.\n Install directory ${INSTALL_DIR} requires root privileges.\n Try: sudo sh -c \"\$(curl ...)\""
fi
ok "root" "privileges confirmed"
if [ "$FORCE" = "0" ] && [ -d "$INSTALL_DIR" ]; then
printf " Directory %s already exists.\n" "$INSTALL_DIR"
printf " Overwrite? [y/N] "; read -r REPLY
case "$REPLY" in
[yY]|[yY][eE][sS]) ;;
*) fail "Installation cancelled." ;;
esac
fi
# ─── Install ─────────────────────────────────────────────────────────────
sep
info "Installing to $INSTALL_DIR..."
# Ensure parent directory exists
PARENT_DIR=$(dirname "$INSTALL_DIR")
mkdir -p "$PARENT_DIR"
# Clone or update the repository
if [ -d "$INSTALL_DIR/.git" ]; then
info "Updating existing installation..."
cd "$INSTALL_DIR"
git pull --ff-only origin "$BRANCH" 2>/dev/null || {
warn "git pull failed, re-cloning..."
cd /
rm -rf "$INSTALL_DIR"
git clone --depth 1 -b "$BRANCH" "$REPO_URL" "$INSTALL_DIR"
}
else
rm -rf "$INSTALL_DIR"
git clone --depth 1 -b "$BRANCH" "$REPO_URL" "$INSTALL_DIR"
fi
ok "repository" "cloned to $INSTALL_DIR"
cd "$INSTALL_DIR"
# ─── Python virtual environment ──────────────────────────────────────────
VENV_DIR="$INSTALL_DIR/src/venv"
if [ ! -d "$VENV_DIR" ]; then
info "Creating Python virtual environment..."
python3 -m venv "$VENV_DIR"
fi
ok "venv" "ready"
# ─── Install Python dependencies ─────────────────────────────────────────
if [ -f "requirements.txt" ]; then
info "Installing Python dependencies..."
"$VENV_DIR/bin/pip" install --upgrade pip -q 2>/dev/null || true
"$VENV_DIR/bin/pip" install -r requirements.txt -q 2>/dev/null || warn "Some pip packages failed to install"
ok "dependencies" "installed"
fi
# ─── Make binary executable ──────────────────────────────────────────────
BINARY=""
for b in src/o11pro src/o11; do
[ -f "$b" ] && BINARY="$b" && break
done
if [ -n "$BINARY" ]; then
chmod +x "$BINARY"
ok "binary" "ready ($BINARY)"
else
warn "binary" "not found in src/ — check your download"
fi
# Make launcher executable
[ -f "src/RunMe.sh" ] && chmod +x "src/RunMe.sh"
ok "launcher" "ready"
# ─── FFmpeg ──────────────────────────────────────────────────────────────
if has_cmd ffmpeg; then
ok "ffmpeg" "$(ffmpeg -version 2>&1 | head -1 | sed 's/ffmpeg version //' | sed 's/ Copyright.*//')"
else
info "ffmpeg not found — installing..."
if has_cmd apt-get; then
apt-get update -qq && apt-get install -y -qq ffmpeg
elif has_cmd yum; then
yum install -y ffmpeg 2>/dev/null || \
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 2>/dev/null && \
yum install -y ffmpeg ffmpeg-devel
elif has_cmd apk; then
apk add ffmpeg
elif has_cmd zypper; then
zypper install -y ffmpeg
elif has_cmd pacman; then
pacman -S --noconfirm ffmpeg
else
warn "ffmpeg" "could not install automatically — install manually"
fi
if has_cmd ffmpeg; then
ok "ffmpeg" "$(ffmpeg -version 2>&1 | head -1 | sed 's/ffmpeg version //' | sed 's/ Copyright.*//')"
fi
fi
# ─── Create runtime directories ──────────────────────────────────────────
mkdir -p "$INSTALL_DIR/src/hls/live"
mkdir -p "$INSTALL_DIR/src/keys"
mkdir -p "$INSTALL_DIR/src/epg"
mkdir -p "$INSTALL_DIR/src/dl"
mkdir -p "$INSTALL_DIR/src/manifests"
mkdir -p "$INSTALL_DIR/src/offair"
mkdir -p "$INSTALL_DIR/src/overlay"
mkdir -p "$INSTALL_DIR/src/logos"
mkdir -p "$INSTALL_DIR/src/fonts"
mkdir -p "$INSTALL_DIR/src/rec"
mkdir -p "$INSTALL_DIR/src/scripts"
mkdir -p "$INSTALL_DIR/src/logs"
mkdir -p "$INSTALL_DIR/providers"
mkdir -p "$INSTALL_DIR/cache"
ok "directories" "created"
# ─── Done — launch ───────────────────────────────────────────────────────
sep
echo
printf " ${_ok} o11pro installed successfully\n"
echo
printf " Starting o11pro...\n"
echo
# Verify that the launcher exists and is executable
if [ ! -f "$INSTALL_DIR/src/RunMe.sh" ]; then
fail "RunMe.sh not found in src/ — cannot start."
fi
if [ ! -x "$INSTALL_DIR/src/RunMe.sh" ]; then
chmod +x "$INSTALL_DIR/src/RunMe.sh"
fi
cd "$INSTALL_DIR/src"
exec ./RunMe.sh