#!/usr/bin/env bash # clawd ?????? # ???curl -fsSL https://git.cutos.ai/claw-daemon/clawd/raw/branch/main/install.sh | sudo bash # ?? root ???????? Node.js >= 18 set -e RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' info() { echo -e "${GREEN}[clawd]${NC} $*"; } warn() { echo -e "${YELLOW}[clawd]${NC} $*"; } error() { echo -e "${RED}[clawd]${NC} $*"; exit 1; } # ?? ?? root ???????????????????????????????????????????????????????????????? if [ "$EUID" -ne 0 ]; then error "?? root ?????sudo bash install.sh?" fi # ?? ?? Node.js ????????????????????????????????????????????????????????????? if ! command -v node &>/dev/null; then error "??? Node.js????? Node.js >= 18" fi NODE_VER=$(node -e "process.stdout.write(process.versions.node)") MAJOR=$(echo "$NODE_VER" | cut -d. -f1) if [ "$MAJOR" -lt 18 ]; then error "Node.js ??????? $NODE_VER???? >= 18" fi info "Node.js $NODE_VER ?" # ?? ??/?? dnsmasq?WiFi ??????????????????????????????????????????? if ! command -v dnsmasq &>/dev/null; then info "?? dnsmasq?WiFi ?????..." if command -v apt-get &>/dev/null; then apt-get install -y -qq dnsmasq >/dev/null 2>&1 elif command -v yum &>/dev/null; then yum install -y -q dnsmasq >/dev/null 2>&1 elif command -v apk &>/dev/null; then apk add --quiet dnsmasq >/dev/null 2>&1 else warn "?????? dnsmasq?WiFi ?????????" fi # ?? dnsmasq ???????clawd ????? systemctl disable dnsmasq 2>/dev/null || true systemctl stop dnsmasq 2>/dev/null || true fi if command -v dnsmasq &>/dev/null; then info "dnsmasq ?" fi # ?? ?? NetworkManager?WiFi ??????????????????????????????????????????? if command -v nmcli &>/dev/null; then if ! systemctl is-active --quiet NetworkManager 2>/dev/null; then info "?? NetworkManager..." systemctl enable --now NetworkManager 2>/dev/null || true fi info "NetworkManager ?" # ?? DNS ???????? /etc ?????? NM_DNSMASQ_DIR="/etc/NetworkManager/dnsmasq-shared.d" mkdir -p "$NM_DNSMASQ_DIR" cat > "$NM_DNSMASQ_DIR/clawd-captive.conf" << 'DNSCONF' # clawd captive portal DNS hijack # All DNS queries resolve to gateway to trigger captive portal address=/#/10.42.0.1 DNSCONF info "DNS ??????? $NM_DNSMASQ_DIR ?" fi # ?? WiFi rfkill ??????????? WiFi????????????????????????????????? for rf in /sys/class/rfkill/rfkill*; do if [ -f "$rf/type" ] && [ "$(cat "$rf/type")" = "wlan" ]; then if [ "$(cat "$rf/soft")" = "1" ]; then info "?? WiFi ($(basename "$rf"))..." echo 0 > "$rf/soft" fi fi done # ???????? + systemd ??????????? WiFi RFKILL_SCRIPT="/usr/local/bin/clawd-unblock-wifi.sh" cat > "$RFKILL_SCRIPT" << 'SCRIPT' #!/bin/sh for rf in /sys/class/rfkill/rfkill*; do [ -f "$rf/type" ] || continue if [ "$(cat "$rf/type")" = "wlan" ] && [ "$(cat "$rf/soft")" = "1" ]; then echo 0 > "$rf/soft" echo "clawd-rfkill: unblocked $(basename "$rf")" fi done SCRIPT chmod +x "$RFKILL_SCRIPT" RFKILL_SERVICE="/etc/systemd/system/clawd-rfkill.service" cat > "$RFKILL_SERVICE" << 'UNIT' [Unit] Description=Unblock WiFi for clawd Before=NetworkManager.service clawd.service After=sys-subsystem-net-devices-wlan0.device [Service] Type=oneshot ExecStart=/usr/local/bin/clawd-unblock-wifi.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target UNIT systemctl daemon-reload systemctl enable clawd-rfkill info "WiFi rfkill ??????? ?" # ?? ?? ttyd?Web ??????????????????????????????????????????????????????? info "?? ttyd..." if apt-get install -y ttyd >/dev/null 2>&1; then info "ttyd ??? ?" else warn "ttyd ?????Web ????????" fi # ?? ?? clawd ??????????????????????????????????????????????????????????????? INSTALL_DIR="/opt/clawd" CONFIG_DIR="/etc/clawd" ENV_FILE="$CONFIG_DIR/env" info "??? $INSTALL_DIR ..." mkdir -p "$INSTALL_DIR" cd "$INSTALL_DIR" # ?????????? package.json?????/???????? git/tarball? CUTOS_REPO="https://git.cutos.ai/claw-daemon/clawd.git" if command -v git &>/dev/null && [ -d ".git" ]; then CURRENT_REMOTE=$(git remote get-url origin 2>/dev/null || echo "") if echo "$CURRENT_REMOTE" | grep -q "github.com"; then info "?? git remote ? git.cutos.ai ..." git remote set-url origin "$CUTOS_REPO" fi info "??????..." git fetch origin git reset --hard origin/main git clean -fd elif [ -f "package.json" ]; then info "????????? git??????" elif command -v git &>/dev/null; then git clone --depth=1 "$CUTOS_REPO" . else TARBALL_URL="https://git.cutos.ai/claw-daemon/clawd/archive/main.tar.gz" curl -fsSL "$TARBALL_URL" | tar -xz --strip-components=1 fi # ???? info "?? npm ??..." npm install --omit=dev --silent # ??????? ln -sf "$INSTALL_DIR/bin/clawd.js" /usr/local/bin/clawd chmod +x "$INSTALL_DIR/bin/clawd.js" info "clawd ???? /usr/local/bin/clawd ?" # ?? ?????? + ?????? ?????????????????????????????????????????????? mkdir -p "$CONFIG_DIR" if [ ! -f "$CONFIG_DIR/config.json" ]; then cat > "$CONFIG_DIR/config.json" < "$ENV_FILE" < "$SERVICE_FILE" < "$JOURNAL_CONF" </dev/null || true info "journald ??????? ?" fi # ?? ????? ?????????????????????????????????????????????????????????????? systemctl daemon-reload systemctl enable clawd systemctl restart clawd sleep 2 if systemctl is-active --quiet clawd; then info "clawd ????? ?" echo "" echo " ????? journalctl -u clawd -f" echo " ????? systemctl status clawd" echo " ????? systemctl stop clawd" echo " ????? $CONFIG_DIR/config.json" echo " ????? $ENV_FILE" echo " ????? $CONFIG_DIR/logs/clawd.log" echo "" else warn "?????????????" echo " journalctl -u clawd -n 50 --no-pager" fi