conviso-ast 3.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. conviso_ast-3.0.0.data/scripts/flow_bash_completer.sh +21 -0
  2. conviso_ast-3.0.0.data/scripts/flow_fish_completer.fish +1 -0
  3. conviso_ast-3.0.0.data/scripts/flow_zsh_completer.sh +32 -0
  4. conviso_ast-3.0.0.dist-info/METADATA +37 -0
  5. conviso_ast-3.0.0.dist-info/RECORD +128 -0
  6. conviso_ast-3.0.0.dist-info/WHEEL +5 -0
  7. conviso_ast-3.0.0.dist-info/entry_points.txt +3 -0
  8. conviso_ast-3.0.0.dist-info/top_level.txt +1 -0
  9. convisoappsec/__init__.py +0 -0
  10. convisoappsec/common/__init__.py +5 -0
  11. convisoappsec/common/box.py +251 -0
  12. convisoappsec/common/cleaner.py +78 -0
  13. convisoappsec/common/docker.py +399 -0
  14. convisoappsec/common/exceptions.py +8 -0
  15. convisoappsec/common/git_data_parser.py +76 -0
  16. convisoappsec/common/graphql/__init__.py +0 -0
  17. convisoappsec/common/graphql/error_handlers.py +75 -0
  18. convisoappsec/common/graphql/errors.py +16 -0
  19. convisoappsec/common/graphql/low_client.py +51 -0
  20. convisoappsec/common/retry_handler.py +40 -0
  21. convisoappsec/common/strings.py +8 -0
  22. convisoappsec/flow/__init__.py +3 -0
  23. convisoappsec/flow/api.py +104 -0
  24. convisoappsec/flow/cleaner.py +118 -0
  25. convisoappsec/flow/graphql_api/__init__.py +0 -0
  26. convisoappsec/flow/graphql_api/beta/__init__.py +0 -0
  27. convisoappsec/flow/graphql_api/beta/client.py +18 -0
  28. convisoappsec/flow/graphql_api/beta/models/__init__.py +0 -0
  29. convisoappsec/flow/graphql_api/beta/models/issues/__init__.py +0 -0
  30. convisoappsec/flow/graphql_api/beta/models/issues/container.py +72 -0
  31. convisoappsec/flow/graphql_api/beta/models/issues/iac.py +6 -0
  32. convisoappsec/flow/graphql_api/beta/models/issues/normalize.py +13 -0
  33. convisoappsec/flow/graphql_api/beta/models/issues/sast.py +53 -0
  34. convisoappsec/flow/graphql_api/beta/models/issues/sca.py +78 -0
  35. convisoappsec/flow/graphql_api/beta/resources_api.py +142 -0
  36. convisoappsec/flow/graphql_api/beta/schemas/__init__.py +0 -0
  37. convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py +61 -0
  38. convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py +0 -0
  39. convisoappsec/flow/graphql_api/v1/__init__.py +0 -0
  40. convisoappsec/flow/graphql_api/v1/client.py +46 -0
  41. convisoappsec/flow/graphql_api/v1/models/__init__.py +0 -0
  42. convisoappsec/flow/graphql_api/v1/models/asset.py +14 -0
  43. convisoappsec/flow/graphql_api/v1/models/issues.py +16 -0
  44. convisoappsec/flow/graphql_api/v1/models/project.py +35 -0
  45. convisoappsec/flow/graphql_api/v1/resources_api.py +489 -0
  46. convisoappsec/flow/graphql_api/v1/schemas/__init__.py +0 -0
  47. convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py +212 -0
  48. convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py +180 -0
  49. convisoappsec/flow/source_code_scanner/__init__.py +9 -0
  50. convisoappsec/flow/source_code_scanner/exceptions.py +2 -0
  51. convisoappsec/flow/source_code_scanner/scc.py +68 -0
  52. convisoappsec/flow/source_code_scanner/source_code_scanner.py +177 -0
  53. convisoappsec/flow/util/__init__.py +7 -0
  54. convisoappsec/flow/util/ci_provider.py +99 -0
  55. convisoappsec/flow/util/metrics.py +16 -0
  56. convisoappsec/flow/util/source_code_compressor.py +22 -0
  57. convisoappsec/flow/version_control_system_adapter.py +528 -0
  58. convisoappsec/flow/version_searchers/__init__.py +9 -0
  59. convisoappsec/flow/version_searchers/sorted_by_versioning_style.py +85 -0
  60. convisoappsec/flow/version_searchers/timebased_version_seacher.py +39 -0
  61. convisoappsec/flow/version_searchers/version_searcher_result.py +33 -0
  62. convisoappsec/flow/versioning_style/__init__.py +0 -0
  63. convisoappsec/flow/versioning_style/semantic_versioning.py +44 -0
  64. convisoappsec/flowcli/__init__.py +3 -0
  65. convisoappsec/flowcli/__main__.py +4 -0
  66. convisoappsec/flowcli/assets/__init__.py +4 -0
  67. convisoappsec/flowcli/assets/create.py +88 -0
  68. convisoappsec/flowcli/assets/entrypoint.py +20 -0
  69. convisoappsec/flowcli/assets/ls.py +63 -0
  70. convisoappsec/flowcli/ast/__init__.py +3 -0
  71. convisoappsec/flowcli/ast/entrypoint.py +427 -0
  72. convisoappsec/flowcli/common.py +175 -0
  73. convisoappsec/flowcli/companies/__init__.py +0 -0
  74. convisoappsec/flowcli/companies/ls.py +25 -0
  75. convisoappsec/flowcli/container/__init__.py +3 -0
  76. convisoappsec/flowcli/container/entrypoint.py +17 -0
  77. convisoappsec/flowcli/container/run.py +306 -0
  78. convisoappsec/flowcli/context.py +49 -0
  79. convisoappsec/flowcli/deploy/__init__.py +0 -0
  80. convisoappsec/flowcli/deploy/create/__init__.py +4 -0
  81. convisoappsec/flowcli/deploy/create/context.py +12 -0
  82. convisoappsec/flowcli/deploy/create/entrypoint.py +31 -0
  83. convisoappsec/flowcli/deploy/create/with_/__init__.py +3 -0
  84. convisoappsec/flowcli/deploy/create/with_/entrypoint.py +20 -0
  85. convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py +4 -0
  86. convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py +11 -0
  87. convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py +30 -0
  88. convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py +4 -0
  89. convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py +21 -0
  90. convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py +84 -0
  91. convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py +115 -0
  92. convisoappsec/flowcli/deploy/create/with_/values.py +133 -0
  93. convisoappsec/flowcli/entrypoint.py +103 -0
  94. convisoappsec/flowcli/environment_checker.py +45 -0
  95. convisoappsec/flowcli/findings/__init__.py +4 -0
  96. convisoappsec/flowcli/findings/create/__init__.py +4 -0
  97. convisoappsec/flowcli/findings/create/entrypoint.py +18 -0
  98. convisoappsec/flowcli/findings/create/with_/__init__.py +3 -0
  99. convisoappsec/flowcli/findings/create/with_/entrypoint.py +19 -0
  100. convisoappsec/flowcli/findings/create/with_/version_tracker.py +93 -0
  101. convisoappsec/flowcli/findings/entrypoint.py +19 -0
  102. convisoappsec/flowcli/findings/import_sarif/__init__.py +4 -0
  103. convisoappsec/flowcli/findings/import_sarif/entrypoint.py +430 -0
  104. convisoappsec/flowcli/help_option.py +18 -0
  105. convisoappsec/flowcli/iac/__init__.py +3 -0
  106. convisoappsec/flowcli/iac/entrypoint.py +17 -0
  107. convisoappsec/flowcli/iac/run.py +328 -0
  108. convisoappsec/flowcli/requirements_verifier.py +132 -0
  109. convisoappsec/flowcli/sast/__init__.py +3 -0
  110. convisoappsec/flowcli/sast/entrypoint.py +17 -0
  111. convisoappsec/flowcli/sast/run.py +485 -0
  112. convisoappsec/flowcli/sbom/__init__.py +3 -0
  113. convisoappsec/flowcli/sbom/entrypoint.py +17 -0
  114. convisoappsec/flowcli/sbom/generate.py +235 -0
  115. convisoappsec/flowcli/sca/__init__.py +3 -0
  116. convisoappsec/flowcli/sca/entrypoint.py +17 -0
  117. convisoappsec/flowcli/sca/run.py +479 -0
  118. convisoappsec/flowcli/vulnerability/__init__.py +3 -0
  119. convisoappsec/flowcli/vulnerability/assert_security_rules.py +201 -0
  120. convisoappsec/flowcli/vulnerability/container_vulnerability_manager.py +175 -0
  121. convisoappsec/flowcli/vulnerability/entrypoint.py +18 -0
  122. convisoappsec/flowcli/vulnerability/rules_schema.json +53 -0
  123. convisoappsec/flowcli/vulnerability/run.py +487 -0
  124. convisoappsec/logger.py +29 -0
  125. convisoappsec/sast/__init__.py +0 -0
  126. convisoappsec/sast/decision.py +45 -0
  127. convisoappsec/sast/sastbox.py +296 -0
  128. convisoappsec/version.py +1 -0
