mirror of
https://github.com/mikkelam/fast-cli.git
synced 2025-12-16 20:04:05 +00:00
Add install script
This commit is contained in:
parent
58491f0710
commit
a86f9384d6
2 changed files with 221 additions and 1 deletions
13
README.md
13
README.md
|
|
@ -16,11 +16,22 @@ A blazingly fast CLI tool for testing internet speed uses fast.com v2 api. Writt
|
||||||
|
|
||||||
- **Tiny binary**: Just 1.2 MiB, no runtime dependencies
|
- **Tiny binary**: Just 1.2 MiB, no runtime dependencies
|
||||||
- **Blazing fast**: Concurrent connections with adaptive chunk sizing
|
- **Blazing fast**: Concurrent connections with adaptive chunk sizing
|
||||||
- **Cross-platform**: Single binary for Linux, macOS, Windows
|
- **Cross-platform**: Single binary for Linux, macOS
|
||||||
- **Smart stopping**: Uses Coefficient of Variation (CoV) algorithm for adaptive test duration
|
- **Smart stopping**: Uses Coefficient of Variation (CoV) algorithm for adaptive test duration
|
||||||
|
|
||||||
|
## Supported Platforms
|
||||||
|
|
||||||
|
- **Linux**: x86_64, aarch64 (ARM64)
|
||||||
|
- **macOS**: x86_64 (Intel), aarch64 (aka Apple Silicon)
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
### Quick Install
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -sSL https://raw.githubusercontent.com/mikkelam/fast-cli/main/install.sh | bash
|
||||||
|
```
|
||||||
|
|
||||||
### Pre-built Binaries
|
### Pre-built Binaries
|
||||||
For example, on an Apple Silicon Mac:
|
For example, on an Apple Silicon Mac:
|
||||||
```bash
|
```bash
|
||||||
|
|
|
||||||
209
install.sh
Executable file
209
install.sh
Executable file
|
|
@ -0,0 +1,209 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Default install location
|
||||||
|
DEFAULT_INSTALL_DIR="/usr/local/bin"
|
||||||
|
INSTALL_DIR="${INSTALL_DIR:-$DEFAULT_INSTALL_DIR}"
|
||||||
|
|
||||||
|
# GitHub repository
|
||||||
|
REPO="mikkelam/fast-cli"
|
||||||
|
BINARY_NAME="fast-cli"
|
||||||
|
|
||||||
|
# Print colored output
|
||||||
|
print_status() {
|
||||||
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_warning() {
|
||||||
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Detect OS and architecture
|
||||||
|
detect_platform() {
|
||||||
|
local os arch
|
||||||
|
|
||||||
|
case "$(uname -s)" in
|
||||||
|
Linux*)
|
||||||
|
os="linux"
|
||||||
|
;;
|
||||||
|
Darwin*)
|
||||||
|
os="macos"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
print_error "Unsupported operating system: $(uname -s)"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "$(uname -m)" in
|
||||||
|
x86_64|amd64)
|
||||||
|
arch="x86_64"
|
||||||
|
;;
|
||||||
|
aarch64|arm64)
|
||||||
|
arch="aarch64"
|
||||||
|
;;
|
||||||
|
armv7l)
|
||||||
|
arch="armv7"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
print_error "Unsupported architecture: $(uname -m)"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "${BINARY_NAME}-${arch}-${os}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get latest release version
|
||||||
|
get_latest_version() {
|
||||||
|
local version
|
||||||
|
version=$(curl -s "https://api.github.com/repos/${REPO}/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
||||||
|
|
||||||
|
if [ -z "$version" ]; then
|
||||||
|
print_error "Failed to get latest version"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$version"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Download and install
|
||||||
|
install_fast_cli() {
|
||||||
|
local platform version download_url temp_dir
|
||||||
|
|
||||||
|
print_status "Detecting platform..."
|
||||||
|
platform=$(detect_platform)
|
||||||
|
print_status "Platform detected: $platform"
|
||||||
|
|
||||||
|
print_status "Getting latest version..."
|
||||||
|
version=$(get_latest_version)
|
||||||
|
print_status "Latest version: $version"
|
||||||
|
|
||||||
|
# Create download URL
|
||||||
|
download_url="https://github.com/${REPO}/releases/latest/download/${platform}.tar.gz"
|
||||||
|
|
||||||
|
# Create temporary directory
|
||||||
|
temp_dir=$(mktemp -d)
|
||||||
|
trap "rm -rf $temp_dir" EXIT
|
||||||
|
|
||||||
|
print_status "Downloading fast-cli..."
|
||||||
|
if ! curl -L --fail --silent --show-error "$download_url" -o "$temp_dir/fast-cli.tar.gz"; then
|
||||||
|
print_error "Failed to download fast-cli from $download_url"
|
||||||
|
print_error "Please check if a release exists for your platform"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_status "Extracting archive..."
|
||||||
|
if ! tar -xzf "$temp_dir/fast-cli.tar.gz" -C "$temp_dir"; then
|
||||||
|
print_error "Failed to extract archive"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if we need sudo for installation
|
||||||
|
if [ ! -w "$INSTALL_DIR" ]; then
|
||||||
|
if [ "$INSTALL_DIR" = "$DEFAULT_INSTALL_DIR" ]; then
|
||||||
|
print_warning "Installing to $INSTALL_DIR requires sudo privileges"
|
||||||
|
SUDO="sudo"
|
||||||
|
else
|
||||||
|
print_error "No write permission to $INSTALL_DIR"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_status "Installing to $INSTALL_DIR..."
|
||||||
|
$SUDO mkdir -p "$INSTALL_DIR"
|
||||||
|
$SUDO cp "$temp_dir/$BINARY_NAME" "$INSTALL_DIR/$BINARY_NAME"
|
||||||
|
$SUDO chmod +x "$INSTALL_DIR/$BINARY_NAME"
|
||||||
|
|
||||||
|
print_status "Installation complete!"
|
||||||
|
echo
|
||||||
|
echo -e "${GREEN}✓${NC} fast-cli installed to $INSTALL_DIR/$BINARY_NAME"
|
||||||
|
echo
|
||||||
|
echo "Try it out:"
|
||||||
|
echo " $BINARY_NAME --help"
|
||||||
|
echo " $BINARY_NAME --json"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show usage
|
||||||
|
show_usage() {
|
||||||
|
cat << EOF
|
||||||
|
Fast-CLI Installer
|
||||||
|
|
||||||
|
Usage: $0 [OPTIONS]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--prefix DIR Install to custom directory (default: $DEFAULT_INSTALL_DIR)
|
||||||
|
--help Show this help message
|
||||||
|
|
||||||
|
Environment Variables:
|
||||||
|
INSTALL_DIR Custom installation directory
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
# Install to default location
|
||||||
|
$0
|
||||||
|
|
||||||
|
# Install to custom directory
|
||||||
|
$0 --prefix /opt/bin
|
||||||
|
INSTALL_DIR=/opt/bin $0
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse command line arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--prefix)
|
||||||
|
INSTALL_DIR="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--help|-h)
|
||||||
|
show_usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
print_error "Unknown option: $1"
|
||||||
|
show_usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check dependencies
|
||||||
|
check_dependencies() {
|
||||||
|
local missing_deps=()
|
||||||
|
|
||||||
|
for cmd in curl tar; do
|
||||||
|
if ! command -v "$cmd" > /dev/null 2>&1; then
|
||||||
|
missing_deps+=("$cmd")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ${#missing_deps[@]} -ne 0 ]; then
|
||||||
|
print_error "Missing required dependencies: ${missing_deps[*]}"
|
||||||
|
print_error "Please install them and try again"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main
|
||||||
|
main() {
|
||||||
|
echo "Fast-CLI Installer"
|
||||||
|
echo "=================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
check_dependencies
|
||||||
|
install_fast_cli
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
||||||
Loading…
Add table
Reference in a new issue