#!/bin/bash
set -euo pipefail # 开启严格模式:遇错退出,未定义变量报错,管道失败报错
# 打印日志函数,带时间戳
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
}
# 打印错误并退出
error_exit() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $*" >&2
exit 1
}
# 配置
CERT_NAME="mrsecond.cn"
PANEL_CERT_PATH="/vol3/1000/certs"
FNOS_CERT_PATH="/usr/trim/var/trim_connect/ssls/mrsecond.cn/1759997212"
log "开始证书更新流程..."
# 检查必要文件是否存在
[ -f "$PANEL_CERT_PATH/fullchain.pem" ] || error_exit "缺少文件:$PANEL_CERT_PATH/fullchain.pem"
[ -f "$PANEL_CERT_PATH/privkey.pem" ] || error_exit "缺少文件:$PANEL_CERT_PATH/privkey.pem"
log "重命名证书文件..."
mv "$PANEL_CERT_PATH/fullchain.pem" "$PANEL_CERT_PATH/$CERT_NAME.crt" || error_exit "重命名 fullchain.pem 失败"
mv "$PANEL_CERT_PATH/privkey.pem" "$PANEL_CERT_PATH/$CERT_NAME.key" || error_exit "重命名 privkey.pem 失败"
log "复制证书文件到目标路径..."
cp -av "$PANEL_CERT_PATH/${CERT_NAME}.crt" "$PANEL_CERT_PATH/${CERT_NAME}.key" "$FNOS_CERT_PATH/" || error_exit "复制证书文件失败"
log "设置证书文件权限为 755..."
chmod 0755 "$FNOS_CERT_PATH/$CERT_NAME.crt" "$FNOS_CERT_PATH/$CERT_NAME.key" || error_exit "chmod 失败"
log "获取新证书到期时间..."
NEW_EXPIRY_DATE=$(openssl x509 -enddate -noout -in "$FNOS_CERT_PATH/$CERT_NAME.crt" | sed "s/^.*=\(.*\)$/\1/")
if ! date -d "$NEW_EXPIRY_DATE" &>/dev/null; then
error_exit "证书到期日期格式有误:$NEW_EXPIRY_DATE"
fi
NEW_EXPIRY_TIMESTAMP=$(date -d "$NEW_EXPIRY_DATE" +%s%3N)
log "更新数据库中的证书有效期..."
if ! psql -U postgres -d trim_connect -c "UPDATE cert SET valid_to=$NEW_EXPIRY_TIMESTAMP WHERE domain='$CERT_NAME'"; then
error_exit "数据库更新失败"
fi
log "重启服务..."
systemctl restart webdav.service || error_exit "重启 webdav.service 失败"
systemctl restart smbftpd.service || error_exit "重启 smbftpd.service 失败"
systemctl restart trim_nginx.service || error_exit "重启 trim_nginx.service 失败"
log "证书更新流程完成!"