@@ -0,0 +1,21 @@
1
+ _flow_completion() {
2
+ local IFS=$'
3
+ '
4
+ COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \
5
+ COMP_CWORD=$COMP_CWORD \
6
+ _FLOW_COMPLETE=complete $1 ) )
7
+ return 0
8
+ }
9
+
10
+ _flow_completionetup() {
11
+ local COMPLETION_OPTIONS=""
12
+ local BASH_VERSION_ARR=(${BASH_VERSION//./ })
13
+ # Only BASH version 4.4 and later have the nosort option.
14
+ if [ ${BASH_VERSION_ARR[0]} -gt 4 ] || ([ ${BASH_VERSION_ARR[0]} -eq 4 ] && [ ${BASH_VERSION_ARR[1]} -ge 4 ]); then
15
+ COMPLETION_OPTIONS="-o nosort"
16
+ fi
17
+
18
+ complete $COMPLETION_OPTIONS -F _flow_completion flow
19
+ }
20
+
21
+ _flow_completionetup;
@@ -0,0 +1 @@
1
+ complete --no-files --command flow --arguments "(env _FLOW_COMPLETE=complete_fish COMP_WORDS=(commandline -cp) COMP_CWORD=(commandline -t) flow)";
@@ -0,0 +1,32 @@
1
+ #compdef flow
2
+
3
+ _flow_completion() {
4
+ local -a completions
5
+ local -a completions_with_descriptions
6
+ local -a response
7
+ (( ! $+commands[flow] )) && return 1
8
+
9
+ response=("${(@f)$( env COMP_WORDS="${words[*]}" \
10
+ COMP_CWORD=$((CURRENT-1)) \
11
+ _FLOW_COMPLETE="complete_zsh" \
12
+ flow )}")
13
+
14
+ for key descr in ${(kv)response}; do
15
+ if [[ "$descr" == "_" ]]; then
16
+ completions+=("$key")
17
+ else
18
+ completions_with_descriptions+=("$key":"$descr")
19
+ fi
20
+ done
21
+
22
+ if [ -n "$completions_with_descriptions" ]; then
23
+ _describe -V unsorted completions_with_descriptions -U
24
+ fi
25
+
26
+ if [ -n "$completions" ]; then
27
+ compadd -U -V unsorted -a completions
28
+ fi
29
+ compstate[insert]="automenu"
30
+ }
31
+
32
+ compdef _flow_completion flow;
@@ -0,0 +1,37 @@
1
+ Metadata-Version: 2.2
2
+ Name: conviso-ast
3
+ Version: 3.0.0
4
+ Maintainer: Conviso
5
+ Maintainer-email: development@convisoappsec.com
6
+ Project-URL: Source, https://github.com/convisoappsec/convisocli/
7
+ Requires-Python: >=3.9
8
+ Description-Content-Type: text/markdown
9
+ Requires-Dist: GitPython==3.1.45
10
+ Requires-Dist: click==8.1.8
11
+ Requires-Dist: requests==2.32.5
12
+ Requires-Dist: urllib3==2.4.0
13
+ Requires-Dist: semantic-version==2.10.0
14
+ Requires-Dist: docker==7.1.0
15
+ Requires-Dist: PyYAML==6.0.3
16
+ Requires-Dist: click-log==0.4.0
17
+ Requires-Dist: transitions==0.9.2
18
+ Requires-Dist: jsonschema==4.25.1
19
+ Requires-Dist: giturlparse<=0.12.0
20
+ Requires-Dist: jmespath==1.0.1
21
+ Requires-Dist: setuptools==78.1.0
22
+ Dynamic: description
23
+ Dynamic: description-content-type
24
+ Dynamic: maintainer
25
+ Dynamic: maintainer-email
26
+ Dynamic: project-url
27
+ Dynamic: requires-dist
28
+ Dynamic: requires-python
29
+
30
+ # AST
31
+
32
+ This is a command line tool to execute Conviso AST.
33
+
34
+ # Documentation
35
+ Please visit the [official documentation] for further information.
36
+
37
+ [official documentation]: <https://docs.convisoappsec.com/security-scans/conviso-ast/>
@@ -0,0 +1,128 @@
1
+ conviso_ast-3.0.0.data/scripts/flow_bash_completer.sh,sha256=9q3HPuXq_FCUUV3IFGcOefsOLhPWatUkLY7txiBM7Uo,624
2
+ conviso_ast-3.0.0.data/scripts/flow_fish_completer.fish,sha256=-wiuarawDJkms5N-rh99brIOzhy-ktsM1mi1ohQ3Mtg,147
3
+ conviso_ast-3.0.0.data/scripts/flow_zsh_completer.sh,sha256=cAtTDGUs5sY4NAA7AjscmLWj0dbNZ9iZhLP6BTz6dEQ,844
4
+ convisoappsec/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ convisoappsec/logger.py,sha256=aTNebqOau9nEadBySMTXtnbGkOkJ_q2kyFlX1mzizeg,1132
6
+ convisoappsec/version.py,sha256=WZxVB-2_454JxgdmIIsxG-DUc65ia-VgtyjcgvV4mro,22
7
+ convisoappsec/common/__init__.py,sha256=QN7tV2C_jhTiWUrJHv2jbeq6ae3MssgLUWpQZwe8O2s,105
8
+ convisoappsec/common/box.py,sha256=WTtPF3YWxkcdblPmFTzrzQlPPPUwVsDt2zoi6xFMy1U,7561
9
+ convisoappsec/common/cleaner.py,sha256=Iy8BWCXj_v51oovcYzI_uhaJzLL-fCUyDxrbBglfwEs,2680
10
+ convisoappsec/common/docker.py,sha256=SYkZCgKS_kuREyJS_Zb4d61MWb58HoiFbxkSRzLJr0g,12529
11
+ convisoappsec/common/exceptions.py,sha256=Das7j6_nzB75-TY9xoVK12eswvxSntxI19nmXdjumzI,230
12
+ convisoappsec/common/git_data_parser.py,sha256=-Ou1YC8D4bpmHUcibxLiJf2rxKi8-SuTuto-6nB-ML8,2167
13
+ convisoappsec/common/retry_handler.py,sha256=MAwwD3QgxHZDJI87C8NPxYzxM4NBwGe3RflV7jRciAw,1495
14
+ convisoappsec/common/strings.py,sha256=JqBqW1redAfWTWtUFya2MvrW5T26Y07Vn0pbee-BpMo,185
15
+ convisoappsec/common/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ convisoappsec/common/graphql/error_handlers.py,sha256=1KUBa1zYiN_Gs2uwPsjl4LovoRFboWc16U7f680FfNE,2058
17
+ convisoappsec/common/graphql/errors.py,sha256=uWL4wkYG5Iqumu-m74HnW70QP0P9aBfBJKIfZFmgxgE,248
18
+ convisoappsec/common/graphql/low_client.py,sha256=RUKDx9N7li8BMj3zmRTWIm57a4-XoEHg2MkbvXyT7tg,1407
19
+ convisoappsec/flow/__init__.py,sha256=rjT1EIvy-xBfObIefOdxPfl1gQmYkHbFODYzI4VFXpQ,81
20
+ convisoappsec/flow/api.py,sha256=d9jOdr4jX8bD4BCMLT3jKCZO8W5mVpqRJGQIYS245hE,2493
21
+ convisoappsec/flow/cleaner.py,sha256=DRCrq_CkamYTZJTdbv_PYBCqgKz0N2ukFw2dued7nfQ,3679
22
+ convisoappsec/flow/version_control_system_adapter.py,sha256=glkG2pEIPSwBEFAZPHlqDuwk87ktiGUmSKaJrdWpYik,16056
23
+ convisoappsec/flow/graphql_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ convisoappsec/flow/graphql_api/beta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ convisoappsec/flow/graphql_api/beta/client.py,sha256=PPisDsUjFriDCT2EpHNPvw7bD_qYwGArFErsWbpBgIk,502
26
+ convisoappsec/flow/graphql_api/beta/resources_api.py,sha256=BKGVamCObXMxgK2ZVJLpUigwX7TNCBWyG9Mpti550wU,4339
27
+ convisoappsec/flow/graphql_api/beta/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ convisoappsec/flow/graphql_api/beta/models/issues/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
+ convisoappsec/flow/graphql_api/beta/models/issues/container.py,sha256=-XJ5aA1ixd-QT-yNJwNdwxds_CkakEQDQxwbxFDiTj8,2392
30
+ convisoappsec/flow/graphql_api/beta/models/issues/iac.py,sha256=NKHnfzj3DGlc89_W1KMJ8NkmnfrS7vzlF__BHNjrnyA,228
31
+ convisoappsec/flow/graphql_api/beta/models/issues/normalize.py,sha256=apo20vmNJuRXNqXS3d9vRMthKGm9Z1RCqGPbdGZ6keE,421
32
+ convisoappsec/flow/graphql_api/beta/models/issues/sast.py,sha256=b8ZiXuTlMlx8iOlG-dPl4X6ndLeuci122-Ly68nxYEI,1820
33
+ convisoappsec/flow/graphql_api/beta/models/issues/sca.py,sha256=dGHp-hfb9BRfBVvnnAtloDaTVcvf4-ucbRBjt6LcqV0,2637
34
+ convisoappsec/flow/graphql_api/beta/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py,sha256=zD9sJLO23bpMJn3NTY8C0_UAYEsnezKbldant_VQxoA,1119
36
+ convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ convisoappsec/flow/graphql_api/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ convisoappsec/flow/graphql_api/v1/client.py,sha256=bhtpYRWFiW8bvxScUwYKv7HamWAqNx_uckFDmrP42Po,1197
39
+ convisoappsec/flow/graphql_api/v1/resources_api.py,sha256=aW3B9rxcX6tnduiwLiuZrDkV1UQPCj9PU5dyfZCKzIE,14887
40
+ convisoappsec/flow/graphql_api/v1/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
+ convisoappsec/flow/graphql_api/v1/models/asset.py,sha256=rhHgQKXaRheksCSc8neMWQwd-cKB-noPpeO423nKFUQ,430
42
+ convisoappsec/flow/graphql_api/v1/models/issues.py,sha256=ZAM_aPwj20I7cApX1leCDVI8cX5LhcKAY1vkesNI_Ak,511
43
+ convisoappsec/flow/graphql_api/v1/models/project.py,sha256=CDZlufsT-_iQIOgpOPAtdmcv0JvHWFd6TjcDIAj6w7c,972
44
+ convisoappsec/flow/graphql_api/v1/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
+ convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py,sha256=R9LgniQyj694h1MD7cn1-HJRDjI4PLiOrCmsqjp16ho,3251
46
+ convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py,sha256=2jAgzA-8te6HyyV8RVAx0BnLDeZhFulZynbxm5JR8Sc,2713
47
+ convisoappsec/flow/source_code_scanner/__init__.py,sha256=UvfLXNR1B8Fy6LuUwesQMXV0oMkLjVMhPs0SJ5nDR0k,227
48
+ convisoappsec/flow/source_code_scanner/exceptions.py,sha256=6ehUyZaFfMIRMzKdh0MND8gfyTNyHY_wsprmxkxSJD0,57
49
+ convisoappsec/flow/source_code_scanner/scc.py,sha256=O_kdWsw2x0czuKcLORD3gP5wbXsizj4Bb2Sbsk5n_Sw,1645
50
+ convisoappsec/flow/source_code_scanner/source_code_scanner.py,sha256=L9LVZnUO-o_JvT8dHUxBXcbxQlxSqRP8CVUBgTUEV7s,4726
51
+ convisoappsec/flow/util/__init__.py,sha256=rpu69qnn68rqrK3rhPcgrVYWCIW9WVSrQ5FyCeHxng4,160
52
+ convisoappsec/flow/util/ci_provider.py,sha256=VYDESwNFbtrRcWDtTEb8tYDN5qbnLksmQI_ntsciJ4I,2093
53
+ convisoappsec/flow/util/metrics.py,sha256=4qGBMMR02OZN4ezFiB9iqtCuUYO8bXYqeUNDFRDpQaw,480
54
+ convisoappsec/flow/util/source_code_compressor.py,sha256=b2iA8Exf8wVbxR1mnvwTbruDjdpYyVloUmSlyYLSJQU,508
55
+ convisoappsec/flow/version_searchers/__init__.py,sha256=rJkVGlmWiiDHegvQl7d900RvnglzICXpTxuUiLlHSz0,294
56
+ convisoappsec/flow/version_searchers/sorted_by_versioning_style.py,sha256=xLjaHy-WDOgY5jrASnaK-uM0UL-9sL3BALwzmM5PgSA,2657
57
+ convisoappsec/flow/version_searchers/timebased_version_seacher.py,sha256=fO3o93n4cgKJKYMtCtd76Yc80jFPal4EYf0ubhZGaoI,1266
58
+ convisoappsec/flow/version_searchers/version_searcher_result.py,sha256=RxROFRuQ0GXE9MhW6oKg2sPzZHkwhuaffkTUH6xDWZw,943
59
+ convisoappsec/flow/versioning_style/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
+ convisoappsec/flow/versioning_style/semantic_versioning.py,sha256=a47GNtPQbZ5MEjFypwyc7JVxSlbSY1xci-1woo54Ss0,1041
61
+ convisoappsec/flowcli/__init__.py,sha256=cNqNWO7nd1wyFCvYUQPWhRxZnwwwMnHbcppXqWt0SJA,64
62
+ convisoappsec/flowcli/__main__.py,sha256=9Bop0ORSNHNOe4uMhTq6UFvVfhQufGy3Mdim1qblIqk,99
63
+ convisoappsec/flowcli/common.py,sha256=wmasRcE9J8pBCyRmpdNRdynHOlM6OsWdKhpRhMU8OmA,4881
64
+ convisoappsec/flowcli/context.py,sha256=67I1u11HIIW6BKs_hALLETWVe25ZgBhq1sqAOHXq_e4,1309
65
+ convisoappsec/flowcli/entrypoint.py,sha256=V8zAF_tMFzz9FbEaqkHF_KK7xPMY8XXVq9zSG93sNVM,2754
66
+ convisoappsec/flowcli/environment_checker.py,sha256=NEWIiTVlbBIRwQ9AyAwM2okTjQ1MRvZoZ_OSMtIewGk,1714
67
+ convisoappsec/flowcli/help_option.py,sha256=JW9qp_S7UMFQR2MVJP5x82zBKlo7DhGiw403ukGwfAY,331
68
+ convisoappsec/flowcli/requirements_verifier.py,sha256=CCRizESeRNAn013SgdNRStv-AEVfZrZMdWo0YQN5T4w,5206
69
+ convisoappsec/flowcli/assets/__init__.py,sha256=9ry90G81ARDlvMJVtA1GwTHxjDfmI8g15etShDuZgZA,54
70
+ convisoappsec/flowcli/assets/create.py,sha256=JDmxDH1WbyaQYLTxoi6dS_WosRm7kjvpJVDEJ3Cp8fw,2278
71
+ convisoappsec/flowcli/assets/entrypoint.py,sha256=CEoev3d1ogclPNP3l31PBhGkoiZZ400kxsnnF02uxFk,310
72
+ convisoappsec/flowcli/assets/ls.py,sha256=IYfKIca218BvZ5ecrtDgZ_T8xVg0XO3Eq1kK16BMBsc,1484
73
+ convisoappsec/flowcli/ast/__init__.py,sha256=9SO9inH22PPm4jLlljVTJEeJKZujFKfwqTBbBo-TwFM,47
74
+ convisoappsec/flowcli/ast/entrypoint.py,sha256=pwkXn9R1FNuUlTGrwUIMCacpklYSFR9BFDB59a_ivcU,15946
75
+ convisoappsec/flowcli/companies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
+ convisoappsec/flowcli/companies/ls.py,sha256=0287VTXOkKnuXTaJh392crYjx0qank0pBvmESq3P_Bw,892
77
+ convisoappsec/flowcli/container/__init__.py,sha256=Z666kQa4qVfbcuyLaW_hvORdAPtZ9dTQFcQb2H2Nkfg,59
78
+ convisoappsec/flowcli/container/entrypoint.py,sha256=G5db82E0MrQSF7lk_7O7IodCmFtuKizXvCdMPfTc-Jc,268
79
+ convisoappsec/flowcli/container/run.py,sha256=XRjxQvetw-Kdyg9rRSg8rh_vw_E9zJPjoVhYJrtpcS8,9894
80
+ convisoappsec/flowcli/deploy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
+ convisoappsec/flowcli/deploy/create/__init__.py,sha256=l7eIySVkTKr3auZ8Fwe7G6AG6-pM06vnl3aZcEclVP4,54
82
+ convisoappsec/flowcli/deploy/create/context.py,sha256=iazxDAx4SEGHJP9Psd16wUL9KlgKqlGdsBU8dU_jW48,190
83
+ convisoappsec/flowcli/deploy/create/entrypoint.py,sha256=NAc6wnFKYpPSvLrE0v89zTDAlV3XJ9nEn4EMvrV-tFo,677
84
+ convisoappsec/flowcli/deploy/create/with_/__init__.py,sha256=dfk3jJnixGV1_-YLopkoLFHIK0nWCMC9YxrcLYCbCRo,51
85
+ convisoappsec/flowcli/deploy/create/with_/entrypoint.py,sha256=h0EVvgNzW_e3iuxH_kVd30jOWXrY7B0uzzrfzRVvO_A,346
86
+ convisoappsec/flowcli/deploy/create/with_/values.py,sha256=rJ4l35xfkd5x2pGMRpHMLd3UArFC-gvJddVqHERiQ7w,4661
87
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py,sha256=fu1DRXmTRncvmgNBFgKF3psy-dYmVXsTD6vFJXDsvbo,64
88
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py,sha256=IZjsKSzetrjVyFKhO6NBrfCypf8MO-AFYNfRxkYJZww,194
89
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py,sha256=MUrx_fqAFQeJ2oUaAxRDPfk_qlgyNHKFMNZqmiDFWrU,675
90
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py,sha256=c1sggCq3RGdgyq0tqdxx_yGW1iOeBti2aoNsoiMxKnc,56
91
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py,sha256=J5dSGo0P__fKlPpeaVcAmyFnnAtZPi0E2y4Hv_U-ZQM,382
92
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py,sha256=Ipkz0bVXfJlbYHfPFICY3VUZYwlL2gxuHUqVVtvSyzQ,2721
93
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py,sha256=-FJF4BOLzzpcJqYHlYJovRuvoUut7gLoxDWKnT6CzH0,3416
94
+ convisoappsec/flowcli/findings/__init__.py,sha256=0wiNMaThYuum1QA9s9-LGtcmWFxUY-mWiYMtTSuaDqY,58
95
+ convisoappsec/flowcli/findings/entrypoint.py,sha256=foc6wgD2BsoFZkJQiIuis260Zt-3DkTLsxej7cHv9Ko,344
96
+ convisoappsec/flowcli/findings/create/__init__.py,sha256=l7eIySVkTKr3auZ8Fwe7G6AG6-pM06vnl3aZcEclVP4,54
97
+ convisoappsec/flowcli/findings/create/entrypoint.py,sha256=EK2xThAzhMDV4aOxzUgEbT-adOkmFsX5R96CEKCuUmU,269
98
+ convisoappsec/flowcli/findings/create/with_/__init__.py,sha256=dfk3jJnixGV1_-YLopkoLFHIK0nWCMC9YxrcLYCbCRo,51
99
+ convisoappsec/flowcli/findings/create/with_/entrypoint.py,sha256=Bvbh0YIixAPD5ullp7bkpY9oub0YTEBu3hkUfKTJVtU,309
100
+ convisoappsec/flowcli/findings/create/with_/version_tracker.py,sha256=NrnYx6OMQWXRMYDU5ND0c0O4zUER2U3wrNzWsD5TisE,2637
101
+ convisoappsec/flowcli/findings/import_sarif/__init__.py,sha256=3iR7f9V9NdoIQTrD25EVu6OAYPPJ4RZEaM4P34BS0js,66
102
+ convisoappsec/flowcli/findings/import_sarif/entrypoint.py,sha256=MIHi9ZWU2Jn2o7o5mDLp81xfb14gsa33aGnqh1YR7n8,13740
103
+ convisoappsec/flowcli/iac/__init__.py,sha256=a3IZzSKpm987fMEliTECDeXO_Eduk7eg-aQzmaWvUXQ,47
104
+ convisoappsec/flowcli/iac/entrypoint.py,sha256=vGsHdIss3KEWartTZkKl7k5w1qxhYIVqHGOJdklc3b8,241
105
+ convisoappsec/flowcli/iac/run.py,sha256=q-bndWtZb9xYE9U_4aMHcZ3WtgHyXQBqUkjHTk-hdwI,11071
106
+ convisoappsec/flowcli/sast/__init__.py,sha256=S4O78eZGhgpT2lZY3GSUIUTQJB5a62uAVirEqbf4EQY,49
107
+ convisoappsec/flowcli/sast/entrypoint.py,sha256=7bvQ6mVLWvykGfjD-o0xbu7ybm8Hj2DTqvCv5CstIas,245
108
+ convisoappsec/flowcli/sast/run.py,sha256=7uX6K1VLASU8RnoCKNYIIqXSsNkF4JQ8OKhAG2CKjuI,16353
109
+ convisoappsec/flowcli/sbom/__init__.py,sha256=qzwiPWniK41Y41XvJJhxtRZguHrSSenb57lhy64KnSc,49
110
+ convisoappsec/flowcli/sbom/entrypoint.py,sha256=ax2WL5BtCu24NeZYe6zzCVZ2ujlviXkvtY7PZihlz3s,263
111
+ convisoappsec/flowcli/sbom/generate.py,sha256=Oke4JX4vARqpsMlGC2cPye_LMapIMRDyZv2W14hoD8g,7170
112
+ convisoappsec/flowcli/sca/__init__.py,sha256=xnVoxwbpe4LrEemmWJ6svr3zdpo9S4kEIvM4HVRsLX8,47
113
+ convisoappsec/flowcli/sca/entrypoint.py,sha256=LpFoiZ3iljhAyKzfMJ7pdBdHIUhnjh3ZguPgvWJZ-XA,241
114
+ convisoappsec/flowcli/sca/run.py,sha256=FWnTHgMgnIRvJSpMIkFcb6YMtvWEjEpKJyXEkjAZpA4,16725
115
+ convisoappsec/flowcli/vulnerability/__init__.py,sha256=c18E0J1KfZBBqpv8XGxF5dv7dxCDquFkjGkdnvFDSYI,67
116
+ convisoappsec/flowcli/vulnerability/assert_security_rules.py,sha256=j7VcondMeZSRxWz118aWS9qUSGdvsq4Mg-_9UXp8Dyw,6075
117
+ convisoappsec/flowcli/vulnerability/container_vulnerability_manager.py,sha256=EkJhbUm1DTP14mIg_ZC4SKFSlvTtfPpSpNAMWPkwrsc,6897
118
+ convisoappsec/flowcli/vulnerability/entrypoint.py,sha256=WsQkEJSbb9CwPm_deUtata9omEYYcaZnssYKTAybtjA,386
119
+ convisoappsec/flowcli/vulnerability/rules_schema.json,sha256=OBkj9RMXltGoJYsyPqOsrJDfcyrQDlQHk9b5i9rMhoc,948
120
+ convisoappsec/flowcli/vulnerability/run.py,sha256=6flmvr55cKxj-duX3w4PAFwJgC5AJ0NYJ9Zk3FZHFII,17144
121
+ convisoappsec/sast/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
+ convisoappsec/sast/decision.py,sha256=d7dcNr9yZMzyccpFS_peAmDo0ZtfsE1qXDdYrvCux2U,1025
123
+ convisoappsec/sast/sastbox.py,sha256=hXZLiYh_F3f6yd1ydPYVOMKg-tNOQOZiBvKmWyedagI,11031
124
+ conviso_ast-3.0.0.dist-info/METADATA,sha256=ibjt1tIB2ghrzamhcBOiYfZSUOeEH2wEZg-sOySlk2A,1075
125
+ conviso_ast-3.0.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
126
+ conviso_ast-3.0.0.dist-info/entry_points.txt,sha256=0IvamweR_V0uG4O5Fo9NpVHTHfpZRwUE9kn7KEVZ668,109
127
+ conviso_ast-3.0.0.dist-info/top_level.txt,sha256=ju5r0RSCF1HA7m9JOG10jrQS4SnqQEJzl6-YMCxbSl4,14
128
+ conviso_ast-3.0.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (75.8.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ conviso = convisoappsec.flowcli.entrypoint:cli
3
+ flow = convisoappsec.flowcli.entrypoint:cli
@@ -0,0 +1 @@
1
+ convisoappsec
File without changes
@@ -0,0 +1,5 @@
1
+ from urllib.parse import urljoin
2
+
3
+
4
+ def safe_join_url(base_url, path):
5
+ return urljoin(base_url, path)
@@ -0,0 +1,251 @@
1
+ import docker
2
+ import tarfile
3
+ import tempfile
4
+ import time
5
+ from concurrent.futures import ThreadPoolExecutor
6
+
7
+ from transitions import Machine
8
+ from transitions.extensions.states import Timeout, add_state_features
9
+
10
+ from convisoappsec.common.docker import SCSCommon
11
+ from convisoappsec.logger import LOGGER
12
+
13
+ RAW_STATE_MSG = 'Scanner {} entered on {} state'
14
+
15
+
16
+ class SARIFParsingError(BaseException):
17
+ pass
18
+
19
+
20
+ class PropertyRequiredError(SARIFParsingError):
21
+ def __init__(self, stderr_log=''):
22
+ pretty_error = self.__parse_pretty_property_error(stderr_log)
23
+ print('Error:', pretty_error)
24
+
25
+ def __parse_pretty_property_error(self, stderr_logs):
26
+ expected_error_line = ''
27
+
28
+ for log_line in stderr_logs.split('\n'):
29
+ expected_error_text = 'PropertyRequiredError'
30
+ if expected_error_text in log_line:
31
+ expected_error_line = log_line
32
+ break
33
+
34
+ error = self.__extract_text_after_colon(expected_error_line)
35
+
36
+ return error.strip()
37
+
38
+ def __extract_text_after_colon(self, text):
39
+ try:
40
+ return text.split(':', 3)[-1]
41
+ except IndexError:
42
+ return ''
43
+
44
+
45
+ @add_state_features(Timeout)
46
+ class ScannerMachine(Machine):
47
+ pass
48
+
49
+
50
+ class ScannerEntity:
51
+
52
+ def __init__(self, token, scanner, logger=None, timeout=7200):
53
+ self.logger = logger or LOGGER
54
+ self.token = token
55
+
56
+ self.scanner = self.__setup_scanner(scanner)
57
+ self.name = self.scanner.name
58
+ self.results = None
59
+
60
+ self.states = [
61
+ 'waiting',
62
+ {'name': 'pulling', 'timeout': timeout, 'on_timeout': self._on_timeout},
63
+ {'name': 'running', 'timeout': timeout, 'on_timeout': self._on_timeout},
64
+ {'name': 'sending', 'timeout': timeout, 'on_timeout': self._on_timeout},
65
+ 'done'
66
+ ]
67
+ self.machine = ScannerMachine(
68
+ model=self,
69
+ states=self.states,
70
+ initial='waiting'
71
+ )
72
+ self.machine.add_ordered_transitions()
73
+ self._set_callbacks()
74
+ self.to_waiting()
75
+
76
+ def __setup_scanner(self, scanner):
77
+ if isinstance(scanner, SCSCommon):
78
+ return scanner
79
+ else:
80
+ return self._instanciate_scanner(scanner)
81
+
82
+ def _set_callbacks(self):
83
+ self.machine.on_enter_waiting('_on_waiting')
84
+ self.machine.on_enter_pulling('_on_pulling')
85
+ self.machine.on_enter_running('_on_running')
86
+ self.machine.on_enter_sending('_on_sending')
87
+ self.machine.on_enter_done('_on_done')
88
+
89
+ def _instanciate_scanner(self, data):
90
+ return SCSCommon(
91
+ **data,
92
+ token=self.token,
93
+ logger=self.logger,
94
+ )
95
+
96
+ def _on_timeout(self):
97
+ self.logger.debug('Scanner {} timeout on state {}'.format(
98
+ self.name, self.state
99
+ ))
100
+
101
+ def _on_waiting(self):
102
+ self.logger.debug(RAW_STATE_MSG.format(
103
+ self.name, self.state
104
+ ))
105
+
106
+ def _on_pulling(self):
107
+ self.logger.debug(RAW_STATE_MSG.format(
108
+ self.name, self.state
109
+ ))
110
+ image = self.scanner.pull()
111
+ if image:
112
+ self.logger.debug('Image: {}'.format(image))
113
+ self.next_state()
114
+ else:
115
+ raise RuntimeError("Image not found.")
116
+
117
+ def _on_running(self):
118
+ self.scanner.run()
119
+ self.end_time = time.time()
120
+ self.logger.debug('Total execution time for {} was {:2f}'.format(
121
+ self.scanner.repository_name,
122
+ self.end_time - self.start_time
123
+ ))
124
+ self.next_state()
125
+
126
+ def _on_sending(self):
127
+ self.logger.debug(RAW_STATE_MSG.format(
128
+ self.name, self.state
129
+ ))
130
+ self.results = self.scanner.get_container_reports()
131
+ self.next_state()
132
+
133
+ def _on_done(self):
134
+ self.logger.debug(RAW_STATE_MSG.format(
135
+ self.scanner.repository_name, self.state
136
+ ))
137
+ self.scanner.container.remove(v=True, force=True)
138
+
139
+ def start(self):
140
+ self.start_time = time.time()
141
+ self.to_pulling()
142
+
143
+
144
+ class ContainerWrapper:
145
+
146
+ def __init__(self, token, containers_map, logger, timeout, max_workers=5):
147
+ self.token = token
148
+ self.logger = logger or LOGGER
149
+ self.max_workers = max_workers
150
+ self.scanners = [
151
+ ScannerEntity(
152
+ token=token,
153
+ scanner=scanner,
154
+ logger=logger,
155
+ timeout=timeout
156
+ )
157
+ for scanner in containers_map.values()
158
+ ]
159
+
160
+ def run(self):
161
+ self.logger.debug("Starting Execution")
162
+ with ThreadPoolExecutor(max_workers=self.max_workers) as exeggutor:
163
+ for scanner in self.scanners:
164
+ exeggutor.submit(scanner.start)
165
+
166
+
167
+ def convert_sarif_to_sastbox1(report_filepath, repository_dir, container_registry_token, scanner_timeout=7200):
168
+ """
169
+ Args:
170
+ report_filepath (str): filepath to the report to be converted
171
+ repository_dir (str): filepath to the repository being tested
172
+ token (str): Conviso container registry token
173
+ scanner_timeout (int): container timeout
174
+
175
+ Returns:
176
+ string: filepath to the converted report
177
+ """
178
+ CONTAINER_IMAGE_NAME = 'sastbox-converter-tool'
179
+ CONTAINER_IMAGE_TAG = 'cc50dee'
180
+
181
+ CONTAINER_INPUT_FILEPATH = '/code{}'.format(
182
+ report_filepath.replace(repository_dir, '')
183
+ )
184
+ CONTAINER_OUTPUT_FILENAME = CONTAINER_INPUT_FILEPATH.replace(
185
+ 'sarif', 'json'
186
+ )
187
+
188
+ CONTAINERS_MAP = {
189
+ CONTAINER_IMAGE_NAME: {
190
+ 'repository_dir': repository_dir,
191
+ 'repository_name': CONTAINER_IMAGE_NAME,
192
+ 'tag': CONTAINER_IMAGE_TAG,
193
+ 'command': [
194
+ '--format', 'sastbox1',
195
+ '--input', CONTAINER_INPUT_FILEPATH,
196
+ '--output', CONTAINER_OUTPUT_FILENAME
197
+ ],
198
+ },
199
+ }
200
+ converter_wrapped = ContainerWrapper(
201
+ token=container_registry_token,
202
+ containers_map=CONTAINERS_MAP,
203
+ logger=None,
204
+ timeout=scanner_timeout
205
+ )
206
+
207
+ converter_wrapped.logger.setLevel('WARN')
208
+ converter_wrapped.run()
209
+ converter_wrapped.logger.setLevel('INFO')
210
+
211
+ scanner = converter_wrapped.scanners[0].scanner
212
+ last_scan_name = scanner.name
213
+ last_container = scanner.docker.containers.get(
214
+ last_scan_name
215
+ )
216
+
217
+ try:
218
+ chunks, _ = last_container.get_archive(CONTAINER_OUTPUT_FILENAME)
219
+ output_filepath = __extract_tarball_chunks(
220
+ chunks, report_filepath.replace('sarif', 'json')
221
+ )
222
+ except docker.errors.APIError as error:
223
+ stderr_log = last_container.logs(stderr=True).decode('utf-8')
224
+ raise PropertyRequiredError(stderr_log)
225
+
226
+ return output_filepath
227
+
228
+
229
+ def __extract_tarball_chunks(tarball_chunks, report_absolute_filepath):
230
+ """
231
+
232
+ Args:
233
+ tarball_chunks (int): The number of bytes returned by each iteration of the generator
234
+ report_filename (string): The name of the extracted report
235
+
236
+ Returns:
237
+ string: Report absolute filepath in local filesystem
238
+ """
239
+ output_dirpath = report_absolute_filepath[
240
+ :report_absolute_filepath.rfind('/')
241
+ ]
242
+
243
+ with tempfile.TemporaryFile() as tmp_wrapper_file:
244
+ for chunk in tarball_chunks:
245
+ tmp_wrapper_file.write(chunk)
246
+ tmp_wrapper_file.seek(0)
247
+
248
+ with tarfile.open(mode="r|", fileobj=tmp_wrapper_file) as talball_file:
249
+ talball_file.extractall(path=output_dirpath)
250
+
251
+ return report_absolute_filepath
@@ -0,0 +1,78 @@
1
+ import os
2
+ import shutil
3
+ import tempfile
4
+ import docker
5
+
6
+ class Cleaner:
7
+ """Responsible for cleaning temporary files, Docker containers, images, and volumes."""
8
+
9
+ def __init__(self):
10
+ try:
11
+ self.client = docker.from_env()
12
+ except Exception as e:
13
+ print(f"Error initializing Docker client: {e}")
14
+ self.client = None
15
+
16
+ def cleanup(self):
17
+ """ Responsable to clean dirs, docker images and containers after all executions,
18
+ removes all stopped containers, unused networks, dangling images, and build cache.
19
+ """
20
+ try:
21
+ client = docker.from_env()
22
+ self.perform_cleanup()
23
+
24
+ for container in client.containers.list(all=True):
25
+ try:
26
+ container.remove()
27
+ except Exception:
28
+ continue
29
+
30
+ for image in client.images.list():
31
+ if image.tags and any(tag.startswith("public.ecr.aws/convisoappsec/") for tag in image.tags):
32
+ try:
33
+ client.images.remove(image.id)
34
+ except Exception as e:
35
+ print(f"Error removing image {image.tags}: {e}")
36
+ continue
37
+
38
+ volumes = client.volumes.list()
39
+ for volume in volumes:
40
+ try:
41
+ volume.remove()
42
+ except Exception:
43
+ continue
44
+
45
+ except Exception as e:
46
+ print(f"An unexpected error occurred: {e}")
47
+ return
48
+
49
+ def perform_cleanup(self):
50
+ """Method to clean the tmp directory and remove 'conviso-output-' directories in the current directory."""
51
+
52
+ tmp_dir = tempfile.gettempdir()
53
+
54
+ # Clear system temp directory
55
+ try:
56
+ for filename in os.listdir(tmp_dir):
57
+ file_path = os.path.join(tmp_dir, filename)
58
+ try:
59
+ if os.path.isfile(file_path) or os.path.islink(file_path):
60
+ os.remove(file_path)
61
+ elif os.path.isdir(file_path):
62
+ shutil.rmtree(file_path)
63
+ except Exception:
64
+ pass
65
+ except Exception:
66
+ pass
67
+
68
+ # Clear 'conviso-output-' directories in the current directory
69
+ try:
70
+ for filename in os.listdir("."):
71
+ dir_path = os.path.join(".", filename)
72
+ if os.path.isdir(dir_path) and filename.startswith("conviso-output-"):
73
+ try:
74
+ shutil.rmtree(dir_path)
75
+ except Exception:
76
+ pass
77
+ except Exception:
78
+ pass