forked from RikudouPatrickstar/jd-base
-
Notifications
You must be signed in to change notification settings - Fork 0
/
git_pull.sh
402 lines (351 loc) · 12.6 KB
/
git_pull.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
#!/usr/bin/env bash
## 文件路径、脚本网址、文件版本以及各种环境的判断
ShellDir=$(cd "$(dirname "$0")";pwd)
ShellJd=${ShellDir}/jd.sh
LogDir=${ShellDir}/log
[ ! -d ${LogDir} ] && mkdir -p ${LogDir}
ScriptsDir=${ShellDir}/scripts
ConfigDir=${ShellDir}/config
FileConf=${ConfigDir}/config.sh
FileConfSample=${ShellDir}/sample/config.sh.sample
ListCron=${ConfigDir}/crontab.list
ListCronLxk=${ScriptsDir}/docker/crontab_list.sh
ListTask=${LogDir}/task.list
ListJs=${LogDir}/js.list
ListJsAdd=${LogDir}/js-add.list
ListJsDrop=${LogDir}/js-drop.list
ContentVersion=${ShellDir}/version
ContentNewTask=${ShellDir}/new_task
ContentDropTask=${ShellDir}/drop_task
SendCount=${ShellDir}/send_count
ScriptsURL=https://gh.neting.cc.cnpmjs.org/RikudouPatrickstar/jd_scripts
ShellURL=https://gh.neting.cc.cnpmjs.org/RikudouPatrickstar/jd-base
## 导入配置文件
function Import_Conf {
if [ -f ${FileConf} ]; then
. ${FileConf}
fi
}
## 更新 jd-base 脚本
function Git_PullShell {
echo -e "更新 jd-base 脚本\n"
cd ${ShellDir}
git fetch --all
ExitStatusShell=$?
git reset --hard origin/v3
echo
}
## 更新 jd-base 脚本成功后的操作
function Git_PullShellNext {
if [[ ${ExitStatusShell} -eq 0 ]]; then
echo -e "更新 jd-base 脚本成功\n"
[[ "${PanelDependOld}" != "${PanelDependNew}" ]] && cd ${ShellDir}/panel && Npm_Install panel
Notify_Version
else
echo -e "更新 jd-base 脚本失败,请检查原因\n"
fi
}
## 克隆 jd_scripts 脚本
function Git_CloneScripts {
echo -e "克隆 jd_scripts 脚本\n"
git clone -b master ${ScriptsURL} ${ScriptsDir}
ExitStatusScripts=$?
echo
}
## 更新 jd_scripts 脚本
function Git_PullScripts {
echo -e "更新 jd_scripts 脚本\n"
cd ${ScriptsDir}
git fetch --all
ExitStatusScripts=$?
git reset --hard origin/master
echo
}
## 给所有 shell 脚本赋予 755 权限
function Chmod_ShellScripts {
shfiles=$(find ${ShellDir} 2> /dev/null)
for shf in ${shfiles}; do
if [ ${shf##*.} == 'sh' ]; then
chmod 755 ${shf}
fi
done
}
## 获取用户数量 UserSum
function Count_UserSum {
for ((i=1; i<=35; i++)); do
Tmp=Cookie$i
CookieTmp=${!Tmp}
[[ ${CookieTmp} ]] && UserSum=$i || break
done
for ((d=36; d<=1000; d++)); do
Del=Cookie$d
sed -i "/${!Del}/d" ${FileConf} || break
done
}
## 检测文件:远程仓库 jd_scripts 中的 docker/crontab_list.sh
## 检测定时任务是否有变化,此函数会在 log 文件夹下生成四个文件,分别为:
## task.list crontab.list 中的所有任务清单,仅保留脚本名
## js.list 上述检测文件中用来运行 jd_scripts 脚本的清单(去掉后缀.js,非运行脚本的不会包括在内)
## js-add.list 如果上述检测文件增加了定时任务,这个文件内容将不为空
## js-drop.list 如果上述检测文件删除了定时任务,这个文件内容将不为空
function Diff_Cron {
if [ -f ${ListCron} ]; then
if [ -n "${JD_DIR}" ]
then
grep -E " j[drx]_\w+" ${ListCron} | perl -pe "s|.+ (j[drx]_\w+).*|\1|" | sort -u > ${ListTask}
else
grep "${ShellDir}/" ${ListCron} | grep -E " j[drx]_\w+" | perl -pe "s|.+ (j[drx]_\w+).*|\1|" | sort -u > ${ListTask}
fi
cat ${ListCronLxk} | grep -E "j[drx]_\w+\.js" | perl -pe "s|.+(j[drx]_\w+)\.js.+|\1|" | sort -u > ${ListJs}
grep -vwf ${ListTask} ${ListJs} > ${ListJsAdd}
grep -vwf ${ListJs} ${ListTask} > ${ListJsDrop}
else
echo -e "${ListCron} 文件不存在,请先定义你自己的 crontab.list\n"
fi
}
## 发送删除失效定时任务的消息
function Notify_DropTask {
cd ${ShellDir}
node update.js
[ -f ${ContentDropTask} ] && rm -f ${ContentDropTask}
}
## 发送新的定时任务消息
function Notify_NewTask {
cd ${ShellDir}
node update.js
[ -f ${ContentNewTask} ] && rm -f ${ContentNewTask}
}
## 检测配置文件版本
function Notify_Version {
## 识别出两个文件的版本号
VerConfSample=$(grep " Version: " ${FileConfSample} | perl -pe "s|.+v((\d+\.?){3})|\1|")
[ -f ${FileConf} ] && VerConf=$(grep " Version: " ${FileConf} | perl -pe "s|.+v((\d+\.?){3})|\1|")
## 删除旧的发送记录文件
[ -f "${SendCount}" ] && [[ $(cat ${SendCount}) != ${VerConfSample} ]] && rm -f ${SendCount}
## 识别出更新日期和更新内容
UpdateDate=$(grep " Date: " ${FileConfSample} | awk -F ": " '{print $2}')
UpdateContent=$(grep " Update Content: " ${FileConfSample} | awk -F ": " '{print $2}')
## 如果是今天,并且版本号不一致,则发送通知
if [ -f ${FileConf} ] && [[ "${VerConf}" != "${VerConfSample}" ]] && [[ ${UpdateDate} == $(date "+%Y-%m-%d") ]]
then
if [ ! -f ${SendCount} ]; then
echo -e "日期: ${UpdateDate}\n版本: ${VerConf} -> ${VerConfSample}\n内容: ${UpdateContent}\n\n" | tee ${ContentVersion}
echo -e "如需更新请手动操作,仅更新当天通知一次!" >> ${ContentVersion}
cd ${ShellDir}
node update.js
if [ $? -eq 0 ]; then
echo "${VerConfSample}" > ${SendCount}
[ -f ${ContentVersion} ] && rm -f ${ContentVersion}
fi
fi
else
[ -f ${ContentVersion} ] && rm -f ${ContentVersion}
[ -f ${SendCount} ] && rm -f ${SendCount}
fi
}
## npm install 子程序,判断是否安装有 yarn
function Npm_InstallSub {
if ! type yarn >/dev/null 2>&1
then
npm install --registry=https://mirrors.huaweicloud.com/repository/npm/ || npm install
else
echo -e "检测到本机安装了 yarn,使用 yarn 替代 npm\n"
yarn install --registry=https://mirrors.huaweicloud.com/repository/npm/ || yarn install
fi
}
## npm install
function Npm_Install {
echo -e "检测到 $1 的依赖包有变化,运行 npm install\n"
Npm_InstallSub
if [ $? -ne 0 ]; then
echo -e "\nnpm install 运行不成功,自动删除 $1/node_modules 后再次尝试一遍"
rm -rf node_modules
fi
echo
if [ ! -d node_modules ]; then
echo -e "运行 npm install\n"
Npm_InstallSub
if [ $? -ne 0 ]; then
echo -e "\nnpm install 运行不成功,自动删除 $1/node_modules\n"
echo -e "请进入 $1 目录后手动运行 npm install\n"
echo -e "3s\n"
sleep 1
echo -e "2s\n"
sleep 1
echo -e "1s\n"
sleep 1
rm -rf node_modules
fi
fi
}
## 输出是否有新的定时任务
function Output_ListJsAdd {
if [ -s ${ListJsAdd} ]; then
echo -e "检测到有新的定时任务:\n"
cat ${ListJsAdd}
echo
fi
}
## 输出是否有失效的定时任务
function Output_ListJsDrop {
if [ ${ExitStatusScripts} -eq 0 ] && [ -s ${ListJsDrop} ]; then
echo -e "检测到有失效的定时任务:\n"
cat ${ListJsDrop}
echo
fi
}
## 自动删除失效的定时任务,需要5个条件:
## 1. AutoAddCron 设置为 true
## 2. 正常更新 jd_scripts 脚本,没有报错
## 3. js-drop.list 不为空
## 4. crontab.list 存在并且不为空
## 5. 已经正常运行过 npm install
## 检测文件:远程仓库 jd_scripts 中的 docker/crontab_list.sh
## 如果检测到某个定时任务在上述检测文件中已删除,那么在本地也删除对应定时任务
function Del_Cron {
if [ "${AutoDelCron}" = "true" ] && [ -s ${ListJsDrop} ] && [ -s ${ListCron} ] && [ -d ${ScriptsDir}/node_modules ]; then
echo -e "开始尝试自动删除定时任务如下:\n"
cat ${ListJsDrop}
echo
JsDrop=$(cat ${ListJsDrop})
for Cron in ${JsDrop}
do
perl -i -ne "{print unless / ${Cron}( |$)/}" ${ListCron}
done
crontab ${ListCron}
echo -e "成功删除失效的脚本与定时任务\n\n"
if [ -d ${ScriptsDir}/node_modules ]; then
echo -e "删除失效的定时任务:\n\n${JsDrop}" > ${ContentDropTask}
Notify_DropTask
fi
fi
}
## 自动增加新的定时任务,需要5个条件:
## 1. AutoAddCron 设置为 true
## 2. 正常更新 jd_scripts 脚本,没有报错
## 3. js-add.list 不为空
## 4. crontab.list 存在并且不为空
## 5. 已经正常运行过 npm install
## 检测文件:远程仓库 jd_scripts 中的 docker/crontab_list.sh
## 如果检测到检测文件中增加新的定时任务,那么在本地也增加
## 本功能生效时,会自动从检测文件新增加的任务中读取时间,该时间为北京时间
function Add_Cron {
if [ "${AutoAddCron}" = "true" ] && [ -s ${ListJsAdd} ] && [ -s ${ListCron} ] && [ -d ${ScriptsDir}/node_modules ]; then
echo -e "开始尝试自动添加定时任务如下:\n"
cat ${ListJsAdd}
echo
JsAdd=$(cat ${ListJsAdd})
for Cron in ${JsAdd}
do
if [[ ${Cron} == jd_bean_sign ]]
then
echo "4 0,9 * * * bash ${ShellJd} ${Cron}" >> ${ListCron}
else
cat ${ListCronLxk} | grep -E "\/${Cron}\." | perl -pe "s|(^.+)node */scripts/(j[drx]_\w+)\.js.+|\1bash ${ShellJd} \2|" >> ${ListCron}
fi
done
if [ $? -eq 0 ]
then
crontab ${ListCron}
echo -e "成功添加新的定时任务\n\n"
if [ -d ${ScriptsDir}/node_modules ]; then
echo -e "成功添加新的定时任务:\n\n${JsAdd}" > ${ContentNewTask}
Notify_NewTask
fi
else
echo -e "添加新的定时任务出错,请手动添加\n"
if [ -d ${ScriptsDir}/node_modules ]; then
echo -e "尝试自动添加以下新的定时任务出错,请手动添加:\n\n${JsAdd}" > ${ContentNewTask}
Notify_NewTask
fi
fi
fi
}
## 为额外的 js 脚本存放目录配置 lxk0301/jd_scripts 环境
function Set_DiyEnv {
echo -e "\n--------------------------------------------------------------\n"
echo -e "设置额外的 js 脚本环境\n"
EnvFiles=(
Env.min.js
JS_USER_AGENTS.js
USER_AGENTS.js
index.js
jdCookie.js
sendNotify.js
)
if [[ ${DiyDirs} ]]; then
for ((i=0; i<${#DiyDirs[*]}; i++)); do
[ ! -d ${DiyDirs[i]} ] && mkdir -p ${DiyDirs[i]}
for env_file in ${EnvFiles[*]}; do
cp -f ${ScriptsDir}/${env_file} ${ShellDir}/${DiyDirs[i]}/
done
[ -f ${ShellDir}/${DiyDirs[i]}/package.json ] && DiyDependOld=$(cat ${ShellDir}/${DiyDirs[i]}/package.json)
if [ ${DiyPackgeJson} == "false" ]; then
cp -f ${ScriptsDir}/package.json ${ShellDir}/${DiyDirs[i]}/
fi
[ -f ${ShellDir}/${DiyDirs[i]}/package.json ] && DiyDependNew=$(cat ${ShellDir}/${DiyDirs[i]}/package.json)
if [ "${DiyDependOld}" != "${DiyDependNew}" ] || [ ! -d ${ShellDir}/${DiyDirs[i]}/node_modules ];then
cd ${ShellDir}/${DiyDirs[i]} && Npm_Install ${DiyDirs[i]}
fi
done
else
echo -e "未设置额外脚本目录,跳过\n"
fi
}
## 替换 jd_scripts 中的 js 脚本
function ReplaceJs {
echo -e "\n--------------------------------------------------------------\n"
echo -e "替换 js 脚本\n"
if [[ ${ReplaceJsName} ]] && [[ ${ReplaceJsUrl} ]]; then
for ((i=0; i<${#ReplaceJsName[*]}; i++)); do
cd ${ScriptsDir}
rm -f ${ReplaceJsName[i]}.js
wget -q ${ReplaceJsUrl[i]} -O ${ReplaceJsName[i]}.js
if [ $? == '0' ]; then
echo -e "${ReplaceJsName[i]}.js 替换成功\n"
else
echo -e "${ReplaceJsName[i]}.js 替换失败,请检查原因\n"
fi
done
else
echo -e "未设置替换,跳过\n"
fi
}
## 在日志中记录时间与路径
echo -e "\n##############################################################\n"
echo -n "系统时间:"
echo -e "$(date "+%Y-%m-%d %H:%M:%S")"
if [ "${TZ}" = "UTC" ]; then
echo -n "北京时间:"
echo -e "$(date -d "8 hour" "+%Y-%m-%d %H:%M:%S")"
fi
echo -e "\n--------------------------------------------------------------\n"
## 导入配置,设置远程仓库地址,更新 jd-base 脚本,发送新配置通知
Import_Conf "git_pull"
[ -f ${ShellDir}/panel/package.json ] && PanelDependOld=$(cat ${ShellDir}/panel/package.json)
Git_PullShell
[ -f ${ShellDir}/panel/package.json ] && PanelDependNew=$(cat ${ShellDir}/panel/package.json)
Git_PullShellNext
echo -e "\n--------------------------------------------------------------\n"
## 克隆或更新 jd_scripts 脚本
[ -f ${ScriptsDir}/package.json ] && ScriptsDependOld=$(cat ${ScriptsDir}/package.json)
[ -d ${ScriptsDir}/.git ] && Git_PullScripts || Git_CloneScripts
[ -f ${ScriptsDir}/package.json ] && ScriptsDependNew=$(cat ${ScriptsDir}/package.json)
## 执行各函数
if [[ ${ExitStatusScripts} -eq 0 ]]
then
echo -e "更新 jd_scripts 脚本成功\n"
sed -i '/本脚本开源免费使用 By/d' ${ScriptsDir}/sendNotify.js
Diff_Cron
[[ "${ScriptsDependOld}" != "${ScriptsDependNew}" ]] && cd ${ScriptsDir} && Npm_Install scripts
Output_ListJsAdd
Output_ListJsDrop
Del_Cron
Add_Cron
ReplaceJs
Set_DiyEnv
else
echo -e "更新 jd_scripts 脚本失败,请检查原因\n"
fi
## 给所有 shell 脚本赋予 755 权限
Chmod_ShellScripts