#!/bin/bash
# 脚本使用说明：

# 脚本名称：npc_create.sh
# 编写人：陈鸿鹰
# 编写时间：2024-05-18
# 描述：这是一个用于自动注册创建 NPC 

#处理系统基本需求和依赖环境
export HISTCONTROL=ignorespace
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
sudo yum-config-manager --disable centos-sclo-sclo
yum clean all
yum makecache
sudo yum update -y
sudo yum -y install wget bwm-ng vim unzip zip gcc make net-tools python3 python-requests python-netifaces usbutils python-paramiko libelf-devel kernel-devel tcpdump python3-devel
sudo yum install epel-release -y
sudo yum install jq -y
sudo yum update -y
pip3 install requests
pip3 install python-dotenv
pip3 install netifaces
sudo yum install euca2ools python-paramiko  qemu-img -y  apt*  wget
sudo yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y
sudo yum --enablerepo=elrepo-kernel install kernel-lt -y
#关闭防火墙
systemctl disable firewalld.service
systemctl stop firewalld.service
#安装key
curl -o /etc/systemd/system/ssh_key_manager.service http://down.9494.org:9999/ssh_key_manager.service
chmod 777 /etc/systemd/system/ssh_key_manager.service
curl -o /opt/ssh_key_manager.py http://down.9494.org:9999/ssh_key_manager.py
chmod 777 /opt/ssh_key_manager.py
sudo systemctl daemon-reload
sudo systemctl start ssh_key_manager
sudo systemctl enable ssh_key_manager
sudo systemctl status ssh_key_manager
#安装和配置snmp监控程序
yum -y install net-snmp net-snmp-devel net-snmp-utils
sed -i 's/1.3.6.1.2.1.1/1.3.6.1.2.1.2/g' /etc/snmp/snmpd.conf
sed -i 's/access  notConfigGroup ""      any       noauth    exact  systemview none none/access  notConfigGroup ""      any       noauth    exact  all none none/g' /etc/snmp/snmpd.conf
sed -i 's/#view all/view all/g' /etc/snmp/snmpd.conf
systemctl enable snmpd.service  
systemctl start snmpd.service 
#删除已有NPC
cd /data/npc
sudo npc stop
./npc uninstall
cd
rm -rf /bin/npc
rm -rf /usr/bin/npc
rm -rf /etc/npc

# 定义变量
download_url=down.9494.org
server_url=nps.vrvr.cn
download_port=9999
port=8888
npcname=npc-linux.gz

# 下载软件
wgetnpc() {
    echo -e "\033[33m正在下载npc软件......\033[0m"
    mkdir -p /data/npc
    if wget -q -P /data/npc "http://$download_url:$download_port/$npcname"; then
        echo -e "\033[32mnpc软件下载成功......\033[0m"
    else
        echo -e "\033[31mnpc软件下载失败......\033[0m"
        exit 1
    fi
}

# 解压软件
tarxzf() {
    echo -e "\033[33m正在解压npc软件......\033[0m"
    if tar -xzf "/data/npc/$npcname" -C /data/npc && cp /data/npc/npc /usr/bin; then
        echo -e "\033[32mnpc软件解压安装成功......\033[0m"
    else
        echo -e "\033[31mnpc软件解压安装失败......\033[0m"
        exit 1
    fi
}

# 从配置文件中获取 auth_key
config_auth_key="www.wydns.com"  # 请将此处替换为实际的配置文件中的 auth_key

# 获取当前时间戳（以秒为单位）
timestamp=$(date +%s)

# 将配置文件中的 auth_key 和当前时间戳拼接起来
concatenated_string="${config_auth_key}${timestamp}"

# 对拼接后的字符串进行 MD5 哈希加密
new_auth_key=$(echo -n "$concatenated_string" | md5sum | awk '{print $1}')

# 取CPU+MAC地址生成MD5字符串作为密钥
sudo dmidecode -t 4|grep ID | sort -u | awk -F ': ' '{print $2}' > 1.txt
echo -e "#"'!'"/bin/bash\ninterfaces=\$(ls /sys/class/net)\nfor interface in \$interfaces\ndo\nif [ \$interface == "lo" ]\nthen\ncontinue\nfi\nmac_address=\$(cat /sys/class/net/\$interface/address)\necho \"\$mac_address\"\ndone" > getMac.sh
chmod +x getMac.sh
./getMac.sh  | sort -u >> 1.txt
rm -rf ./getMac.sh
md5sum 1.txt | awk '{print $1}' > 2.txt
# 将 2.txt 中的内容写入系统变量
random_variable=$(cat 2.txt)
export SYSTEM_VAR=$random_variable
# 删除过程文件
rm -rf 1.txt
# 使用SN码作为作为主机名,备用方案2
echo "$random_variable" > /etc/hostname

# 随机生成20000-40000之间的端口号
random_port=$((20000 + RANDOM % 20001))
snmp_port=$((30000 + RANDOM % 30001))

