#! /bin/bash

####################################################################################
# 描述：为 Conky 天气添加 Crontab
# 作者：李景强
# 创建：2023-04-19
# 修订：2023-04-20
# 说明：
#      ① 系统平台：deepin20.9
####################################################################################

APP_NAME="myconky-weather-add-crontab"
APP_VER="23.4.20"
APP_DIR="$HOME/.myconky"
DATA_DIR="$APP_DIR/.data"

BIN="myconky-weather-update"
CMD=`which $BIN`
CRON_FILE="DATA_DIR/myconky-weather-update.cron"

declare -i X Y Z

echo "  * 设定自动更新 Conky 天气 (每20分钟更新一次)..."
echo "    提示：也可以随时运行 $BIN 来更新 Conky 天气！"
echo

if [ "$CMD" = '' ]
then
  echo -en "\n\e[1;5;31m〖错误〗\e[22;25m未找到命令：$BIN ！\n\t敲击 “ENTER” 键继续 ···\e[0m" && read -p "" var
  crontab -l
  exit 0;
fi

## X = 0-19
## 每个小时的第 X, X+20, X+40 分钟更新一次天气, 
#  并添加到当前用户的 crontab 计划任务。
#
#  警告：
#      	如果所有用户都在同一分钟更新天气，天气服务器可能会吃不消，或反应太慢。
#      	所以使用了一个随机的分钟数字X：0-19，以分散服务器的更新压力。

let "X = RANDOM % 20"
let "Y = X + 20"
let "Z = X + 40"

CRON_LINES=`crontab -l 2>/dev/null | wc -l`
CRON_WEATHER_LINES=`crontab -l | grep "$BIN" | wc -l`

# 如果用户的 crontab 中没有任何的 crontab 计划任务，或者仅有一条更新
# conky 天气的 crontab 指令，则可以执行或更新后面的相关crontab指令；
# 如果用户有 1 条或者多条与更新 conky 天气无关的指令，则需要用户手动添
# 加crontab指令。这样做是为了避免错误地清空用户的其它crontab指令。

if [ "$CRON_LINES" = 0 ]
then
  :
elif [ "$CRON_LINES" = 1 ] && [ "$CRON_WEATHER_LINES" = 1 ]
then
  :
else
  echo "  请把下面一行带星号*的指令, 添加到当前用户的 crontab 计划任务中:"
  echo "  ( 命令操作: crontab -e )"
  echo "  $X * * * * $CMD "
  echo "  或者: 把文件 $CRON_FILE "
  echo "  添加到当前用户的 crontab 计划任务目录。"
  echo "  作用：每个小时的第'$X'分钟更新一次天气"
  echo 
  echo "  显示当前用户的 crontab 计划任务清单："
  echo "  ( 命令操作: crontab -l )"
  echo "  --------------------------------- "
  crontab -l

  exit 0
fi

if [ ! -e "${CRON_FILE}" ]
then
  echo "$X,$Y,$Z * * * * $CMD" > "${CRON_FILE}"
else 
  echo -e "  提示: 已存在 Conky 天气的 crontab 计划任务示例文件:\n  ${CRON_FILE}"
  echo -e "  文件中的相关指令：\n"
fi

  crontab "${CRON_FILE}"

  crontab -l | grep "$BIN"
  
  echo "  含义：每个小时的第X分钟更新一次天气"
  
exit 0;

### 以下内容是crontab的用法介绍, 不会执行任何代码或命令
### ----------------
# show current user's crontab job:
# crontab -l
#
# ----
## user crontab dir 1:
# /var/spool/cron/
# crontab job FILE for USER xxx: (root readable only)
# /var/spool/cron/xxx 
# ----
## global crontab dir 2: 
#/etc/crontab   //FILE
#
#/etc/cron.d/
#/etc/cron.daily/
#/etc/cron.hourly/
#/etc/cron.monthly/
#/etc/cron.weekly/
# ---- 
## crontab usage:
# examples:
# 45 * * * * /usr/local/bin/conky-weather-update
# 15,45 * * * * /usr/local/bin/conky-weather-update
# 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. Must use FULL PATH and FILENAME!
#
### ----------------
