#!/bin/bash

function blue(){
  echo -e "\033[34m\033[01m$1\033[0m"
}
function green(){
  echo -e "\033[32m\033[01m$1\033[0m"
}
function red(){
  echo -e "\033[31m\033[01m$1\033[0m"
}
function version_lt(){
  test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" != "$1";
}

#copy from 秋水逸冰 ss scripts
if [[ -f /etc/redhat-release ]]; then
  release_os="centos"
elif cat /etc/issue | grep -Eqi "debian"; then
  release_os="debian"
elif cat /etc/issue | grep -Eqi "ubuntu"; then
  release_os="ubuntu"
elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then
  release_os="centos"
elif cat /proc/version | grep -Eqi "debian"; then
  release_os="debian"
elif cat /proc/version | grep -Eqi "ubuntu"; then
  release_os="ubuntu"
elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then
  release_os="centos"
fi

if [ "$release_os" == "centos" ]; then
  systemPackage_os="yum"
elif [ "$release_os" == "ubuntu" ]; then
  systemPackage_os="apt"
elif [ "$release_os" == "debian" ]; then
  systemPackage_os="apt"
fi

#修改SSH端口号
function change_ssh_port(){
  cd
  declare -i port_num
  read -p "请输入新端口号(1024-65535):" port_num
  if [[ $port_num -ge 1024 && $port_num -le 65535 ]]; then
    green " 输入端口号正确,正在设置该端口号"
  else
    red "输入的端口号错误,请重新输入"
    unset port_num
    change_ssh_port
  fi
  grep -q "Port $port_num" /etc/ssh/sshd_config
  if [ $? -eq 0 ]; then
    red " 端口已经添加,请勿重复添加"
    return
  else
    sed -i "/Port 22/a\Port $port_num" /etc/ssh/sshd_config
    sed -i '/Port 22/s/^#//' /etc/ssh/sshd_config
    if [ "$release_os" == "centos" ]; then
      firewall-cmd --zone=public --add-port=$port_num/tcp --permanent
      firewall-cmd --reload
    elif [ "$release_os" == "ubuntu" ]; then
      ufw allow $port_num
      ufw reload
    fi
    #目前SELinux 支持三种模式,分别是enforcing:强制模式,permissive:宽容模式,disabled:关闭
    if [ -f "/etc/selinux/config" ]; then
      CHECK=$(grep SELINUX= /etc/selinux/config | grep -v "#")
      if [ "$CHECK" != "SELINUX=disabled" ]; then
        read -p "检测到SELinux开启状态,是否继续开启SElinux ?请输入 [Y/n] :" yn
        [ -z "${yn}" ] && yn="y"
        if [[ $yn == [Yy] ]]; then
          green "添加放行$port_num端口规则"
          $systemPackage_os -y install policycoreutils-python
          semanage port -a -t ssh_port_t -p tcp $port_num
        else
          if [ "$CHECK" == "SELINUX=enforcing" ]; then
            sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
          elif [ "$CHECK" == "SELINUX=permissive" ]; then
            sed -i 's/SELINUX=permissive/SELINUX=disabled/g' /etc/selinux/config
          fi
          red "======================================================================="
          red "关闭selinux后,必须重启VPS才能生效,再执行本脚本,即将在3秒后重启......"
          red "======================================================================="
          clear
          green "重启倒计时3s"
          sleep 1s
          clear
          green "重启倒计时2s"
          sleep 1s
          clear
          green "重启倒计时1s"
          sleep 1s
          clear
          green "重启中..."
          reboot
        fi
      fi
    fi
    systemctl restart sshd.service
    sleep 1s
    red " 稍后请使用修改好的端口连接SSH"
  fi
}

#关闭SSH默认22端口
function close_ssh_default_port(){
  cd
  grep -q "#Port 22" /etc/ssh/sshd_config
  if [ $? -eq 0 ]; then
    red " 端口22已被关闭,无需重复操作"
  else
    sed -i 's/Port 22/#Port 22/g' /etc/ssh/sshd_config
    if [ "$release_os" == "centos" ]; then
      firewall-cmd --reload
    elif [ "$release_os" == "ubuntu" ]; then
      ufw reload
    fi
    systemctl restart sshd.service
    green " 新端口连接成功后屏蔽原22端口成功"
  fi
}

