当前位置: 首页 > article >正文

openlava/LSF 用户组管理脚本

背景

在openlava运维中经常需要自动化一些常规操作,比如增加用户组以及组成员、删除用户组成员、删除用户组等。而openlava的配置文件需要手动修改,然后再通过badmin  reconfig激活配置。因此开发脚本将手工操作自动化就很有必要。

通过将脚本中的UserGroup替换为HostGroup,就可以对主机组进行操作。

此脚本也适用于 LSF 用户组管理;不过LSF支持通过bconf修改配置,不再需要badmin reconfig激活。

功能

下面的脚本就可以对openlava中的用户组进行操作:

* 增加用户组成员,如果组不存在则自动创建用户组;

* 删除用户组成员,如果组内已没有成员则自动删除用户组;

* 删除用户组

* 检查用户组是否包含成员;

参数

在使用之前需要设置以下参数:

LSF_PROFILE="/openlava/etc/openlava.sh"
GROUP_FILE="/openlava/etc/lsb.users"
LOG_FILE="/openlava/log/lavaug.log"
ADMIN="lsfadmin"

使用方法

1. 检查用户组是否包含成员

lavaug checkmember <group> <member>

返回码:0 包含 非0 不包含

2. 增加用户组成员

lavaug addmember <group> <member>

返回码:0 添加成功 非0 添加失败

3. 删除用户组成员

lavaug rmmember <group> <member>

返回码:0 删除成功 非0 删除失败

4. 删除用户组

lavaug rmgroup <group> 

返回码:0 删除成功 非0 删除失败

注:脚本会将操作以及错误写入日志文件,方便审记和排查错误。

源代码

#!/bin/bash

logger() {
    echo `date` $@ >>  $LOG_FILE
}

# 判断配置文件中组名是否存在
is_group_defined() {
    local group=$1
    local file=$2
    # 使用 awk 查找在 "Begin UserGroup" 和 "End UserGroup" 之间的组名
    local group=$(awk -v group="$group" '/Begin UserGroup/,/End UserGroup/ { if ($1 == group) print $1 }' "$file")
    if [ -n "$group" ]; then
        return 0
    else
        return 1
    fi
}

# 判断配置文件中的组中是否包含指定成员
is_member_in_group() {
    local group=$1
    local member=$2
    local file=$3

    # 使用 awk 查找在 "Begin UserGroup" 和 "End UserGroup" 之间的组名用用户名
    local result=$(awk -v group="$group" -v member="$member" '
    /Begin UserGroup/,/End UserGroup/ {
        if ($1 == group && index($0, member)) {
            print member
        }
    }
    ' "$file")
    if [ -n "$result" ]; then
        return 0
    else
        return 1
    fi
}

# 在配置文件中添加新成员到组中
add_group_member() {
    local group=$1
    local member=$2
    local file=$3
    # 创建临时文件
    local tmp_file=$(mktemp)

    # 使用 awk 处理文件,找到组名并添加新成员,其他行保持不变,输出到临时文件
    awk -v group="$group" -v member="$member" '
    /Begin UserGroup/,/End UserGroup/ {
        # 在组名后的括号内添加新成员,确保不重复添加
        if ($1 == group && !index($0, member)) {
            sub(/)/, " " member ")")
        }
    }
    { print }
    ' "$file" > "$tmp_file"

    # 替换原文件
    mv "$tmp_file" "$file"
    chown "$ADMIN":"$ADMIN" "$file"
    is_member_in_group "$group" "$member" "$file"
    return $?
}

# 在配置文件中删除组成员, 成员列表为空时删除组
rm_group_member() {
    local group=$1
    local member=$2
    local file=$3
    # 创建临时文件
    local tmp_file=$(mktemp)

    # 使用 awk 处理文件,找到组名并删除成员,其他行保持不变,输出到临时文件
    awk -v group="$group" -v member="$member" '
    /Begin UserGroup/,/End UserGroup/ {
        # 在成员列表中删除指定成员, 若成员为空则删除组
        if ($1 == group && index($0, member)) {
            gsub(" *" member " *", " ")
            if ($2 == "(" && $3 == ")") {
                next
            }
        }
    }
    { print }
    ' "$file" > "$tmp_file"

    # 替换原文件
    mv "$tmp_file" "$file"
    chown "$ADMIN":"$ADMIN" "$file"
    if ! is_member_in_group "$group" "$member" "$file" ; then
        return 0
    else
        return 1
    fi
}

