需求
业务以Excel表提供路径权限关系表。由于条目较多,需要以自动的方式转成Subversion authz文件。
分析
表格可以清晰地定义各级的权限。但需要注意的是,假如角色在路径权限定义未找到,是会去找父目录、父父目录直到根目录。因此给某个角色开某个目录权限的同时,其父目录到根目录需开读权限,所有涉及到的路径的兄弟结点需关闭读写权限。
实现
# Author: wanlinwang
# Date: 21-Jul-2022
# Excel字段说明
# root level1 level2 level3 level4 'no permission' 'read only' 'read & write'
import re
from openpyxl import load_workbook
repo_name = 'chip_fe'
max_level = 4
xlsx_file = '/Users/ben/Desktop/svn权限文件.xlsx'
wb = load_workbook(filename=xlsx_file, read_only=True)
ws = wb['Sheet1']
skipped_1st_row = False
abs_path_elements = ['/'] + [None for i in range(max_level)]
for row in ws.rows:
if not skipped_1st_row:
skipped_1st_row = True
continue
# 此处遍历前 max_level+1 个元素。
# 其中,字段1是根路径。 字段2, 字段3, 字段4, 字段5,是SVN的TOP4层级目录。
for i, cell in enumerate(row[:max_level+1]):
if cell.value:
abs_path_elements[i] = cell.value
abs_path_elements[i+1:] = [None for _ in range(max_level - i)]
# print(i, cell.value)
# print(abs_path_elements)
abs_path = '/'.join([i for i in abs_path_elements if i]).replace('//', '/')
print('[' + repo_name + ':' + abs_path + ']')
# 遍历row[max_level+1:max_level+1+3]三个字段,分别是'no permission' 'read only' 'read & write'。
for i, cell in enumerate(row[max_level+1:max_level+1+3]):
if cell.value:
rule = cell.value.replace('\\', '')
if i == 0:
postfix = '='
elif i == 1:
postfix = '=r'
else:
postfix = '=rw'
rule = re.sub('$', postfix, rule)
rule = re.sub('\n', postfix + '\n', rule)
print(rule)
print()
wb.close()
效果
/Users/ben/software/opensource/Spack/spack/opt/spack/darwin-bigsur-cannonlake/apple-clang-12.0.0/python-3.9.0-pahq2xw2i2z2wozmfcl6sktw2qh4x4et/bin/python3 /Users/ben/PycharmProjects/untitled/practice/svn_xlsx2authz.py
[chip_fe:/]
*=
@user_ro=r
@g_adm=rw
@user_rw=rw
[chip_fe:/trunk]
*=
@user_ro=r
@g_adm=rw
@user_rw=rw
[chip_fe:/trunk/module_01]
*=
@user_ro=r
@g_adm=rw
@user_rw=rw
[chip_fe:/trunk/module_01/code]
*=
wanlinwang=r
@user_ro=r
@g_adm=rw
@user_rw=rw
[chip_fe:/trunk/module_01/bin]
*=
thesre=r
@user_ro=r
@g_adm=rw
@user_rw=rw
[chip_fe:/trunk/module_02]
*=
@user_ro=r
@g_adm=rw
@user_rw=rw
[chip_fe:/trunk/module_03]
*=
@user_ro=r
@g_adm=rw
@user_rw=rw
[chip_fe:/trunk/module_04]
*=
@user_ro=r
@g_adm=rw
@user_rw=rw
[chip_fe:/trunk/module_05]
*=
@user_ro=r
@g_adm=rw
@user_rw=rw
[chip_fe:/trunk/module_06]
*=
@user_ro=r
@g_adm=rw
@user_rw=rw
[chip_fe:/trunk/module_07]
*=
@user_ro=r
@g_adm=rw
@user_rw=rw
[chip_fe:/trunk/module_08]
*=
@user_ro=r
@g_adm=rw
@user_rw=rw
[chip_fe:/trunk/module_09]
*=
@user_ro=r
@g_adm=rw
@user_rw=rw
参考资料
https://svnbook.red-bean.com/en/1.7/svn.serverconfig.pathbasedauthz.html