#创建moon节点
function creat_moon(){
  blue "安装zerotier软件"
  curl -s https://install.zerotier.com/ | sudo bash
  blue "启动zerotier"
  systemctl start zerotier-one.service
  systemctl enable zerotier-one.service
  blue "将安装好ZeroTier的加入你事先注册好的ZeroTier虚拟局域网中"
  read -p "请输入你的ZeroTier虚拟局域网ID号:" you_net_ID
  zerotier-cli join $you_net_ID | grep OK
  if [ $? -eq 0 ]; then
    green "加入网络成功!请去zerotier管理页面,对加入的设备进行打钩"
    read -s -n1 -p "确认zerotier管理页面加入该moon节点后按任意键继续... "
    blue "搭建ZeroTier的Moon中转服务器,生成moon配置文件"
    cd /var/lib/zerotier-one/
    blue "生成moon.json文件并对其进行编辑"
    ip_addr=`curl ipv4.icanhazip.com`
    zerotier-idtool initmoon identity.public > moon.json
    if sed -i "s/\[\]/\[ \"$ip_addr\/9993\" \]/" moon.json >/dev/null 2>/dev/null; then
      green "编辑完成"
    else
      red "编辑出错"
    fi
    if [ "$release_os" == "centos" ]; then
      blue "防火墙开启zerotier默认udp端口9993"
      firewall-cmd --zone=public --add-port=9993/udp --permanent
      blue "防火墙重启"
      firewall-cmd --reload
    elif [ "$release_os" == "ubuntu" ]; then
      blue "防火墙开启zerotier默认udp端口9993"
      ufw allow 9993
      bule "防火墙重启"
      ufw reload
    fi
    blue "生成签名文件"
    zerotier-idtool genmoon moon.json
    blue "创建moons.d文件夹,并把签名文件移动到文件夹内"
    mkdir moons.d
    mv ./*.moon ./moons.d/
    blue "zerotier-one服务"
    systemctl restart zerotier-one
    green "moon节点创建完成"
    green "请记得将moons.d文件夹拷贝出来用于客户端的配置,路径/var/lib/zerotier-one/"
  else
    red "加入失败,请检查你的网络ID号有无错误"
  fi
}

#设置计划任务
function crontab_edit(){
  cd
  cat /etc/crontab
  read -p "请按照以上格式输入计划任务:" crontab_cmd
  rm -f /etc/crontab
  sleep 1s
  cat > /etc/crontab <<-EOF
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

$crontab_cmd

EOF
  chmod +x /etc/crontab
  systemctl enable crond.service
  systemctl start crond.service
  crontab /etc/crontab
  systemctl reload crond.service
  systemctl status crond.service
  blue "编辑后的计划任务:"
  echo
  crontab -l
}

#清除缓存
function del_cache(){
  cd
  green " 缓存已清除完毕"
  rm -f "$0"
}

#一键全自动安装
function auto_install(){
  read -p "是否关闭SSH默认22端口 ?请输入 [Y/n] :" yn
  [ -z "${yn}" ] && yn="y"
  if [[ $yn == [Yy] ]]; then
    close_ssh_default_port
    sleep 1s
  fi
  read -p "是否创建moon ?请输入 [Y/n] :" yn
  [ -z "${yn}" ] && yn="y"
  if [[ $yn == [Yy] ]]; then
    creat_moon
    sleep 1s
  fi
  read -p "是否设置计划任务 ?请输入 [Y/n] :" yn
  [ -z "${yn}" ] && yn="y"
  if [[ $yn == [Yy] ]]; then
    echo
    crontab_edit
    sleep 1s
  fi
  read -p "是否清除缓存 ?请输入 [Y/n] :" yn
  [ -z "${yn}" ] && yn="y"
  if [[ $yn == [Yy] ]]; then
    del_cache
  fi
}

#开始菜单
start_menu(){
  clear
  green " ======================================="
  green " 介绍:"
  green " 一键zerotier虚拟局域网moon节点综合脚本"
  green " 一键配置计划任务、修改SSH端口"
  green " ======================================="
  echo
  green " 1. 修改SSH端口号"
  green " 2. 关闭SSH默认22端口"
  green " 3. 启动moon节点安装脚本"
  green " 4. 设置计划任务"
  green " 5. 清除缓存"
  green " 6. 全自动执行2-5"
  blue " 0. 退出脚本"
  echo
  read -p "请输入数字:" num
  case "$num" in
  1)
  change_ssh_port
  exit
  ;;
  2)
  close_ssh_default_port
  sleep 1s
  read -s -n1 -p "按任意键返回菜单 ... "
  start_menu
  ;;
  3)
  creat_moon
  sleep 1s
  read -s -n1 -p "按任意键返回上级菜单 ... "
  start_menu
  ;;
  4)
  crontab_edit
  sleep 1s
  read -s -n1 -p "按任意键返回菜单 ... "
  start_menu
  ;;
  5)
  del_cache
  ;;
  6)
  auto_install
  ;;
  0)
  exit 1
  ;;
  *)
  clear
  red "请输入正确数字"
  sleep 1s
  start_menu
  ;;
  esac
}

start_menu