Subversion - Python生成authz文件前,根据需要特别定义权限的路径,找出需关注权限的兄弟路径与路由至根的路径

Posted 王万林 Ben

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Subversion - Python生成authz文件前,根据需要特别定义权限的路径,找出需关注权限的兄弟路径与路由至根的路径相关的知识,希望对你有一定的参考价值。

场景

在一个项目里,所有该项目员工均能访问该项目的SVN仓库。突然有一天,老板要引入合作团队参与研发,要求SVN合作团队只能访问特定的几个目录。本文以svn://localhost:8888/chip_fe_repo/trunk/module_01/code/rtl为例。

分析

通常咱们会认为:这简单得很,只要在authz文件里,定义上述特定的几个目录的r或rw权限即可。话虽没错,这样设置了之后,合作团队是能访问者特定的svn://localhost:8888/chip_fe_repo/trunk/module_01/code/rtl了。但......

如果这个目录的父目录code、父父目录module_01、父父父目录trunk、根目录/,如果没有r权限,合作团队成员是无法直接执行 svn co svn://localhost:8888/chip_fe_repo 的,会报错提示“svn: E170001: Authorization failed”,只能执行 svn co svn://localhost:8888/chip_fe_repo/trunk/module_01/code/rtl。如下所示,

SVN仓库配置:

 执行svn查看:

 

怎么办,业务要求要直接执行  svn co svn://localhost:8888/chip_fe_repo 并且不能checkout多余的无权限文件夹。

解决方法自然是这特定的几个目录,到根目录,所有经过的目录,都要有r权限。那好,我们将这些目录结点都加上r权限,我们试试:

root@VM-20-5-ubuntu:~# vi $SVN_REPO_BASE/chip_fe_repo/conf/authz
root@VM-20-5-ubuntu:~# cat $SVN_REPO_BASE/chip_fe_repo/conf/authz | grep -v '^$'| grep -v '^#'
[aliases]
[groups]
[/]
*=
wanlinwang = r
[/trunk]
wanlinwang = r
[/trunk/module_01]
wanlinwang = r
[/trunk/module_01/code]
wanlinwang = r
[/trunk/module_01/code/rtl]
wanlinwang = rw

如上图所示,除了需要checkout的目录/文件(红色勾选的),还checkout了大量其他目录/文件。

原因:这些父目录,不止一个子目录,如图所示,绿色表示合作团队需要访问的特定的目录,黄色表示其到根目录经过的所有目录。如果将trunk目录开了r权限,则合作团队有module_01的r权限,但同时他有module_02到module_09的目录未定义用户或组的权限,则自动继承父目录的权限,即r权限。其它级别的目录也类似。

因此所有兄弟目录的权限也要关注,需要用程序将所有需要关注的目录生成出来,给业务补充好权限,再使用Python将其转成authz文件。

实现

本脚本,输入需要开权限的路径,与SVN URL,自动生成所有需要关注的路径。代码如下,

"""
:author: wanlinwang
:date:   23-Jul-2022
"""

import csv
import openpyxl
import svn.remote
import re


def list_svn_subdir(svn_repo_base_url, dir):
    """
    :author: wanlinwang
    :date:   23-Jul-2022
    :param svn_repo_base_url: SVN根URL
    :param dir: SVN文件夹
    :return: 返回svn ls svn://svnrepo/path/to/dir输出的文件夹
    """
    svn_url = svn_repo_base_url + '/' + dir
    r = svn.remote.RemoteClient(svn_url)
    rst = 'type': 'PATH_NODE', 'sub_dirs': []
    for p in r.list():
        if p.endswith('/'):
            p = p.strip('/')
            p_dict = 
                p: 
            
            rst['sub_dirs'].append(p_dict)
    return rst


def convert_json_to_csv(j, f, level=0):
    """
    :author: wanlinwang
    :date:   23-Jul-2022
    :param j: input json
    :param f: file object to write
    :param level: recursive level
    :return: None
    """
    for p in j:
        for q in p:
            print(',' * level + q, file=f)
            if len(p[q]) > 0:
                convert_json_to_csv(p[q]['sub_dirs'], f, level=level+1)


def csv_to_excel(csv_file, excel_file):
    csv_data = []
    with open(csv_file) as file_obj:
        reader = csv.reader(file_obj)
        for row in reader:
            csv_data.append(row)
    workbook = openpyxl.Workbook()
    sheet = workbook.active
    for row in csv_data:
        sheet.append(row)
    workbook.save(excel_file)
    print("Successfully saved to", excel_file)


if __name__ == '__main__':
    import argparse

    parser = argparse.ArgumentParser(description='Process args.')
    parser.add_argument('--paths', '-p', dest='paths_defined', type=str, nargs='+',
                        help='paths need to be defined.')
    parser.add_argument('--url', '-u', dest='repo_base_url', type=str,
                        help='SVN base url.')

    args = parser.parse_args()
    paths_defined = args.paths_defined
    repo_base_url = args.repo_base_url
    # repo_base_url = "file:///Users/ben/subversion-utils-dev/chip_fe_repo"

    svn_path_struct = []
    for p in paths_defined:
        uri = ''
        cur_level_dict = svn_path_struct
        p_splitted = p.split('/')[:-1]
        len_p_splitted = len(p_splitted)
        for i, d in enumerate(p_splitted):
            if len(d) == 0:
                d = '/'
            uri = re.sub('/+', '/', uri + '/' + d)
            rst = list_svn_subdir(repo_base_url, uri)
            index_dir = 0
            for k, d_dict in enumerate(cur_level_dict):
                if d in d_dict:
                    if len(d_dict[d]) == 0:
                        cur_level_dict[k][d] = rst
                    index_dir = k
                    break
            else:
                cur_level_dict.append(
                    d: rst
                )
                index_dir = len(cur_level_dict) - 1

            cur_level_dict = cur_level_dict[index_dir][d]['sub_dirs']
    # print(json.dumps(svn_path_struct, indent=4))

    with open('./svn_temp.csv', 'w+') as f:
        convert_json_to_csv(svn_path_struct, f=f)
    csv_to_excel('./svn_temp.csv', './svn_directory_structure.xlsx')


效果

 执行,生成了所有需要关注的路径,

以上是关于Subversion - Python生成authz文件前,根据需要特别定义权限的路径,找出需关注权限的兄弟路径与路由至根的路径的主要内容,如果未能解决你的问题,请参考以下文章

Apache Subversion 使用

python基础3

删除svn用户

svnadmin create:预期选项

为啥svn每次都要输入用户名和密码

工具软件 svn查看用户,切换用户