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文件前,根据需要特别定义权限的路径,找出需关注权限的兄弟路径与路由至根的路径的主要内容,如果未能解决你的问题,请参考以下文章