# 在配置文件中创建新组并添加新成员
create_group() {
    local group=$1
    local member=$2
    local file=$3
    # 创建临时文件
    local tmp_file=$(mktemp)    

    # 使用 awk 处理文件,在 "End UserGroup" 前添加新组,如果 "Begin UserGroup" 和 "End UserGroup" 存在
    awk -v group="$group" -v member="$member" '
    BEGIN { group_added = 0 }
    /Begin UserGroup/ {
        in_group = 1
    }
    /End UserGroup/ {
        if (!group_added) {
            print group " (" member ")"
            group_added = 1
        }
        in_group = 0
    }
    in_group { print }
    !in_group { print }
    ' "$file" > "$tmp_file"

    # 如果没有找到 "Begin UserGroup" 和 "End UserGroup",则直接在文件末尾添加
    if ! is_group_defined "$group" "$tmp_file"; then
        echo -e "\nBegin UserGroup\n"$group" ("$member")\nEnd UserGroup" >> "$tmp_file"
    fi

    # 替换原文件
    mv "$tmp_file" "$file"
    chown "$ADMIN":"$ADMIN" "$file"
    is_member_in_group "$group" "$member" "$file"
    return $?
}

# 在配置文件中删除组
rm_group() {
    local group=$1
    local file=$2
    # 创建临时文件
    local tmp_file=$(mktemp)

    # 使用 awk 处理文件,找到组名并添加新成员,其他行保持不变,输出到临时文件
    awk -v group="$group" '
    /Begin UserGroup/,/End UserGroup/ {
        # 在组名后的列表中删除成员
        if ($1 == group) {
            next
        }
    }
    { print }
    ' "$file" > "$tmp_file"

    # 替换原文件
    mv "$tmp_file" "$file"
    chown "$ADMIN":"$ADMIN" "$file"
    if ! is_group_defined "$group" "$file"; then
        return 0
    else
        return 1
    fi
}

# 检查系统内组是否存在
group_exist() {
    local group=$1
    bugroup $group > /dev/null 2>>$LOG_FILE
    return $?
}

# 检查系统内组是否存在
group_missing() {
    local group=$1
    bugroup $group > /dev/null 2>>$LOG_FILE
    if [ $? -eq 0 ]; then
        return 1
    else
        return 0
    fi
}

# 检查系统内用户是否存在于指定组
member_exist() {
    local group=$1
    local member=$2
    bugroup $group 2>>$LOG_FILE| grep -w $member >/dev/null
    return $?
}

# 检查系统内用户是否存在于指定组
member_missing() {
    local group=$1
    local member=$2
    bugroup $group 2>>$LOG_FILE| grep -w $member >/dev/null
    if [ $? -eq 0 ]; then
        return 1
    else
        return 0
    fi
}

# 激活配置文件中的变更
activate_change() {
    echo -e "y\nn\n" | badmin reconfig  >> $LOG_FILE 2>&1
    return $?
}

