Files
clawd/install.sh

291 lines
7.8 KiB
Bash

#!/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" <<EOF
{
"server": "wss://claw.cutos.ai/ws",
"claw_id": null,
"token": null,
"heartbeat_interval": 30
}
EOF
info "????????$CONFIG_DIR/config.json ?"
fi
if [ ! -f "$ENV_FILE" ]; then
cat > "$ENV_FILE" <<EOF
# clawd ?????systemd EnvironmentFile?
# ????: debug / info / warn / error
CLAWD_LOG_LEVEL=info
# ????????0=? journald?
CLAWD_LOG_FILE=1
# ????????????? config.json?
# CLAWD_SERVER=wss://claw.cutos.ai/ws
# BtMonitor?bluetoothctl??????????????? CLAWD_DISABLE_BT?
# ???????????????????
# CLAWD_ENABLE_BT=1
# OpenVFD sysfs ?????? /sys/class/leds/openvfd?
# CLAWD_OPENVFD_PATH=/sys/class/leds/openvfd
# ??? vfdservice ????? /tmp/openvfd_service?
# CLAWD_VFD_PIPE=/tmp/openvfd_service
# ???/??????? LAN ???????????? clawd ?????? carrier ??
# CLAWD_ETH_IFACE=end0
EOF
info "??????????$ENV_FILE ?"
fi
# ?? ?????? ?????????????????????????????????????????????????????????????
mkdir -p "$CONFIG_DIR/logs"
info "?????$CONFIG_DIR/logs ?"
# ?? ?? systemd service ????????????????????????????????????????????????????
NODE_BIN=$(command -v node)
SERVICE_FILE="/etc/systemd/system/clawd.service"
cat > "$SERVICE_FILE" <<EOF
[Unit]
Description=Claw Box Daemon
Documentation=https://git.cutos.ai/claw-daemon/clawd
After=NetworkManager.service
Wants=NetworkManager.service
[Service]
Type=simple
# systemd-notify ????????? NotifyAccess=main ????? all ??? WatchdogSec
NotifyAccess=all
EnvironmentFile=$ENV_FILE
ExecStart=$NODE_BIN $INSTALL_DIR/bin/clawd.js
WorkingDirectory=$INSTALL_DIR
# ????
Restart=always
RestartSec=5
# ?? systemd ?? StartLimitIntervalSec?? StartLimitInterval=???
StartLimitInterval=300
StartLimitBurst=10
# ?????10s ? SIGTERM??? SIGKILL?
TimeoutStopSec=10
KillMode=mixed
KillSignal=SIGTERM
# ??????????
MemoryMax=256M
CPUQuota=50%
TasksMax=64
# ?????ttyd ????? setuid sudo???? NoNewPrivileges/strict?
ProtectSystem=full
ReadWritePaths=$CONFIG_DIR /tmp
# ??
StandardOutput=journal
StandardError=journal
SyslogIdentifier=clawd
# systemd Watchdog?60s ????????
WatchdogSec=60
[Install]
WantedBy=multi-user.target
EOF
info "systemd ??????? ?"
# ?? journald ???????? ????????????????????????????????????????????????
JOURNAL_CONF="/etc/systemd/journald.conf.d/clawd.conf"
if [ ! -f "$JOURNAL_CONF" ]; then
mkdir -p /etc/systemd/journald.conf.d
cat > "$JOURNAL_CONF" <<EOF
# clawd journald ??
[Journal]
SystemMaxUse=100M
MaxFileSec=7day
EOF
systemctl restart systemd-journald 2>/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