From db1ef55b30f7a2e968aff577ad648fa46d060987 Mon Sep 17 00:00:00 2001 From: naocanmonster Date: Mon, 26 Jun 2023 16:03:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E5=AE=89=E8=A3=85?= =?UTF-8?q?=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup.sh | 203 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 176 insertions(+), 27 deletions(-) diff --git a/setup.sh b/setup.sh index 2d6ffde..ff374c5 100755 --- a/setup.sh +++ b/setup.sh @@ -1,11 +1,4 @@ -#! /bin/bash -set -eE - -abort() -{ - echo $1 - exit 1 -} +#!/bin/bash echo " ____ __ _ _ @@ -15,32 +8,188 @@ echo " |____/ \__,_| |_| \___| |_____| |_| |_| |_| \___| " -if [[ "$#" -ne "0" ]]; then - echo "Usage: run "$0" to set up Safeline CE at current working directory." - exit 0 -fi +qrcode() { + echo + echo "█████████████████████████████████████████" + echo "█████████████████████████████████████████" + echo "████ ▄▄▄▄▄ █▀█ █▄█▀▀ ██▄▀▄▀▄██ ▄▄▄▄▄ ████" + echo "████ █ █ █▀▀▀█ ▀▄ █▀█▄ ▄ ▀█ █ █ ████" + echo "████ █▄▄▄█ █▀ █▀▀▀▄▀ ▀ ▄▀▀▀▄▄█ █▄▄▄█ ████" + echo "████▄▄▄▄▄▄▄█▄▀ ▀▄█ ▀ █ ▀▄▀ █▄█▄▄▄▄▄▄▄████" + echo "████▄ ▄ ▀▄ ▄▀▄▀▄▀▄▄▄▄▀▀██ ▄▄▀▄█▄▀ ▀████" + echo "████▄▄▄▄▀█▄▄▄█▄█▀██▄▄▄ ██▀ ▀█▀▄██▄▀▄█████" + echo "████ ▄█▄▄ ▄▄ ▄▄█▄▀█▄▀▄▀▀▄▀▀ ▄ ▀▄▄▄█▀▀████" + echo "█████▄████▄█▀ ▄ ▄▄█ █▄██ ▀▀█▄█▄█▀▄█████" + echo "██████ █▀▄▄█▄▄ ▄▀▀█▄▄▄▀▀▄▀▄▀▄▄▀█▄▀█ ▀████" + echo "████▀▄██▀ ▄▄ ▀█▀ ▄ █▄▀█ ▀▄▀▄▀▄▄ ▄▀▄█████" + echo "████ ▄▄█▀ ▄█▀ ██▄█▄▄▄▄▀▀▄▀▀ ▄▀ ▄▀█ ▀████" + echo "████ █ ██▄▄█▄█▄ ▄█▀ ▀███▄ ██▀▄ ▀ ▀▄█████" + echo "████▄██▄▄█▄█ ▀▄▀▀▀▄▄▄▄▀▀▀▀▀ ▄▄▄ ▀█ ████" + echo "████ ▄▄▄▄▄ █▄ ▄█▀ ▄ ▀█▀▀█ ▀ █▄█ ▀ ▀████" + echo "████ █ █ █ ▀▄█▄█▄▄▀▄▀▀▄▀▀▀ ▄▄ ▀█ ████" + echo "████ █▄▄▄█ █ █ ▄█▀ ▄█▀█▀ █▀▄▀ ▀▀ ▀██████" + echo "████▄▄▄▄▄▄▄█▄▄█▄███▄█▄████▄▄▄█▄▄█▄█▄█████" + echo "█████████████████████████████████████████" + echo "█████████████████████████████████████████" + echo + echo "微信扫描上方二维码加入雷池项目讨论组" +} + +command_exists() { + command -v "$1" 2>&1 +} + +space_left() { + dir="$1" + while [ ! -d "$dir" ]; do + dir=`dirname "$dir"`; + done + echo `df -h "$dir" --output='avail' | tail -n 1` +} + +confirm() { + echo -e -n "\033[34m[SafeLine] $* \033[1;36m(Y/n)\033[0m" + read -n 1 -s opt + + [[ "$opt" == $'\n' ]] || echo + + case "$opt" in + 'y' | 'Y' ) return 0;; + 'n' | 'N' ) return 1;; + *) confirm "$1";; + esac +} + +info() { + echo -e "\033[37m[SafeLine] $*\033[0m" +} + +warning() { + echo -e "\033[33m[SafeLine] $*\033[0m" +} + +abort() { + qrcode + echo -e "\033[31m[SafeLine] $*\033[0m" + exit 1 +} + +safeline_path='/data/safeline' + +if [[ "$#" -ne "0" ]]; then + abort "当前脚本无需任何参数, 直接运行即可" +fi +info "运行参数确认正常" + +if [ "$EUID" -ne "0" ]; then + abort "请以 root 权限运行" +fi +info "运行权限确认正常" + +if [ -z `command_exists docker` ]; then + warning "缺少 Docker 环境" + if confirm "是否需要自动安装 Docker"; then + curl -sSLk https://get.docker.com/ | bash + if [ $? -ne "0" ]; then + abort "Docker 安装失败" + fi + info "Docker 安装完成" + else + abort "中止安装" + fi +fi +info "发现 Docker 环境: '`command -v docker`'" + +docker version > /dev/null 2>&1 +if [ $? -ne "0" ]; then + abort "Docker 服务工作异常" +fi +info "Docker 工作状态正常" -command -v docker > /dev/null || abort "docker not found, unable to deploy" compose_plugin=true compose_command="docker compose" -docker --help | grep compose | grep v2 > /dev/null || compose_plugin=false || compose_command="docker-compose" +docker compose version > /dev/null 2>&1 || compose_plugin=false || compose_command="docker-compose" if [[ "x${compose_plugin}" = "xfalse" ]]; then - command -v docker-compose > /dev/null && docker-compose --version | grep v2 > /dev/null || abort "docker compose v2 not found, unable to deploy" + warning "未发现 Docker Compose Plugin" + if [ -z `command_exists "docker-compose"` ]; then + warning "未发现 docker-compose 组件" + if confirm "是否需要自动安装 Docker Compose Plugin"; then + curl -sSLk https://get.docker.com/ | bash + if [ $? -ne "0" ]; then + abort "Docker Compose Plugin 安装失败" + fi + info "Docker Compose Plugin 安装完成" + compose_plugin=true + compose_command="docker compose" + else + abort "中止安装" + fi + else + info "发现 docker-compose 组件: '`command -v docker-compose`'" + fi +else + info "发现 Docker Compose Plugin" fi -COMPOSE_YAML="compose.yaml" -wget https://waf-ce.chaitin.cn/release/latest/compose.yaml --no-check-certificate -O ${COMPOSE_YAML} +while true; do + echo -e -n "\033[34m[SafeLine] 雷池安装目录 (留空则为 '$safeline_path'): \033[0m" + read input_path + [[ -z "$input_path" ]] && input_path=$safeline_path -ENV_FILE=".env" -if [[ ! -f ${ENV_FILE} ]]; then - echo "SAFELINE_DIR=$(pwd)" >> .env - echo "IMAGE_TAG=latest" >> .env - echo "MGT_PORT=9443" >> .env - echo "POSTGRES_PASSWORD=$(LC_ALL=C tr -dc A-Za-z0-9 > .env - echo "SUBNET_PREFIX=169.254.0" >> .env + if [[ ! $input_path == /* ]]; then + warning "'$input_path' 不是合法的绝对路径" + continue + fi + + if [ -f "$input_path" ] || [ -d "$input_path" ]; then + warning "'$input_path' 路径已经存在, 请换一个" + continue + fi + + safeline_path=$input_path + + if confirm "目录 '$safeline_path' 当前剩余存储空间为 `space_left \"$safeline_path\"` , 雷池至少需要 5G, 是否确定"; then + break + fi +done + +mkdir -p "$safeline_path" +if [ $? -ne "0" ]; then + abort "创建安装目录 '$safeline_path' 失败" +fi +info "创建安装目录 '$safeline_path' 成功" +cd "$safeline_path" + +wget "https://waf-ce.chaitin.cn/release/latest/compose.yaml" --no-check-certificate -O compose.yaml +if [ $? -ne "0" ]; then + abort "下载 compose.yaml 脚本失败" +fi +info "下载 compose.yaml 脚本成功" + +touch ".env" +if [ $? -ne "0" ]; then + abort "创建 .env 脚本失败" +fi +info "创建 .env 脚本成功" + +echo "SAFELINE_DIR=$safeline_path" >> .env +echo "IMAGE_TAG=latest" >> .env +echo "MGT_PORT=9443" >> .env +echo "POSTGRES_PASSWORD=$(LC_ALL=C tr -dc A-Za-z0-9 > .env +echo "REDIS_PASSWORD=$(LC_ALL=C tr -dc A-Za-z0-9 > .env +echo "SUBNET_PREFIX=169.254.0" >> .env + +info "即将开始下载 Docker 镜像" + +$compose_command up -d + +if [ $? -ne "0" ]; then + abort "启动 Docker 容器失败" fi -echo "Setup success!" -echo "Run '$compose_command up -d' to start SafeLine." -echo "And then visit https://:9443." +qrcode + +warning "雷池 WAF 社区版安装成功, 请访问以下地址访问控制台" +warning "https://0.0.0.0:9443/" +