openwrt 时间同步脚本

背景,断电后偶尔导致重启后时间重置不正确,然后ntp工作居然不正常,不正常的原因是本地dns无法解析ntp域名,本地无法解析的原因是时间不一致导致的异常。

于是就写个脚本处理这个问题,主要正对两个方面:通过ip获取ntp的ip地址,开机自启同步。

脚本依赖:

  1. 223.5.5.5 阿里dns服务
  2. ntp.aliyun.com 阿里ntp服务
  3. jq json解析 opkg install jq
#!/usr/bin/env bash
function log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')]$*"
}

function log_exec() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')]$*"
  exec "$@"
}

program_exists() {
  local ret='0'
  command -v "$1" >/dev/null 2>&1 || { local ret='1'; }

  if [ "$ret" -ne 0 ]; then
    return 1
  fi

  return 0
}

log "准备进行时间同步"

# 获取NTP服务器IP, 这里如果使用https会遇到证书可能还未生效的问题,无特殊需要使用http即可
ntp_ip=""
loop_num=0
while [ "$ntp_ip" == "" ]; do
  loop_num=$((1 + 10#$loop_num))
  if ! ntp_ip=$(curl -s --connect-timeout 5 "http://223.5.5.5/resolve?name=ntp.aliyun.com" | jq ".Answer[0].data"); then
    ntp_ip=""
  else
    ntp_ip=${ntp_ip//"/}
  fi

  if [ "$ntp_ip" == "" ]; then
    if [ $loop_num -ge 120 ]; then
      log "无法获取到NTP服务器地址或网络不可用, 次数:${loop_num}, exit 1"
      exit 1
    fi
    log "无法获取到NTP服务器地址或网络不可用, 准备重试, 次数:${loop_num}"
    sleep 10s
  else
    break
  fi
done

# 更新
if program_exists ntpclient; then
  log_exec ntpclient -s -c 0 -h "${ntp_ip}"
  exit 0
fi

if program_exists ntpdate; then
  log_exec ntpdate "${ntp_ip}"
  exit 0
fi

log "未找到可以执行时间更新的脚本,当前仅支持 ntpdate 和 ntpclient 两个程序"
exit 3

当前还没有任何评论

写下你最简单的想法