run() {
    # 检查 LSF 环境变量是否已加载
    if [ ! -f "$LSF_PROFILE" ]; then
        logger [ERRO] "LSF_PROFILE not found: $LSF_PROFILE"
        exit 1
    fi

    # 检查用户文件是否存在
    if [ ! -f "$GROUP_FILE" ]; then
        logger [ERROR] "User file not found: $GROUP_FILE"
        exit 1
    fi

    # 加载 LSF 环境变量
    . $LSF_PROFILE

    groupfile="$GROUP_FILE"
    action="$1"
    group="$2"
    member="$3"

    logger [INFO] request: $@
    case "$action" in
        "checkmember")
            member_exist "$group" "$member"
            ret=$?
            [ $ret -eq 0 ] && logger [INFO] "Found $member in $group" || logger [WARN] "Not found $member in $group"
            exit $ret
            ;;
        "addmember")
            # 检查组名是否在指定范围内
            if is_group_defined "$group" "$groupfile"; then
                if is_member_in_group "$group" "$member" "$groupfile"; then
                    member_exist "$group" "$member"
                    if [ $? -eq 0 ]; then
                        logger [INFO] $member already in group $group
                        exit 0
                    else
                        activate_change && sleep 5 && member_exist "$group" "$member"
                        ret=$?
                        [ $ret -eq 0 ] && logger [INFO] "Add $member into $group succeeded" || logger [WARN] "Add $member into $group failed"
                        exit $ret
                    fi
                else
                    # 组名存在,但成员不存在,添加新成员
                    add_group_member "$group" "$member" "$groupfile" && activate_change && sleep 5 && member_exist "$group" "$member"
                    ret=$?
                    [ $ret -eq 0 ] && logger [INFO] "Add $member into $group succeeded" || logger [WARN] "Add $member into $group failed"
                    exit $ret
                fi
            else
                # 组名不存在,创建新组并添加新成员
                create_group "$group" "$member" "$groupfile" && activate_change && sleep 5 && member_exist "$group" "$member"
                ret=$?
                [ $ret -eq 0 ] && logger [INFO] "Add $member into $group succeeded" || logger [WARN] "Add $member into $group failed"
                exit $ret
            fi
            ;;
        "rmmember")
            # 检查组名是否在指定范围内
            if is_group_defined "$group" "$groupfile"; then
                if is_member_in_group "$group" "$member" "$groupfile"; then
                    member_exist "$group" "$member"
                    if [ $? -eq 0 ]; then
                        rm_group_member  "$group" "$member" "$groupfile" && activate_change && sleep 5 && member_missing "$group" "$member"
                        ret=$?
                        [ $ret -eq 0 ] && logger [INFO] "Remove $member from $group succeeded" || logger [WARN] "Remove $member from $group failed"
                        exit $ret
                    else
                        # 组名存在,但成员不存在
                        logger [INFO] "$member is not in $group"
                        exit 0
                    fi
                else
                    # 组名存在,但成员不存在
                    logger [WARN] "Not found $group"
                    exit 0
                fi
            else
                # 组名不存在
                logger [WARN] "Not found $group"
                exit 0
            fi
            ;;
        "rmgroup")
            if is_group_defined "$group" "$groupfile"; then
                rm_group "$group" "$groupfile" && activate_change && sleep 5 && group_missing "$group"
                ret=$?
                [ $ret -eq 0 ] && logger [INFO] "Remove $group succeeded" || logger [WARN] "Remove $group failed"
                exit $ret
            elif group_exist "$group"; then
                # 文件中没有组名,但系统中还有
                activate_change && sleep 5 && group_missing "$group"
                ret=$?
                [ $ret -eq 0 ] && logger [INFO] "Remove $group succeeded" || logger [WARN] "Remove $group failed"
                exit $ret
            else
                logger [WARN] "Not found $group"
                exit 0
            fi
            ;;
        *)
            logger [WARN] "Invalid action: $action"
            exit 1
            ;;
    esac
}

##########################
#### Main Entry Start ####
##########################

# Please modify the LSF_PROFILE, GROUP_FILE, ADMIN accordingly
LSF_PROFILE="/openlava/etc/openlava.sh"
GROUP_FILE="/openlava/etc/lsb.users"
LOG_FILE="/openlava/log/lavaug.log"
ADMIN="lsfadmin"

run $@


http://www.kler.cn/a/518044.html

相关文章:

  • 网易Android开发面试题200道及参考答案 (下)
  • hadoop==docker desktop搭建hadoop
  • Golang Gin系列-8:单元测试与调试技术
  • 積分方程與簡單的泛函分析8.具連續對稱核的非齊次第II類弗雷德霍姆積分算子方程
  • electron打包客户端在rk3588上支持h265硬解
  • Unity URP 获取/设置 Light-Indirect Multiplier
  • 22_解析XML配置文件_List列表
  • eniops库中pack函数使用方法
  • Python数据分析-pandas入门(五)
  • LosslessCut:一款强大的音视频无损剪辑工具
  • 【深度学习】常见模型-生成对抗网络(Generative Adversarial Network, GAN)
  • 【优选算法】10----无重复字符的最长子串
  • Vue.js组件开发-如何实现带有搜索功能的下拉框
  • CASAIM与友达光电达成深度合作,CASAIM IS自动化蓝光测量技术为创新显示技术发展注入新的活力
  • Poetry shell --> poetry-plugin-shell
  • Hnu电子电路实验4
  • 基于数智立体化V2.0体系构建医疗综合智能体:理论、实践与展望
  • C语言内存管理详解
  • LKT4304新一代算法移植加密芯片,守护 物联网设备和云服务安全
  • leetcode——最大子数组和(java)
  • 15.7k!DISM++一款快捷的系统优化工具
  • 使用RocketMQ 的业务系统怎么处理消息的积压?
  • kafka-保姆级配置说明(broker)
  • 计算机视觉-卷积
  • Qt调用ffmpeg库实现简易视频播放器示例
  • 嵌入式音视频开发——视频篇(三)