svnhook--获取svn配置文件的用户,显示在web网页上

上一篇文章里面说到,我们通过pre-commit向网页版获取当前svn仓库的锁定状态,来控制svn仓库是否允许提交

这样只是我们的第一步,第二步我们要做的事,向svn的配置文件获取一个名单,显示在web上,通过名单的移动授予权限,让用户可以提交

下面是获取名单的核心代码

import paramiko


def get_users_with_write_access(hostname, username, password, authz_path):
    # 创建 SSH 客户端
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    try:
        # 连接到服务器
        client.connect(hostname, username=username, password=password)

        # 执行命令以获取 authz 文件内容
        stdin, stdout, stderr = client.exec_command(f'cat {authz_path}')
        authz_content = stdout.read().decode('utf-8')

        # 解析 authz 文件,提取具有写权限的用户
        users_with_write_access = set()
        groups = {}
        current_section = None

        # 解析文件内容
        for line in authz_content.splitlines():
            line = line.strip()
            # 跳过空行和注释
            if not line or line.startswith('#'):
                continue

            # 处理路径或仓库授权部分
            if line.startswith('[') and line.endswith(']'):
                current_section = line.strip('[]').strip()
                continue

            # 解析授权行
            if current_section == 'groups':
                # 解析组定义
                parts = line.split('=')
                if len(parts) == 2:
                    group_name, members = parts
                    group_name = group_name.strip()
                    members = members.strip()
                    groups[group_name] = [member.strip() for member in members.split(',')]
            elif '=' in line:
                # 处理权限行
                parts = line.split('=')
                principals, permissions = parts
                principals = principals.strip()
                permissions = permissions.strip()

                if 'w' in permissions or 'W' in permissions or 'rw' in permissions or 'RW' in permissions:
                    for principal in principals.split(','):
                        principal = principal.strip()
                        if principal.startswith('@'):
                            # 记录组名
                            group_name = principal.lstrip('@')
                            if group_name in groups:
                                # 添加组成员到写权限列表
                                users_with_write_access.update(groups[group_name])
                        else:
                            # 添加用户到写权限列表
                            users_with_write_access.add(principal)

        return list(users_with_write_access)
    except Exception as e:
        print(f"Error: {e}")
        return []
    finally:
        # 关闭 SSH 连接
        client.close()

下面是调用部分

# 示例用法
hostname = 'xxxx'  # 替换为您的服务器地址
username = 'xxxt'  # 替换为您的 SSH 用户名
password = 'xxx'  # 替换为您的 SSH 密码
authz_path = '/svn/repository/test/conf/authz'  # 替换为 authz 文件的路径

#向svn仓库的配置文件获取有写权限的用户
users1 = get_users_with_write_access(hostname, username, password, authz_path)

这个代码会把配置文件里面有带w权限的用户名都列出来然后返回一个List

 

我们再定义一个get方法,让前端可以获取到我们的数据

@app.route('/api/users', methods=['GET'])
def get_users():
    users = users1
    return jsonify(users)

 

posted @ 2024-08-26 15:24  Hiro-D  阅读(11)  评论(0编辑  收藏  举报