read-me/setup-client.sh

180 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
# Check if script is run as root
if [ "$EUID" -ne 0 ]; then
echo "Please run as root"
exit 1
fi
# Install bc based on system package manager
if command -v apt-get > /dev/null; then
apt-get update && apt-get install -y bc
elif command -v yum > /dev/null; then
yum update -y && yum install -y bc
else
echo "Could not install bc. Please install it manually."
exit 1
fi
# Stop existing service if running
systemctl stop ak_client
# Function to detect main network interface
get_main_interface() {
local interfaces=$(ip -o link show | \
awk -F': ' '$2 !~ /^((lo|docker|veth|br-|virbr|tun|vnet|wg|vmbr|dummy|gre|sit|vlan|lxc|lxd|warp|tap))/{print $2}' | \
grep -v '@')
local interface_count=$(echo "$interfaces" | wc -l)
# 格式化流量大小的函数
format_bytes() {
local bytes=$1
if [ $bytes -lt 1024 ]; then
echo "${bytes} B"
elif [ $bytes -lt 1048576 ]; then # 1024*1024
echo "$(echo "scale=2; $bytes/1024" | bc) KB"
elif [ $bytes -lt 1048576 ]; then # 1024*1024
echo "$(echo "scale=2; $bytes/1024" | bc) KB"
elif [ $bytes -lt 1073741824 ]; then # 1024*1024*1024
echo "$(echo "scale=2; $bytes/1024/1024" | bc) MB"
elif [ $bytes -lt 1099511627776 ]; then # 1024*1024*1024*1024
echo "$(echo "scale=2; $bytes/1024/1024/1024" | bc) GB"
else
echo "$(echo "scale=2; $bytes/1024/1024/1024/1024" | bc) TB"
fi
}
# 显示网卡流量的函数
show_interface_traffic() {
local interface=$1
if [ -d "/sys/class/net/$interface" ]; then
local rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes)
local tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes)
echo " ↓ Received: $(format_bytes $rx_bytes)"
echo " ↑ Sent: $(format_bytes $tx_bytes)"
else
echo " 无法读取流量信息"
fi
}
# 如果没有找到合适的接口或有多个接口时显示所有可用接口
echo "所有可用的网卡接口:" >&2
echo "------------------------" >&2
local i=1
while read -r interface; do
echo "$i) $interface" >&2
show_interface_traffic "$interface" >&2
i=$((i+1))
done < <(ip -o link show | grep -v "lo:" | awk -F': ' '{print $2}')
echo "------------------------" >&2
while true; do
read -p "请选择网卡,如上方显示异常或没有需要的网卡,请直接填入网卡名: " selection
# 检查是否为数字
if [[ "$selection" =~ ^[0-9]+$ ]]; then
# 如果是数字,检查是否在有效范围内
selected_interface=$(ip -o link show | grep -v "lo:" | sed -n "${selection}p" | awk -F': ' '{print $2}')
if [ -n "$selected_interface" ]; then
echo "已选择网卡: $selected_interface" >&2
echo "$selected_interface"
break
else
echo "无效的选择,请重新输入" >&2
continue
fi
else
# 直接使用输入的网卡名
echo "已选择网卡: $selection" >&2
echo "$selection"
break
fi
done
}
# Check if all arguments are provided
if [ "$#" -ne 3 ]; then
echo "Usage: $0 <auth_secret> <url> <name>"
echo "Example: $0 your_secret wss://api.123.321 HK-Akile"
exit 1
fi
# Get system architecture
ARCH=$(uname -m)
CLIENT_FILE="akile_client-linux-amd64"
# Set appropriate client file based on architecture
if [ "$ARCH" = "x86_64" ]; then
CLIENT_FILE="akile_client-linux-amd64"
elif [ "$ARCH" = "aarch64" ]; then
CLIENT_FILE="akile_client-linux-arm64"
elif [ "$ARCH" = "x86_64" ] && [ "$(uname -s)" = "Darwin" ]; then
CLIENT_FILE="akile_client-darwin-amd64"
else
echo "Unsupported architecture: $ARCH"
exit 1
fi
# Assign command line arguments to variables
auth_secret="$1"
url="$2"
monitor_name="$3"
# Get network interface
net_name=$(get_main_interface)
echo "Using network interface: $net_name"
# Create directory and change to it
mkdir -p /etc/ak_monitor/
cd /etc/ak_monitor/
# Download client
wget -O client https://github.com/akile-network/akile_monitor/releases/latest/download/$CLIENT_FILE
chmod 777 client
# Create systemd service file
cat > /etc/systemd/system/ak_client.service << 'EOF'
[Unit]
Description=AkileCloud Monitor Service
After=network.target nss-lookup.target
Wants=network.target
[Service]
User=root
Group=root
Type=simple
LimitAS=infinity
LimitRSS=infinity
LimitCORE=infinity
LimitNOFILE=999999999
WorkingDirectory=/etc/ak_monitor/
ExecStart=/etc/ak_monitor/client
Restart=always
RestartSec=1
[Install]
WantedBy=multi-user.target
EOF
# Create client configuration
cat > /etc/ak_monitor/client.json << EOF
{
"auth_secret": "${auth_secret}",
"url": "${url}",
"net_name": "${net_name}",
"name": "${monitor_name}"
}
EOF
# Set proper permissions
chmod 644 /etc/ak_monitor/client.json
chmod 644 /etc/systemd/system/ak_client.service
# Reload systemd and enable service
systemctl daemon-reload
systemctl enable ak_client.service
systemctl start ak_client.service
echo "Installation complete! Service status:"
systemctl status ak_client.service