问题描述

我瓜西北工业大学长安校区内开通了WiFi全覆盖,其中NWPU-FREE无需账号登录,可以用于实验区中小计算集群联网。 用户可以在宿舍、学院楼ssh登录小计算集群。 当然,也可以从校外使用VPN进入校内网络,进而连接这些小集群。 但是存在一个非常不方便的问题: 校园网采用DHCP方式分配IP。 在一个不确定的时间间隔后,小集群的WiFi连接会断开(此时WiFi保持了“虚假”的连接),IP有时候也会变。

解决方案

一种方式是向学校的信息中心申请分配静态IP,保证连接后IP不变。但很有可能WiFi还会出现假连接真断开的情况。

另一种方式是写一个shell脚本,自动检测WiFi是否真的连接,如果已经断开,则自动重连并发送新IP到指定邮箱。 具体如下。

首先设定crontab,每隔1小时执行脚本,检测WiFi并自动重连。

1 * * * * /usr/bin/bash /path/to/auto_connect_wifi.sh

auto_connect_wifi.sh的内容如下:

#!/bin/bash
# Gateway/DHCP server
dhcp_server=10.27.0.1
wifi_name="NWPU-FREE"
nic_name="wlp2s0u2"
test_website="baidu.com"
#
ping_ret=$(ping -c 5 ${dhcp_server} | tail -n 2 | sed -n '1p' | awk '{print $4}')
if [ "$ping_ret" == "" ]; then
  nmcli d wifi connect ${wifi_name} ifname ${nic_name}
  sleep 10
  ping -c 5 ${test_website}
  bash /path/to/send_ip.sh
elif [ "$ping_ret" == "0" ]; then
  # ping fails
  echo "$(date): WiFi disconnected!"
  nmcli d wifi connect ${wifi_name} ifname ${nic_name}
  sleep 10
  ping -c 5 ${test_website}
  bash /path/to/send_ip.sh
fi

send_ip.sh使用了Mailgun的Email API服务自动发送新IP到指定邮箱,脚本内容如下:

ip_str=$(hostname -I | awk '{print $1}')
ip_f1_name="old_ip.txt"
ip_f2_name="current_ip.txt"
old_ip=$(cat ${ip_f2_name})
if [ "${old_ip}" != "${ip_str}" ]; then
  my_domain_name=YOUR_MAILGUN_DOMAIN_NAME
  receiver_mail="SECOND_EMAIL_ADDRESS"
  curl -s --user 'api:YOUR_API_KEY' \
    https://api.mailgun.net/v3/${my_domain_name}/messages \
    -F from="Cluster notification<mailgun@${my_domain_name}>" \
    -F to=${receiver_mail} \
    -F to="FIRST_EMAIL_ADDRESS" \
    -F subject='The cluster IP is changed!' \
    -F text="The new IP is ${ip_str}"
  cat ${ip_f2_name} >> ${ip_f1_name}
  echo "${ip_str}" > ${ip_f2_name}
fi