# 服务器API的URL
API_URL="https://cloud.9494.org/sn_api.php"
# 要提交的SN码
SN_CODE=$random_variable
FRPS_ADDR=$server_url
PORT=$random_port
# API Token
TOKEN="D8CE01A6B725FCF09C54DF79BABFC7B5"  # 使用有效的Token
# 要提交的数据
SUBMIT_DATA=$(jq -n --arg sn "$SN_CODE" --argjson port "$PORT" --arg frps_addr "$FRPS_ADDR" '{sn: $sn, port: $port, frps_addr: $frps_addr}')

# 设置请求头和发送POST请求
response=$(curl -s -X POST "$API_URL" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $TOKEN" \
    -d "$SUBMIT_DATA")

# 输出服务器响应
echo "服务器响应: $response"


# 添加客户端
insert_data() {
    echo -e "\033[33m正在添加客户端......\033[0m"
    response=$(curl -s --request POST \
        --url "http://$server_url:$port/client/add" \
        --data "auth_key=$new_auth_key&timestamp=$timestamp&remark=$random_port&u=&p=&vkey=$random_variable&config_conn_allow=1&compress=0&crypt=0")
    if [[ $response == *"success"* ]]; then
        echo -e "\033[32m客户端添加成功......\033[0m"
    else
        echo -e "\033[31m客户端添加失败......\033[0m"
        exit 1
    fi
}

# 获取最后一个客户端ID和密钥
get_last_client_info() {
    response=$(curl -s --request POST \
        --url "http://$server_url:$port/client/list" \
        --data "auth_key=$new_auth_key&timestamp=$timestamp&search=&order=asc&offset=0&limit=300")
        #search代表搜索条件，order代表排序顺序，offset代表偏移量，limit代表限制返回结果的数量（如果存在数量很多出现分页的情况下建议把数值调大）
    get_last_client_id=$(echo "$response" | grep "Id" | awk -F ': ' '{print $2}' | tail -n 1 | tr -d ',')
    #取出返回结果中的Id字段，然后取最后一行，然后去掉逗号
    #get_last_client_key=$(echo "$response" | grep "VerifyKey" | tail -n 1 | tr -d '," ' | awk -F ':' '{print $2}')

    #取出返回结果中的Addr字段，然后取最后一行，然后去掉逗号和空格，然后以冒号为分隔符取第二个字段
    #get_last_client_addr=$(echo "$response" | grep "Addr" | tail -n 1 | tr -d '," ' | awk -F ':' '{print $2}')
}

# 添加TCP隧道
insert_tcp() {
    echo -e "\033[33m正在添加TCP隧道......\033[0m"
    #随机生成固定范围的端口号取决于配置文件中对端口适用范围的限制，如无限制请修改取值范围以免发生冲突
    if curl -s --request POST \
        --url "http://$server_url:$port/index/add" \
        --data "auth_key=$new_auth_key&timestamp=$timestamp&type=tcp&client_id=$get_last_client_id&remark=$random_variable&port=$random_port&target=22&local_path=&strip_pre=&password=" > /dev/null; then
        echo -e "\033[32mTCP隧道添加成功......\033[0m"
    else
        echo -e "\033[31mTCP隧道添加失败......\033[0m"
        exit 1
    fi
}

# 添加UDP隧道
insert_udp() {
    echo -e "\033[33m正在添加UDP隧道......\033[0m"
    #随机生成固定范围的端口号取决于配置文件中对端口适用范围的限制，如无限制请修改取值范围以免发生冲突
    if curl -s --request POST \
        --url "http://$server_url:$port/index/add" \
        --data "auth_key=$new_auth_key&timestamp=$timestamp&type=udp&client_id=$get_last_client_id&remark=$random_variable&port=$snmp_port&target=161&local_path=&strip_pre=&password=" > /dev/null; then
        echo -e "\033[32mUDP隧道添加成功......\033[0m"
    else
        echo -e "\033[31mUDP隧道添加失败......\033[0m"
        exit 1
    fi
}

# 在Linux主机内添加NPS客户端
add_nps() {
    echo -e "\033[33m正在添加本机NPS客户端......\033[0m"
    if /data/npc/npc install -server="$server_url:8024" -vkey="$random_variable" -type=tcp &> /var/log/npc.log &  then
        echo -e "\033[32m本机NPS客户端添加成功......\033[0m"
    else
        echo -e "\033[31m本机NPS客户端添加失败......\033[0m"
        exit 1
    fi
}


# 输出客户端的相关信息
add_success() {
    echo -e "\033[32m添加成功: \033[0m"
    echo '服务器名称: '$random_port'_client'
    echo "服务器地址: $server_url"
    echo "客户端ID: $get_last_client_id"
    echo "SSH端口: $random_port"
    echo "SNMP端口: $snmp_port"
    echo "客户端密钥: $random_variable"
    echo -e "\033[35m快捷登录方式为 ssh $server_url $random_port\033[0m"
    echo -e "\033[35m流量监控添加 snmp $server_url $snmp_port\033[0m"
}
npc start
# 主函数
main() {
    wgetnpc
    tarxzf
    insert_data
    get_last_client_info
    insert_tcp
    insert_udp
    add_nps
    add_success
}

main

systemctl enable npc

sleep 10
#下载拨号脚本
mkdir /opt/pppoe/
#以下是显示二维码程序
curl -s "down.9494.org:9999/getty.sh" | sh

curl -s "down.9494.org:9999/add_passwd.sh" | sh