-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathredcheck_cli.py
More file actions
112 lines (95 loc) · 3.32 KB
/
Copy pathredcheck_cli.py
File metadata and controls
112 lines (95 loc) · 3.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
from __future__ import annotations
import argparse
import sys
from pathlib import Path
from fstec import VullistFormatError, load_vullist
from parsers import (
RedCheckFormatError,
modernization,
service_comparison,
updates,
)
def _add_common_options(parser: argparse.ArgumentParser) -> None:
parser.add_argument(
"--address-map",
help="CSV с колонками address;name",
)
parser.add_argument(
"--vullist",
help="Путь к официальному экспорту БДУ ФСТЭК vullist.xlsx",
)
parser.add_argument(
"--output",
required=True,
help="Путь к итоговому XLSX",
)
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(
description=(
"Legacy RedCheck 2022 XML report parser. "
"Current RedCheck compatibility update is expected."
)
)
subparsers = parser.add_subparsers(dest="command", required=True)
modernization_parser = subparsers.add_parser(
"modernization",
help="Сформировать отчёт по одному XML",
)
modernization_parser.add_argument("xml")
_add_common_options(modernization_parser)
service_parser = subparsers.add_parser(
"service",
help="Сравнить XML до и после работ",
)
service_parser.add_argument("before_xml")
service_parser.add_argument("after_xml")
_add_common_options(service_parser)
updates_parser = subparsers.add_parser(
"updates",
help="Сформировать перечень KB по узлам",
)
updates_parser.add_argument("xml")
updates_parser.add_argument(
"--output",
required=True,
help="Путь к итоговому XLSX",
)
validate_parser = subparsers.add_parser(
"validate-vullist",
help="Проверить формат vullist.xlsx",
)
validate_parser.add_argument("path")
return parser
def main(argv: list[str] | None = None) -> int:
parser = build_parser()
args = parser.parse_args(argv)
try:
if args.command == "modernization":
output = modernization(
args.xml,
address_map=args.address_map,
vullist_path=args.vullist,
output_path=args.output,
)
elif args.command == "service":
output = service_comparison(
args.before_xml,
args.after_xml,
address_map=args.address_map,
vullist_path=args.vullist,
output_path=args.output,
)
elif args.command == "updates":
output = updates(args.xml, output_path=args.output)
else:
frame = load_vullist(args.path)
print(f"Файл корректен. Загружено записей: {len(frame):,}")
print(f"Первый идентификатор: {frame.iloc[0]['ref_id'] if len(frame) else 'нет'}")
return 0
print(f"Готово: {output}")
return 0
except (FileNotFoundError, RedCheckFormatError, VullistFormatError, ValueError) as exc:
print(f"Ошибка: {exc}", file=sys.stderr)
return 2
if __name__ == "__main__":
raise SystemExit(main())