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)