jazzure 0.1.0__tar.gz

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.
@@ -0,0 +1,29 @@
1
+ Copyright (c) 2026 JAZZURE
2
+
3
+ Permission is hereby granted, free of charge, to any person or organization obtaining a copy of this software and associated documentation files (the "Software"), to use, copy, modify, merge, publish, and distribute the Software for personal, educational, research, internal business, and other non-commercial purposes, subject to the conditions set forth below.
4
+
5
+ Commercial exploitation of the Software is prohibited without the prior written permission of the copyright holder.
6
+
7
+ For the purposes of this License, "Commercial Exploitation" means:
8
+
9
+ * Selling, licensing, sublicensing, or renting the Software;
10
+ * Offering the Software as a paid product or service;
11
+ * Including the Software in a product, service, or platform for which customers are charged;
12
+ * Redistributing the Software as part of a commercial offering;
13
+ * Using the Software to provide a paid hosted service where the Software constitutes a substantial part of the value provided to customers.
14
+
15
+ The following activities do not constitute Commercial Exploitation and are therefore permitted:
16
+
17
+ * Personal use;
18
+ * Educational use;
19
+ * Academic and scientific research;
20
+ * Non-profit activities;
21
+ * Internal evaluation, testing, development, or operational use by commercial organizations;
22
+ * Modification of the Software for internal purposes;
23
+ * Open-source contributions related to the Software.
24
+
25
+ Redistributions of the Software must retain this copyright notice and license text.
26
+
27
+ Any rights not expressly granted by this License are reserved by the copyright holder.
28
+
29
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
jazzure-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,97 @@
1
+ Metadata-Version: 2.1
2
+ Name: jazzure
3
+ Version: 0.1.0
4
+ Summary: Perform Azure recon
5
+ Keywords: Azure,Microsoft,cloud,recon
6
+ Author-Email: pasdoue <pasdoue@protonmail.com>
7
+ Maintainer-Email: pasdoue <pasdoue@protonmail.com>
8
+ Project-URL: Documentation, https://github.com/pasdoue/Jazzure/blob/main/README.md
9
+ Project-URL: Repository, https://github.com/pasdoue/Jazzure
10
+ Project-URL: Issues, https://github.com/pasdoue/Jazzure/issues
11
+ Requires-Python: >=3.10
12
+ Requires-Dist: R2Log~=1.0.2
13
+ Requires-Dist: requests~=2.34.2
14
+ Requires-Dist: bs4~=0.0.2
15
+ Requires-Dist: jinja2~=3.1.6
16
+ Requires-Dist: strip_ansi~=0.1.1
17
+ Requires-Dist: docker>=7.2.0
18
+ Description-Content-Type: text/markdown
19
+
20
+ ## General
21
+
22
+ This tool is built to facilitate Azure/Entra environment discovery.
23
+ The philosophy of the tool is same as [Jawsome](https://github.com/pasdoue/Jawsome) (developped to brute force IAM permissions in AWS)
24
+ But due to complexity of Microsoft, this project is more complex to answer multiple problems and contains multiple submodules that works together.
25
+
26
+ ## Installation
27
+
28
+ ### Pypi
29
+
30
+ Perform git clone for now... I will release first package on Pypi when the tool will be "really" functional 😉
31
+
32
+ ```bash
33
+ pipx install jazzure
34
+ ```
35
+ Then just call : ```jazzure -h```
36
+
37
+ ### Local run
38
+
39
+ ```bash
40
+ git clone https://github.com/pasdoue/Jazzure.git
41
+ python jazzure.py -h
42
+ ```
43
+
44
+ ## Technical details
45
+
46
+ This tool is under heavy construction and documentation will follow.
47
+ Also as there are many things to handle, I decided to split documentation across modules/packages to avoid an unreadable README 🤪
48
+
49
+ ### Azure & Entra details
50
+
51
+ As there are several ways to connect to those environments, here is a "little" summarize :
52
+
53
+ | Method | Identity | User interaction | Used with |
54
+ | -------------------------------------------- | ---------------------------------- | -------------------------: | ------------------------------- |
55
+ | **Interactive / Browser** | User | Yes | `az`, PowerShell, Graph |
56
+ | **Device Code** | User | Using web browser first | `az`, Graph PowerShell, MSAL |
57
+ | **Authorization Code + PKCE** | User | Yes | Web/Desktop/SPA |
58
+ | **Access Token existant** | User or App | No | `curl`, REST, PowerShell |
59
+ | **Client Secret** | Application | No | `curl`, MSAL, scripts |
60
+ | **Certificate** | Application | No | PowerShell, MSAL, automation |
61
+ | **Managed Identity** | Azure Resource / Service Principal | No | VM, App Service, Function, etc. |
62
+ | **Workload Identity / Federated Credential** | Workload | No | CI/CD, Kubernetes, GitHub, etc. |
63
+ | **OBO** | User → Application → API | No after first login | APIs intermédiaires |
64
+
65
+
66
+ ### Jazzure details
67
+
68
+ #### Python Microsoft SDK
69
+
70
+ This way of handling Microsoft features like I did for Jawsome was aborted, but left dead code as a reminder
71
+ More details here : [Python SDK details](jazzure/python_sdk/README.md)
72
+
73
+ #### az CLI
74
+
75
+ As the SDK is not suitable for performing introspection, I turned to azure CLI parsing.
76
+ Actually script take between 40min to 1h to parse all azure CLI options to generate JSON to be faster next times.
77
+ More details here : [Azure CLI details](jazzure/az_cli/README.md)
78
+
79
+ #### Powershell handler
80
+
81
+ As a lot of commands & Entra connections are well handled in PowerShell and not in python SDK or even Azure CLI, it was necessary to support PowerShell ecosystem.
82
+ More details over here : [PowerShell details](jazzure/powershell/README.md)
83
+
84
+ ```bash
85
+ python jazzure.py docker --help
86
+ ```
87
+
88
+ #### IMDS / Managed Identity
89
+
90
+ This section is about when you're logged into a VM, so you can interrogate IMDS on `http://169.254.169.254/metadata`.
91
+ More details over here : [IMDS details](jazzure/imds/README.md)
92
+
93
+ ```bash
94
+ python jazzure.py imds --help
95
+ ```
96
+
97
+
@@ -0,0 +1,78 @@
1
+ ## General
2
+
3
+ This tool is built to facilitate Azure/Entra environment discovery.
4
+ The philosophy of the tool is same as [Jawsome](https://github.com/pasdoue/Jawsome) (developped to brute force IAM permissions in AWS)
5
+ But due to complexity of Microsoft, this project is more complex to answer multiple problems and contains multiple submodules that works together.
6
+
7
+ ## Installation
8
+
9
+ ### Pypi
10
+
11
+ Perform git clone for now... I will release first package on Pypi when the tool will be "really" functional 😉
12
+
13
+ ```bash
14
+ pipx install jazzure
15
+ ```
16
+ Then just call : ```jazzure -h```
17
+
18
+ ### Local run
19
+
20
+ ```bash
21
+ git clone https://github.com/pasdoue/Jazzure.git
22
+ python jazzure.py -h
23
+ ```
24
+
25
+ ## Technical details
26
+
27
+ This tool is under heavy construction and documentation will follow.
28
+ Also as there are many things to handle, I decided to split documentation across modules/packages to avoid an unreadable README 🤪
29
+
30
+ ### Azure & Entra details
31
+
32
+ As there are several ways to connect to those environments, here is a "little" summarize :
33
+
34
+ | Method | Identity | User interaction | Used with |
35
+ | -------------------------------------------- | ---------------------------------- | -------------------------: | ------------------------------- |
36
+ | **Interactive / Browser** | User | Yes | `az`, PowerShell, Graph |
37
+ | **Device Code** | User | Using web browser first | `az`, Graph PowerShell, MSAL |
38
+ | **Authorization Code + PKCE** | User | Yes | Web/Desktop/SPA |
39
+ | **Access Token existant** | User or App | No | `curl`, REST, PowerShell |
40
+ | **Client Secret** | Application | No | `curl`, MSAL, scripts |
41
+ | **Certificate** | Application | No | PowerShell, MSAL, automation |
42
+ | **Managed Identity** | Azure Resource / Service Principal | No | VM, App Service, Function, etc. |
43
+ | **Workload Identity / Federated Credential** | Workload | No | CI/CD, Kubernetes, GitHub, etc. |
44
+ | **OBO** | User → Application → API | No after first login | APIs intermédiaires |
45
+
46
+
47
+ ### Jazzure details
48
+
49
+ #### Python Microsoft SDK
50
+
51
+ This way of handling Microsoft features like I did for Jawsome was aborted, but left dead code as a reminder
52
+ More details here : [Python SDK details](jazzure/python_sdk/README.md)
53
+
54
+ #### az CLI
55
+
56
+ As the SDK is not suitable for performing introspection, I turned to azure CLI parsing.
57
+ Actually script take between 40min to 1h to parse all azure CLI options to generate JSON to be faster next times.
58
+ More details here : [Azure CLI details](jazzure/az_cli/README.md)
59
+
60
+ #### Powershell handler
61
+
62
+ As a lot of commands & Entra connections are well handled in PowerShell and not in python SDK or even Azure CLI, it was necessary to support PowerShell ecosystem.
63
+ More details over here : [PowerShell details](jazzure/powershell/README.md)
64
+
65
+ ```bash
66
+ python jazzure.py docker --help
67
+ ```
68
+
69
+ #### IMDS / Managed Identity
70
+
71
+ This section is about when you're logged into a VM, so you can interrogate IMDS on `http://169.254.169.254/metadata`.
72
+ More details over here : [IMDS details](jazzure/imds/README.md)
73
+
74
+ ```bash
75
+ python jazzure.py imds --help
76
+ ```
77
+
78
+
@@ -0,0 +1,3 @@
1
+ from jazzure.config.ToolConfig import __version__
2
+
3
+ __title__ = "jazzure"
@@ -0,0 +1,9 @@
1
+ try:
2
+ from jazzure.main import main
3
+ except ModuleNotFoundError as e:
4
+ print("Mandatory dependencies are missing:", e)
5
+ print("Please install them with pip3 install -r requirements.txt")
6
+ exit(1)
7
+
8
+ if __name__ == "__main__":
9
+ exit(main())
@@ -0,0 +1,20 @@
1
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
2
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
3
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
4
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
5
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
6
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
7
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
8
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
9
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
10
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
11
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
12
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
13
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
14
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
15
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
16
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
17
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
18
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
19
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
20
+ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
@@ -0,0 +1,55 @@
1
+ # General information
2
+
3
+ As python SDK is not suitable for Azure environment actions discovery, I decided to parse Azure CLI which is quite well when using CLI (but can trigger headache to parse it 😅)
4
+ The idea is to map every service and functions/actions we can interrogate to perform some upper discovery logic.
5
+
6
+ # Technical information
7
+
8
+ ## AZ CLI versions
9
+
10
+ There are several version of this tool and some older ones can reveal more information.
11
+ So there is a function `azcli.AzCLI.retrieve_online_versions()` that can list every documented versions.
12
+ This is not used yet in the tool but in the future I will try to handle them.
13
+
14
+ ## AZ CLI crawler
15
+
16
+ The recon of all `az` has been done in version `2.90.0`.
17
+ The class `azcli.AzureCliCrawler` handles the parsing of `az`. It's quite long as we need to parse recursively all CLI possibilities with the `--help` arg.
18
+ The function `crawl()` is the main entrance of parsing and added some asyncio strategy to avoid long time running, even though it takes about 40min to complete 😅
19
+ A file in JSON format is created and contains every mapping of `az` commands with all information (see bellow a little extract):
20
+ ```json
21
+ { "command": "az rest",
22
+ "subgroups": [],
23
+ "commands": [],
24
+ "arguments": [
25
+ {
26
+ "name": "--uri",
27
+ "aliases": [
28
+ "--url",
29
+ "-u"
30
+ ],
31
+ "required": true,
32
+ "special_mode": "",
33
+ "description": "Request URL. If it doesn't start with a host, CLI assumes it as an Azure resource ID and prefixes it with the ARM endpoint of the current cloud shown by `az cloud show --query endpoints.resourceManager`. Common token {subscriptionId} will be replaced with the current subscription ID specified by `az account set`."
34
+ },
35
+ {
36
+ "name": "--body",
37
+ "aliases": [
38
+ "-b"
39
+ ],
40
+ "required": false,
41
+ "special_mode": "",
42
+ "description": "Request body. Use @{file} to load from a file. For quoting issues in different terminals, see https://github.com/Azure/azure- cli/blob/dev/doc/use_cli_effectively.md#quoting-issues."
43
+ }
44
+ ]
45
+ }
46
+ ```
47
+
48
+ Technical bonus detail :
49
+ - While parsing the output I discovered that ANSI chars were dropped randomly in some help and caused my parsing to fails for no reason...
50
+ - As it was quite painful some unit tests have been written to ensure good parsing of `az` inside `tests/test_AZCLI.py`
51
+
52
+
53
+
54
+
55
+
File without changes