#!/bin/bash

# 设置密码策略参数
PASS_MAX_DAYS=90    # 密码最大有效期90天
PASS_MIN_DAYS=1     # 密码最小使用时间1天
PASS_MIN_LEN=12     # 密码最小长度12位
PASS_WARN_AGE=7     # 密码过期前7天提醒

# 备份原文件
backup_file() {
    if [ -f "/etc/login.defs" ]; then
        local backup_file="/etc/login.defs.bak.$(date +%Y%m%d%H%M%S)"
        cp /etc/login.defs "$backup_file"
        echo "✅ 已备份原文件: $backup_file"
        return 0
    else
        echo "❌ 错误: /etc/login.defs 文件不存在"
        return 1
    fi
}

# 检查并修改配置
modify_login_defs() {
    local config_file="/etc/login.defs"
    local temp_file=$(mktemp)
    
    echo "🔧 开始修改密码策略配置..."
    
    # 读取原文件并修改配置
    while IFS= read -r line; do
        # 跳过注释行和空行
        if [[ "$line" =~ ^[[:space:]]*# ]] || [[ -z "$line" ]]; then
            echo "$line" >> "$temp_file"
            continue
        fi
        
        # 匹配并修改各个配置项
        case "$line" in
            PASS_MAX_DAYS*)
                echo "PASS_MAX_DAYS   $PASS_MAX_DAYS" >> "$temp_file"
                echo "📅 修改 PASS_MAX_DAYS = $PASS_MAX_DAYS"
                ;;
            PASS_MIN_DAYS*)
                echo "PASS_MIN_DAYS   $PASS_MIN_DAYS" >> "$temp_file"
                echo "📅 修改 PASS_MIN_DAYS = $PASS_MIN_DAYS"
                ;;
            PASS_MIN_LEN*)
                echo "PASS_MIN_LEN    $PASS_MIN_LEN" >> "$temp_file"
                echo "🔐 修改 PASS_MIN_LEN = $PASS_MIN_LEN"
                ;;
            PASS_WARN_AGE*)
                echo "PASS_WARN_AGE   $PASS_WARN_AGE" >> "$temp_file"
                echo "⏰ 修改 PASS_WARN_AGE = $PASS_WARN_AGE"
                ;;
            *)
                echo "$line" >> "$temp_file"
                ;;
        esac
    done < "$config_file"
    
    # 检查是否所有配置项都已存在，如果不存在则添加
    if ! grep -q "^PASS_MAX_DAYS" "$temp_file"; then
        echo "PASS_MAX_DAYS   $PASS_MAX_DAYS" >> "$temp_file"
        echo "📅 添加 PASS_MAX_DAYS = $PASS_MAX_DAYS"
    fi
    
    if ! grep -q "^PASS_MIN_DAYS" "$temp_file"; then
        echo "PASS_MIN_DAYS   $PASS_MIN_DAYS" >> "$temp_file"
        echo "📅 添加 PASS_MIN_DAYS = $PASS_MIN_DAYS"
    fi
    
    if ! grep -q "^PASS_MIN_LEN" "$temp_file"; then
        echo "PASS_MIN_LEN    $PASS_MIN_LEN" >> "$temp_file"
        echo "🔐 添加 PASS_MIN_LEN = $PASS_MIN_LEN"
    fi
    
    if ! grep -q "^PASS_WARN_AGE" "$temp_file"; then
        echo "PASS_WARN_AGE   $PASS_WARN_AGE" >> "$temp_file"
        echo "⏰ 添加 PASS_WARN_AGE = $PASS_WARN_AGE"
    fi
    
    # 替换原文件
    mv "$temp_file" "$config_file"
    chmod 644 "$config_file"
}

# 验证配置
verify_config() {
    echo ""
    echo "✅ 验证修改后的配置:"
    echo "========================"
    
    grep -E "^PASS_MAX_DAYS|^PASS_MIN_DAYS|^PASS_MIN_LEN|^PASS_WARN_AGE" /etc/login.defs | while read -r line; do
        echo "   $line"
    done
    
    echo "========================"
}

# 显示当前用户密码策略
show_current_user_policy() {
    echo ""
    echo "👤 当前用户密码策略:"
    echo "========================"
    
    if command -v chage >/dev/null 2>&1; then
        local current_user=$(whoami)
        echo "用户: $current_user"
        chage -l "$current_user" 2>/dev/null || echo "无法获取用户密码策略信息"
    else
        echo "chage 命令不可用"
    fi
    
    echo "========================"
}

# 显示策略说明
show_policy_explanation() {
    echo ""
    echo "📋 新密码策略说明:"
    echo "========================"
    echo "PASS_MAX_DAYS   $PASS_MAX_DAYS  - 密码最大有效期: ${PASS_MAX_DAYS}天"
    echo "PASS_MIN_DAYS   $PASS_MIN_DAYS  - 密码最小使用时间: ${PASS_MIN_DAYS}天(1天内不能修改密码)"
    echo "PASS_MIN_LEN    $PASS_MIN_LEN   - 密码最小长度: ${PASS_MIN_LEN}个字符"
    echo "PASS_WARN_AGE   $PASS_WARN_AGE  - 密码过期提醒: 过期前${PASS_WARN_AGE}天开始警告"
    echo "========================"
    echo "注意: 此配置对新创建的用户立即生效，现有用户需要手动使用chage命令修改"
}

# 应用策略到现有用户（可选）
apply_to_existing_users() {
    echo ""
    read -p "是否要将新策略应用到所有现有用户? (y/N): " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        echo "🔄 正在应用到现有用户..."
        
        # 获取所有普通用户（UID >= 1000）
        getent passwd | awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' | while read -r username; do
            if id "$username" &>/dev/null; then
                chage -M "$PASS_MAX_DAYS" "$username" 2>/dev/null
                chage -m "$PASS_MIN_DAYS" "$username" 2>/dev/null
                chage -W "$PASS_WARN_AGE" "$username" 2>/dev/null
                echo "   ✅ 已更新用户: $username"
            fi
        done
        
        # 也更新root用户（如果需要）
        chage -M "$PASS_MAX_DAYS" root 2>/dev/null && echo "   ✅ 已更新用户: root"
    fi
}

# 主函数
main() {
    echo "🛡️  开始设置系统密码策略..."
    echo "========================================"
    
    # 检查root权限
    if [ "$EUID" -ne 0 ]; then
        echo "❌ 错误: 需要root权限执行此脚本"
        echo "请使用: sudo $0"
        exit 1
    fi
    
    # 执行备份
    if ! backup_file; then
        exit 1
    fi
    
    # 修改配置
    modify_login_defs
    
    # 验证配置
    verify_config
    
    # 显示策略说明
    show_policy_explanation
    
    # 显示当前用户策略
    show_current_user_policy
    
    # 可选：应用到现有用户
    apply_to_existing_users
    
    echo ""
    echo "🎉 密码策略设置完成!"
    echo "⚠️  注意: 对新创建的用户立即生效，现有用户可能需要手动更新"
    echo "💡 提示: 使用 'chage -l username' 查看用户密码策略"
}

# 执行主函数
main "$@"
