fix: rewrite install.sh in English to avoid Windows encoding corruption; bump v1.2.3
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
142
install.sh
142
install.sh
@@ -1,7 +1,7 @@
|
||||
#!/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
|
||||
#!/usr/bin/env bash
|
||||
# clawd one-click install script
|
||||
# Usage: curl -fsSL https://git.cutos.ai/claw-daemon/clawd/raw/branch/main/install.sh | sudo bash
|
||||
# Requires root and Node.js >= 18
|
||||
|
||||
set -e
|
||||
|
||||
@@ -11,26 +11,26 @@ info() { echo -e "${GREEN}[clawd]${NC} $*"; }
|
||||
warn() { echo -e "${YELLOW}[clawd]${NC} $*"; }
|
||||
error() { echo -e "${RED}[clawd]${NC} $*"; exit 1; }
|
||||
|
||||
# ?? ?? root ????????????????????????????????????????????????????????????????
|
||||
# -- check root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
error "?? root ?????sudo bash install.sh?"
|
||||
error "Please run as root: sudo bash install.sh"
|
||||
fi
|
||||
|
||||
# ?? ?? Node.js ?????????????????????????????????????????????????????????????
|
||||
# -- check Node.js
|
||||
if ! command -v node &>/dev/null; then
|
||||
error "??? Node.js????? Node.js >= 18"
|
||||
error "Node.js not found. Please install Node.js >= 18 first."
|
||||
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"
|
||||
error "Node.js version too low (current: $NODE_VER). Need >= 18."
|
||||
fi
|
||||
info "Node.js $NODE_VER ?"
|
||||
info "Node.js $NODE_VER OK"
|
||||
|
||||
# ?? ??/?? dnsmasq?WiFi ???????????????????????????????????????????
|
||||
# -- install dnsmasq (needed for WiFi provisioning)
|
||||
if ! command -v dnsmasq &>/dev/null; then
|
||||
info "?? dnsmasq?WiFi ?????..."
|
||||
info "Installing dnsmasq..."
|
||||
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
|
||||
@@ -38,25 +38,23 @@ if ! command -v dnsmasq &>/dev/null; then
|
||||
elif command -v apk &>/dev/null; then
|
||||
apk add --quiet dnsmasq >/dev/null 2>&1
|
||||
else
|
||||
warn "?????? dnsmasq?WiFi ?????????"
|
||||
warn "Cannot auto-install dnsmasq. WiFi provisioning may not work."
|
||||
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 ?"
|
||||
info "dnsmasq OK"
|
||||
fi
|
||||
|
||||
# ?? ?? NetworkManager?WiFi ???????????????????????????????????????????
|
||||
# -- enable NetworkManager
|
||||
if command -v nmcli &>/dev/null; then
|
||||
if ! systemctl is-active --quiet NetworkManager 2>/dev/null; then
|
||||
info "?? NetworkManager..."
|
||||
info "Enabling NetworkManager..."
|
||||
systemctl enable --now NetworkManager 2>/dev/null || true
|
||||
fi
|
||||
info "NetworkManager ?"
|
||||
info "NetworkManager OK"
|
||||
|
||||
# ?? DNS ???????? /etc ??????
|
||||
NM_DNSMASQ_DIR="/etc/NetworkManager/dnsmasq-shared.d"
|
||||
mkdir -p "$NM_DNSMASQ_DIR"
|
||||
cat > "$NM_DNSMASQ_DIR/clawd-captive.conf" << 'DNSCONF'
|
||||
@@ -64,20 +62,19 @@ if command -v nmcli &>/dev/null; then
|
||||
# All DNS queries resolve to gateway to trigger captive portal
|
||||
address=/#/10.42.0.1
|
||||
DNSCONF
|
||||
info "DNS ??????? $NM_DNSMASQ_DIR ?"
|
||||
info "DNS hijack config written to $NM_DNSMASQ_DIR"
|
||||
fi
|
||||
|
||||
# ?? WiFi rfkill ??????????? WiFi?????????????????????????????????
|
||||
# -- WiFi rfkill unblock
|
||||
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"))..."
|
||||
info "Unblocking 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
|
||||
@@ -108,39 +105,40 @@ WantedBy=multi-user.target
|
||||
UNIT
|
||||
systemctl daemon-reload
|
||||
systemctl enable clawd-rfkill
|
||||
info "WiFi rfkill ??????? ?"
|
||||
info "WiFi rfkill service created"
|
||||
|
||||
# ?? ?? ttyd?Web ???????????????????????????????????????????????????????
|
||||
info "?? ttyd..."
|
||||
# -- install ttyd
|
||||
info "Installing ttyd..."
|
||||
if apt-get install -y ttyd >/dev/null 2>&1; then
|
||||
info "ttyd ??? ?"
|
||||
info "ttyd installed"
|
||||
else
|
||||
warn "ttyd ?????Web ????????"
|
||||
warn "ttyd install failed. Web terminal may not be available."
|
||||
fi
|
||||
|
||||
# ?? ?? clawd ???????????????????????????????????????????????????????????????
|
||||
# -- install clawd
|
||||
INSTALL_DIR="/opt/clawd"
|
||||
CONFIG_DIR="/etc/clawd"
|
||||
ENV_FILE="$CONFIG_DIR/env"
|
||||
info "??? $INSTALL_DIR ..."
|
||||
CUTOS_REPO="https://git.cutos.ai/claw-daemon/clawd.git"
|
||||
info "Installing to $INSTALL_DIR ..."
|
||||
|
||||
mkdir -p "$INSTALL_DIR"
|
||||
cd "$INSTALL_DIR"
|
||||
|
||||
# ?????????? package.json?????/???????? git/tarball?
|
||||
CUTOS_REPO="https://git.cutos.ai/claw-daemon/clawd.git"
|
||||
# Download source (prioritise .git repo update over package.json skip)
|
||||
if command -v git &>/dev/null && [ -d ".git" ]; then
|
||||
# Migrate remote from GitHub to git.cutos.ai if needed
|
||||
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 ..."
|
||||
info "Migrating git remote to git.cutos.ai ..."
|
||||
git remote set-url origin "$CUTOS_REPO"
|
||||
fi
|
||||
info "??????..."
|
||||
info "Pulling latest code..."
|
||||
git fetch origin
|
||||
git reset --hard origin/main
|
||||
git clean -fd
|
||||
elif [ -f "package.json" ]; then
|
||||
info "????????? git??????"
|
||||
info "Source already present (no .git). Skipping download."
|
||||
elif command -v git &>/dev/null; then
|
||||
git clone --depth=1 "$CUTOS_REPO" .
|
||||
else
|
||||
@@ -148,18 +146,18 @@ else
|
||||
curl -fsSL "$TARBALL_URL" | tar -xz --strip-components=1
|
||||
fi
|
||||
|
||||
# ????
|
||||
info "?? npm ??..."
|
||||
# install npm deps
|
||||
info "Installing npm dependencies..."
|
||||
npm install --omit=dev --silent
|
||||
|
||||
# ???????
|
||||
# create symlink
|
||||
ln -sf "$INSTALL_DIR/bin/clawd.js" /usr/local/bin/clawd
|
||||
chmod +x "$INSTALL_DIR/bin/clawd.js"
|
||||
|
||||
info "clawd ???? /usr/local/bin/clawd ?"
|
||||
info "clawd installed to /usr/local/bin/clawd"
|
||||
|
||||
|
||||
# ?? ?????? + ?????? ??????????????????????????????????????????????
|
||||
# -- create config dir + env file
|
||||
mkdir -p "$CONFIG_DIR"
|
||||
|
||||
if [ ! -f "$CONFIG_DIR/config.json" ]; then
|
||||
@@ -171,36 +169,36 @@ if [ ! -f "$CONFIG_DIR/config.json" ]; then
|
||||
"heartbeat_interval": 30
|
||||
}
|
||||
EOF
|
||||
info "????????$CONFIG_DIR/config.json ?"
|
||||
info "Config file created: $CONFIG_DIR/config.json"
|
||||
fi
|
||||
|
||||
if [ ! -f "$ENV_FILE" ]; then
|
||||
cat > "$ENV_FILE" <<EOF
|
||||
# clawd ?????systemd EnvironmentFile?
|
||||
# ????: debug / info / warn / error
|
||||
# clawd environment variables (systemd EnvironmentFile)
|
||||
# Log level: debug / info / warn / error
|
||||
CLAWD_LOG_LEVEL=info
|
||||
# ????????0=? journald?
|
||||
# Write log file (0 = journald only)
|
||||
CLAWD_LOG_FILE=1
|
||||
# ????????????? config.json?
|
||||
# Custom server address (leave empty to read from config.json)
|
||||
# CLAWD_SERVER=wss://claw.cutos.ai/ws
|
||||
# BtMonitor?bluetoothctl??????????????? CLAWD_DISABLE_BT?
|
||||
# ???????????????????
|
||||
# BtMonitor (bluetoothctl) is disabled by default.
|
||||
# Uncomment to enable Bluetooth LED:
|
||||
# CLAWD_ENABLE_BT=1
|
||||
# OpenVFD sysfs ?????? /sys/class/leds/openvfd?
|
||||
# OpenVFD sysfs path (default: /sys/class/leds/openvfd)
|
||||
# CLAWD_OPENVFD_PATH=/sys/class/leds/openvfd
|
||||
# ??? vfdservice ????? /tmp/openvfd_service?
|
||||
# VFD service pipe (default: /tmp/openvfd_service)
|
||||
# CLAWD_VFD_PIPE=/tmp/openvfd_service
|
||||
# ???/??????? LAN ???????????? clawd ?????? carrier ??
|
||||
# Fixed LAN interface for multi-port boards
|
||||
# CLAWD_ETH_IFACE=end0
|
||||
EOF
|
||||
info "??????????$ENV_FILE ?"
|
||||
info "Env file created: $ENV_FILE"
|
||||
fi
|
||||
|
||||
# ?? ?????? ?????????????????????????????????????????????????????????????
|
||||
# -- create log dir
|
||||
mkdir -p "$CONFIG_DIR/logs"
|
||||
info "?????$CONFIG_DIR/logs ?"
|
||||
info "Log dir: $CONFIG_DIR/logs"
|
||||
|
||||
# ?? ?? systemd service ????????????????????????????????????????????????????
|
||||
# -- create systemd service
|
||||
NODE_BIN=$(command -v node)
|
||||
SERVICE_FILE="/etc/systemd/system/clawd.service"
|
||||
|
||||
@@ -213,78 +211,70 @@ 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 ??????? ?"
|
||||
info "systemd service file created"
|
||||
|
||||
# ?? journald ???????? ????????????????????????????????????????????????
|
||||
# -- journald log limits
|
||||
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 ??
|
||||
# clawd journald limits
|
||||
[Journal]
|
||||
SystemMaxUse=100M
|
||||
MaxFileSec=7day
|
||||
EOF
|
||||
systemctl restart systemd-journald 2>/dev/null || true
|
||||
info "journald ??????? ?"
|
||||
info "journald limits configured"
|
||||
fi
|
||||
|
||||
# ?? ????? ??????????????????????????????????????????????????????????????
|
||||
# -- enable and start
|
||||
systemctl daemon-reload
|
||||
systemctl enable clawd
|
||||
systemctl restart clawd
|
||||
|
||||
sleep 2
|
||||
if systemctl is-active --quiet clawd; then
|
||||
info "clawd ????? ?"
|
||||
info "clawd service is running"
|
||||
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 " View logs: journalctl -u clawd -f"
|
||||
echo " View status: systemctl status clawd"
|
||||
echo " Stop: systemctl stop clawd"
|
||||
echo " Config: $CONFIG_DIR/config.json"
|
||||
echo " Env vars: $ENV_FILE"
|
||||
echo " Log file: $CONFIG_DIR/logs/clawd.log"
|
||||
echo ""
|
||||
else
|
||||
warn "?????????????"
|
||||
warn "Service failed to start. Check logs:"
|
||||
echo " journalctl -u clawd -n 50 --no-pager"
|
||||
fi
|
||||
fi
|
||||
Reference in New Issue
Block a user