Initial migration

This commit is contained in:
pro100ton 2024-11-02 14:14:15 +03:00
commit cd90541216
106 changed files with 10734 additions and 0 deletions

123
.$widgets.drawio.bkp Normal file
View file

@ -0,0 +1,123 @@
<mxfile host="Electron" modified="2023-09-13T13:16:41.941Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.3.7 Chrome/112.0.5615.204 Electron/24.5.0 Safari/537.36" etag="mMS8CNU2sA1TkMmEDIx_" version="21.3.7" type="device">
<diagram name="Page-1" id="Mm0AFe9iNYLrZx-vRE2-">
<mxGraphModel dx="3774" dy="1195" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="3bcufTPEJ_fhAhOzumaG-1" value="User 1" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;" vertex="1" parent="1">
<mxGeometry x="190" y="340" width="30" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-2" value="User 2" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;" vertex="1" parent="1">
<mxGeometry x="190" y="870" width="30" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-18" value="ID: 0&lt;br&gt;FW_manufacturer: CheckPoint" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1">
<mxGeometry x="-275" y="210" width="220" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-19" value="ID: 1&lt;br&gt;FW_manufacturer: UserGate" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1">
<mxGeometry x="-15" y="210" width="220" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-20" value="ID: 2&lt;br&gt;FW_manufacturer: NDR" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1">
<mxGeometry x="245" y="210" width="220" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-24" value="User_1:::dashboard_1" style="swimlane;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-300" y="440" width="500" height="360" as="geometry">
<mxRectangle x="-280" y="440" width="170" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-26" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;fillColor=#D5E8D4;strokeColor=#82b366;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-24">
<mxGeometry x="20" y="40" width="210" height="280" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-27" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;x&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;y&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;params&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;0&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;group_1&quot;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Outside TN layer&quot;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-26">
<mxGeometry x="20" y="5" width="190" height="270" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-28" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-24">
<mxGeometry x="260" y="40" width="210" height="285" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-29" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;x&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;y&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;params&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;0&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;group_2&quot;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Outside TN layer&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &quot;Inside TN layer&quot;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-28">
<mxGeometry x="20" y="-5" width="190" height="290" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-30" value="User_1:::dashboard_2" style="swimlane;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="220" y="440" width="500" height="360" as="geometry">
<mxRectangle x="-280" y="440" width="170" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-31" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-30">
<mxGeometry x="20" y="40" width="210" height="280" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-32" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;x&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;y&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;params&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;1&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: null&lt;span style=&quot;background-color: initial;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: null&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-31">
<mxGeometry x="20" y="35" width="190" height="210" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-33" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-30">
<mxGeometry x="260" y="40" width="210" height="285" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-34" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;x&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;y&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;params&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;2&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: null&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: null&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-33">
<mxGeometry x="20" y="35" width="190" height="210" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-35" value="User_2:::dashboard_1" style="swimlane;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-300" y="970" width="500" height="360" as="geometry">
<mxRectangle x="-280" y="440" width="170" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-36" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;fillColor=#D5E8D4;strokeColor=#82b366;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-35">
<mxGeometry x="20" y="40" width="210" height="280" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-37" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;x&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;y&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;params&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;0&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;group_1&quot;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Outside TN layer&quot;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-36">
<mxGeometry x="20" y="5" width="190" height="270" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-38" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-35">
<mxGeometry x="260" y="40" width="210" height="285" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-39" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;x&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;y&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;params&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;0&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;group_3&quot;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Some layer&lt;span style=&quot;background-color: initial;&quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-38">
<mxGeometry x="20" y="5" width="190" height="270" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-40" value="User_2:::dashboard_2" style="swimlane;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="220" y="970" width="500" height="360" as="geometry">
<mxRectangle x="-280" y="440" width="170" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-41" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-40">
<mxGeometry x="20" y="40" width="210" height="280" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-42" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;x&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;y&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;params&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;2&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: null&lt;span style=&quot;background-color: initial;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: null&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-41">
<mxGeometry x="20" y="35" width="190" height="210" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-47" value="DashboardConsumer" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-910" y="780" width="160" height="138" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-48" value="+ field: type" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-47">
<mxGeometry y="26" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-49" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-47">
<mxGeometry y="52" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-50" value="+ def connect(self)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-47">
<mxGeometry y="60" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-51" value="+ def disconnect(self)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-47">
<mxGeometry y="86" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-52" value="+ def receive(self)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-47">
<mxGeometry y="112" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-56" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="3bcufTPEJ_fhAhOzumaG-53" target="3bcufTPEJ_fhAhOzumaG-54">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="3bcufTPEJ_fhAhOzumaG-53" target="3bcufTPEJ_fhAhOzumaG-55">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-53" value="&lt;h1&gt;Кэширование сводки по политикам&lt;/h1&gt;&lt;p&gt;Необходимо кэшировать данные по каждому подкюченному NGFW в &quot;Купол.Управление&quot; относитнльно сводки по политикам&lt;/p&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-1570" y="320" width="470" height="120" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-54" value="Таска, которая раз в &lt;b&gt;n&lt;/b&gt;&amp;nbsp;минут запрашивает актуальные данные со всех NGFW" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-1570" y="480" width="210" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-55" value="При изменении настроек какого-либо NGFW -&amp;gt; перезапрос данных по политикам относительно этого NGFW" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-1310" y="480" width="210" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-58" value="&lt;h1&gt;Сводка по политикам CheckPoint&lt;/h1&gt;&lt;p&gt;Бэкэнд будет отдавать данные по виджету чекпоинта &lt;b&gt;всю&lt;/b&gt;&amp;nbsp;сводку по политикам. Фильтрация по группам и ролям должна осуществляться на стороне фронта&lt;/p&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-1040" y="320" width="470" height="120" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

180
.$widgets.drawio.dtmp Normal file
View file

@ -0,0 +1,180 @@
<mxfile host="Electron" modified="2023-09-13T13:39:20.713Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.3.7 Chrome/112.0.5615.204 Electron/24.5.0 Safari/537.36" etag="u0lWEkRQNRgcgqsfJRyo" version="21.3.7" type="device">
<diagram name="Page-1" id="Mm0AFe9iNYLrZx-vRE2-">
<mxGraphModel dx="2391" dy="398" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="3bcufTPEJ_fhAhOzumaG-1" value="User 1" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;" vertex="1" parent="1">
<mxGeometry x="190" y="340" width="30" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-2" value="User 2" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;" vertex="1" parent="1">
<mxGeometry x="190" y="870" width="30" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-18" value="ID: 0&lt;br&gt;FW_manufacturer: CheckPoint" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1">
<mxGeometry x="-275" y="210" width="220" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-19" value="ID: 1&lt;br&gt;FW_manufacturer: UserGate" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1">
<mxGeometry x="-15" y="210" width="220" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-20" value="ID: 2&lt;br&gt;FW_manufacturer: NDR" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1">
<mxGeometry x="245" y="210" width="220" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-24" value="User_1:::dashboard_1" style="swimlane;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-390" y="440" width="550" height="360" as="geometry">
<mxRectangle x="-280" y="440" width="170" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-26" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;fillColor=#D5E8D4;strokeColor=#82b366;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-24">
<mxGeometry x="20" y="40" width="210" height="285" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-27" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;x&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;y&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;0&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;group_1&quot;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Outside TN layer&quot;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;}&lt;/div&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-26">
<mxGeometry x="30" y="20" width="170" height="240" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-28" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-24">
<mxGeometry x="260" y="40" width="270" height="285" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-29" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;x&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;y&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;0&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: [&quot;group_1&quot;],&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: [&quot;Outside TN layer&quot;]&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;}&lt;/div&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-28">
<mxGeometry x="25" y="20" width="240" height="190" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-30" value="User_1:::dashboard_2" style="swimlane;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="220" y="440" width="500" height="360" as="geometry">
<mxRectangle x="-280" y="440" width="170" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-31" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-30">
<mxGeometry x="20" y="40" width="210" height="280" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-32" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;x&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;y&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;1&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: null,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: null&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;}&lt;/div&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-31">
<mxGeometry x="30" y="45" width="170" height="190" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-33" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-30">
<mxGeometry x="260" y="40" width="210" height="285" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-34" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;x&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;y&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;params&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;2&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: null&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: null&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-33">
<mxGeometry x="20" y="35" width="190" height="210" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-35" value="User_2:::dashboard_1" style="swimlane;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-300" y="970" width="500" height="360" as="geometry">
<mxRectangle x="-280" y="440" width="170" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-36" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;fillColor=#D5E8D4;strokeColor=#82b366;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-35">
<mxGeometry x="20" y="40" width="210" height="280" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-37" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;x&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;y&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;0&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;group_1&quot;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Outside TN layer&quot;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;}&lt;/div&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-36">
<mxGeometry x="30" y="20" width="170" height="240" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-38" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-35">
<mxGeometry x="260" y="40" width="210" height="285" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-39" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;x&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;y&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;0&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;group_3&quot;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: [&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Some layer&quot;&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;}&lt;/div&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-38">
<mxGeometry x="30" y="20" width="170" height="240" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-40" value="User_2:::dashboard_2" style="swimlane;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="220" y="970" width="500" height="360" as="geometry">
<mxRectangle x="-280" y="440" width="170" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-41" value="Horizontal Container" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-40">
<mxGeometry x="20" y="40" width="210" height="280" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-42" value="&lt;div style=&quot;border-color: var(--border-color); text-align: left;&quot;&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;x&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;y&quot;: 0,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;w&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;h&quot;: 2,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;name&quot;: &quot;anomaly-view&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;config&quot;: {&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;firewall&quot;: &quot;2&quot;,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_groups&quot;: null,&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;policy_layers&quot;: null&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style=&quot;border-color: var(--border-color);&quot;&gt;}&lt;/div&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-41">
<mxGeometry x="30" y="45" width="170" height="190" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-47" value="DashboardConsumer" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-1440" y="740" width="160" height="138" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-48" value="+ field: type" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-47">
<mxGeometry y="26" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-49" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-47">
<mxGeometry y="52" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-50" value="+ def connect(self)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-47">
<mxGeometry y="60" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-51" value="+ def disconnect(self)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-47">
<mxGeometry y="86" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-52" value="+ def receive(self)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="3bcufTPEJ_fhAhOzumaG-47">
<mxGeometry y="112" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-56" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="3bcufTPEJ_fhAhOzumaG-53" target="3bcufTPEJ_fhAhOzumaG-54">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="3bcufTPEJ_fhAhOzumaG-53" target="3bcufTPEJ_fhAhOzumaG-55">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-53" value="&lt;h1&gt;Кэширование сводки по политикам&lt;/h1&gt;&lt;p&gt;Необходимо кэшировать данные по каждому подкюченному NGFW в &quot;Купол.Управление&quot; относитнльно сводки по политикам&lt;/p&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-1570" y="320" width="470" height="120" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-54" value="Таска, которая раз в &lt;b&gt;n&lt;/b&gt;&amp;nbsp;минут запрашивает актуальные данные со всех NGFW" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-1570" y="480" width="210" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-55" value="При изменении настроек какого-либо NGFW -&amp;gt; перезапрос данных по политикам относительно этого NGFW" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-1310" y="480" width="210" height="60" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-58" value="&lt;h1&gt;Сводка по политикам CheckPoint&lt;/h1&gt;&lt;p&gt;Бэкэнд будет отдавать данные по виджету чекпоинта &lt;b&gt;всю&lt;/b&gt;&amp;nbsp;сводку по политикам. Фильтрация по группам и ролям должна осуществляться на стороне фронта&lt;/p&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-1040" y="320" width="470" height="120" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-60" value="Frontend" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-1320" y="980" width="80" height="30" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-61" value="" style="endArrow=none;dashed=1;html=1;rounded=0;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-1280" y="1300" as="sourcePoint" />
<mxPoint x="-1280" y="1010" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-62" value="Dashboard Consumer" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-1080" y="980" width="80" height="30" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-63" value="" style="endArrow=none;dashed=1;html=1;rounded=0;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-1040.1699999999998" y="1300" as="sourcePoint" />
<mxPoint x="-1040.1699999999998" y="1010" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-64" value="DB" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-840" y="980" width="80" height="30" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-65" value="" style="endArrow=none;dashed=1;html=1;rounded=0;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-800.1700000000001" y="1300" as="sourcePoint" />
<mxPoint x="-800.1700000000001" y="1010" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-69" value="" style="html=1;points=[];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;edgeStyle&quot;:&quot;elbowEdgeStyle&quot;,&quot;elbow&quot;:&quot;vertical&quot;,&quot;curved&quot;:0,&quot;rounded&quot;:0};" vertex="1" parent="1">
<mxGeometry x="-1045" y="1100" width="10" height="80" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-70" value="Подключение к консюмеру дашборда &lt;b&gt;x&lt;/b&gt;" style="html=1;verticalAlign=bottom;endArrow=block;edgeStyle=elbowEdgeStyle;elbow=vertical;curved=0;rounded=0;" edge="1" parent="1" target="3bcufTPEJ_fhAhOzumaG-69">
<mxGeometry width="80" relative="1" as="geometry">
<mxPoint x="-1280" y="1100" as="sourcePoint" />
<mxPoint x="-1120" y="1180" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-71" value="" style="html=1;points=[];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;edgeStyle&quot;:&quot;elbowEdgeStyle&quot;,&quot;elbow&quot;:&quot;vertical&quot;,&quot;curved&quot;:0,&quot;rounded&quot;:0};" vertex="1" parent="1">
<mxGeometry x="-1285" y="1020" width="10" height="300" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-72" value="Открытие дашборда &lt;b&gt;x&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-1370" y="1045" width="85" height="30" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-73" value="" style="html=1;points=[];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;edgeStyle&quot;:&quot;elbowEdgeStyle&quot;,&quot;elbow&quot;:&quot;vertical&quot;,&quot;curved&quot;:0,&quot;rounded&quot;:0};" vertex="1" parent="1">
<mxGeometry x="-805" y="1120" width="10" height="40" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-74" value="Получение списка видждетов на дашборде" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-795" y="1125" width="155" height="30" as="geometry" />
</mxCell>
<mxCell id="3bcufTPEJ_fhAhOzumaG-75" value="Запрос списка всех виджетов&amp;nbsp;" style="html=1;verticalAlign=bottom;endArrow=block;edgeStyle=elbowEdgeStyle;elbow=vertical;curved=0;rounded=0;" edge="1" parent="1" source="3bcufTPEJ_fhAhOzumaG-69" target="3bcufTPEJ_fhAhOzumaG-73">
<mxGeometry width="80" relative="1" as="geometry">
<mxPoint x="-1025" y="1120" as="sourcePoint" />
<mxPoint x="-800" y="1179.83" as="targetPoint" />
<Array as="points">
<mxPoint x="-1010" y="1120" />
</Array>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

1
.env Normal file
View file

@ -0,0 +1 @@
DOCKER_POSTGRES_PASS = "qwertY123"

1
.env.template Normal file
View file

@ -0,0 +1 @@
DOCKER_POSTGRES_PASS = "docker_postgres_password"

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
*.pyc

27
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,27 @@
{
"workbench.colorTheme": "Box UK Contrast (rainglow)",
"cSpell.words": [
"descr",
"dotenv",
"spoofmac",
"sqlalchemy"
],
"cSpell.language": "en,ru",
"sqltools.connections": [
{
"previewLimit": 50,
"server": "localhost",
"port": 5432,
"driver": "PostgreSQL",
"name": "docker_training_bd",
"database": "postgres",
"username": "postgres",
"password": "qwertY123"
}
],
"[python]": {
"editor.defaultFormatter": "ms-python.autopep8"
},
"vim.smartRelativeLine": true,
"python.formatting.provider": "none",
}

2
README.md Normal file
View file

@ -0,0 +1,2 @@
# T0xa's sandox files
Файлы в данном репо используются @ashalimov для хранения тестовых кодовых сниппетов

9
array_shifter.py Normal file
View file

@ -0,0 +1,9 @@
def priorities_shifter(element_to_move, index_to_place, initial_array):
initial_array.remove(element_to_move)
initial_array.insert(index_to_place, element_to_move) # Insert the element at the desired index
return initial_array
if __name__ == "__main__":
initial_array = [0,1,2,3,4,5,6,7]
print(priorities_shifter(5, 1, initial_array))

31
asa/cisco_connecter.py Normal file
View file

@ -0,0 +1,31 @@
import logging
from netmiko.cisco import CiscoAsaSSH
logging.basicConfig(filename="test.log", level=logging.DEBUG)
logger = logging.getLogger("netmiko")
class AsaConnector:
def _session_creator(self) -> CiscoAsaSSH:
cisco_asa = {
"device_type": "cisco_asa",
"host": "172.31.142.14",
"username": "user",
"password": "T1Rules@123",
"port": 22,
}
session = CiscoAsaSSH(**cisco_asa)
session.asa_login()
return session
def session_login(self):
asa_session = self._session_creator()
asa_session.asa_login()
version = asa_session.send_command("show version")
print(version)
return version
connector = AsaConnector().session_login()

View file

@ -0,0 +1,9 @@
Start
^access\-list\s+cached\s+ACL* -> NoRecord
^\s+alert\-interval* -> NoRecord
^\s+access\-list\s* -> NoRecord
^access-list\s+${ACL_NAME}\s+line\s+${LINE_NUM}\s+remark\s+${REMARK}\s*$$ -> Record
^access\-list\s+${ACL_NAME};\s+${ACL_TOT_ELEM}\s+elements;\s+name\s+hash:\s+${ACL_NAME_HASH}\s* -> Record
^access\-list\s+${ACL_NAME}\s+line\s+${LINE_NUM}\s+${TYPE}\s+${ACTION}\s+(${PROTOCOL}|object\s+${SVC_OBJECT}|object\-group\s+${SVC_OBJECT_GRP}+)\s+(user\s+${USER}\s+|object\-group\-user\s+${USER_GROUP}\s+){0,1}(object\-group\-security\s+${SRC_SECURITY_GROUP_NAME}\s+){0,1}(${SRC_V6HOST}|${SRC_V6NETWORK}\/${SRC_V6MASK}|interface\s+${SRC_INTFC}|object\-group\s+${SRC_OBJECT_GRP}|object\s+${SRC_OBJECT}|host\s+${SRC_HOST}|${SRC_NETWORK}\s+${SRC_MASK}|${SRC_ANY})\s+((eq\s+${SRC_PORT}|lt\s+${SRC_PORT_LESS_THAN}|gt\s+${SRC_PORT_GREATER_THAN}|range\s+${SRC_PORT_RANGE_START}\s+${SRC_PORT_RANGE_END}|object\-group\s+${SRC_PORT_GRP}|object\s+${SRC_PORT_OBJECT})\s+){0,1}(object\-group\-security\s+${DST_SECURITY_GROUP}\s+){0,1}(interface\s+${DST_INTFC}|object\-group\s+${DST_OBJECT_GRP}|object\s+${DST_OBJECT}|host\s+${DST_HOST}|${DST_V6HOST}|${DST_V6NETWORK}\/${DST_V6MASK}|${DST_NETWORK}\s+${DST_MASK}|${DST_ANY})\s+((eq\s+${DST_PORT}|lt\s+${DST_PORT_LESS_THAN}|gt\s+${DST_PORT_GREATER_THAN}|range\s+${DST_PORT_RANGE_START}\s+${DST_PORT_RANGE_END}|object\-group\s+${DST_PORT_GRP}|object\s+${DST_PORT_OBJECT})\s+){0,1}(${ICMP_KEY_VALUE}(\s+${ICMP_VALUE})?\s+){0,1}((log\s+(${LOG_LEVEL}\s+interval\s+${LOG_INTERVAL}|disable|default))\s+){0,1}(time\-range\s+${TIME_RANGE}\s+){0,1}(${ACE_STATE}\s+){0,1}\(hitcnt=${HIT_COUNT}\)\s+(\(inactive\)\s+){0,1}${LINE_HASH}\s* -> Continue
^${RAW_LINE} -> Record
^.* -> Error "Did not match any rules"

View file

@ -0,0 +1,74 @@
Value ACL_NAME (\S+)
Value ACL_TOT_ELEM (\d+)
Value ACL_NAME_HASH (0x\w+)
Value USER (\S+)
Value REMARK (.+?)
Value USER_GROUP (\S+)
Value SRC_SERVICE (\S+)
Value TYPE (standard|extended)
Value LINE_NUM (\d+)
Value ACTION (permit|deny)
Value PROTOCOL ([a-z0-9]+)
Value SOURCE (\S+)
Value ACE_STATE (inactive)
Value SVC_OBJECT_GRP (\S+)
Value SVC_OBJECT (\S+)
Value SRC_INTFC (\S+)
Value SRC_OBJECT_GRP (\S+)
Value SECURITY_GROUP (\S+)
Value SRC_OBJECT (\S+)
Value SRC_HOST (\d+\.\d+\.\d+\.\d+)
Value SRC_V6HOST ([0-9a-f:]+)
Value SRC_NETWORK (\d+\.\d+\.\d+\.\d+)
Value SRC_V6NETWORK ([0-9a-f:]+)
Value SRC_MASK (\d+\.\d+\.\d+\.\d+)
Value SRC_V6MASK (\d{1,3})
Value SRC_ANY (any[46]{0,1})
Value DST_INTFC (\S+)
Value DST_OBJECT_GRP (\S+)
Value DST_OBJECT (\S+)
Value DST_HOST (\d+\.\d+\.\d+\.\d+)
Value DST_V6HOST ([0-9a-f:]+)
Value DST_NETWORK (\d+\.\d+\.\d+\.\d+)
Value DST_V6NETWORK ([0-9a-f:]+)
Value DST_MASK (\d+\.\d+\.\d+\.\d+)
Value DST_V6MASK (\d{1,3})
Value DST_ANY (any[46]{0,1})
Value DST_PORT (\S+)
Value DST_PORT_LESS_THAN (\S+)
Value DST_PORT_GREATER_THAN (\S+)
Value DST_PORT_RANGE_START (\S+)
Value DST_PORT_RANGE_END (\S+)
Value DST_PORT_GRP ($services_groups)
Value DST_PORT_OBJECT (\S+)
Value DST_ICMP_TYPE ((?!log|time|inactive)\S+)
Value SRC_SECURITY_GROUP (\S+)
Value SRC_SECURITY_GROUP_NAME (\S+)
Value DST_SECURITY_GROUP_NAME (\S+)
Value DST_SECURITY_GROUP (\S+)
Value SRC_SECURITY_GROUP_TAG (\S+)
Value DST_SECURITY_GROUP_TAG (\S+)
Value HIT_COUNT (\d+)
Value LINE_HASH (0x\w+)
Value DST_SERVICE (\S+)
Value LOG_LEVEL ([a-z0-9]+)
Value LOG_INTERVAL (\d+)
Value TIME_RANGE (\S+)
Value ENTRY_PORT ([a-z\-]+\s+\d+|[\w\-]+)
Value ENTRY_PORT_LESS_THAN ([a-z\-]+\s+\d+|\w+)
Value ENTRY_PORT_GREATER_THAN ([a-z\-]+\s+\d+|\w+)
Value ENTRY_PORT_RANGE_START ([a-z\-]+\s+\d+|\w+)
Value ENTRY_PORT_RANGE_END ([a-z\-]+\s+\d+|\w+)
Value ICMP_KEY_VALUE (alternate-address|conversion-error|echo|echo-reply|information-reply|information-request|mask-reply|mask-request|mobile-redirect|parameter-problem|redirect|router-advertisement|router-solicitation|source-quench|time-exceeded|timestamp-reply|timestamp-request|traceroute|unreachable|\d{1,3})
Value ICMP_VALUE (\d+)
Value SRC_SERVICE_OBJECT_GROUP (\S+)
Value SRC_PORT (\S+)
Value SRC_PORT_LESS_THAN (\S+)
Value SRC_PORT_GREATER_THAN (\S+)
Value SRC_PORT_RANGE_START (\S+)
Value SRC_PORT_RANGE_END (\S+)
Value SRC_PORT_GRP (\S+)
Value SRC_PORT_OBJECT (\S+)
Value RAW_LINE (.*)

View file

@ -0,0 +1,83 @@
Value ACL_NAME (\S+)
Value ACL_TOT_ELEM (\d+)
Value ACL_NAME_HASH (0x\w+)
Value USER (\S+)
Value REMARK (.+?)
Value USER_GROUP (\S+)
Value SRC_SERVICE (\S+)
Value TYPE (standard|extended)
Value LINE_NUM (\d+)
Value ACTION (permit|deny)
Value PROTOCOL ([a-z0-9]+)
Value SOURCE (\S+)
Value ACE_STATE (inactive)
Value SVC_OBJECT_GRP (\S+)
Value SVC_OBJECT (\S+)
Value SRC_INTFC (\S+)
Value SRC_OBJECT_GRP (\S+)
Value SECURITY_GROUP (\S+)
Value SRC_OBJECT (\S+)
Value SRC_HOST (\d+\.\d+\.\d+\.\d+)
Value SRC_V6HOST ([0-9a-f:]+)
Value SRC_NETWORK (\d+\.\d+\.\d+\.\d+)
Value SRC_V6NETWORK ([0-9a-f:]+)
Value SRC_MASK (\d+\.\d+\.\d+\.\d+)
Value SRC_V6MASK (\d{1,3})
Value SRC_ANY (any[46]{0,1})
Value DST_INTFC (\S+)
Value DST_OBJECT_GRP (\S+)
Value DST_OBJECT (\S+)
Value DST_HOST (\d+\.\d+\.\d+\.\d+)
Value DST_V6HOST ([0-9a-f:]+)
Value DST_NETWORK (\d+\.\d+\.\d+\.\d+)
Value DST_V6NETWORK ([0-9a-f:]+)
Value DST_MASK (\d+\.\d+\.\d+\.\d+)
Value DST_V6MASK (\d{1,3})
Value DST_ANY (any[46]{0,1})
Value DST_PORT (\S+)
Value DST_PORT_LESS_THAN (\S+)
Value DST_PORT_GREATER_THAN (\S+)
Value DST_PORT_RANGE_START (\S+)
Value DST_PORT_RANGE_END (\S+)
Value DST_PORT_GRP (1|2|3|4|5|5|5)
Value DST_PORT_OBJECT (\S+)
Value DST_ICMP_TYPE ((?!log|time|inactive)\S+)
Value SRC_SECURITY_GROUP (\S+)
Value SRC_SECURITY_GROUP_NAME (\S+)
Value DST_SECURITY_GROUP_NAME (\S+)
Value DST_SECURITY_GROUP (\S+)
Value SRC_SECURITY_GROUP_TAG (\S+)
Value DST_SECURITY_GROUP_TAG (\S+)
Value HIT_COUNT (\d+)
Value LINE_HASH (0x\w+)
Value DST_SERVICE (\S+)
Value LOG_LEVEL ([a-z0-9]+)
Value LOG_INTERVAL (\d+)
Value TIME_RANGE (\S+)
Value ENTRY_PORT ([a-z\-]+\s+\d+|[\w\-]+)
Value ENTRY_PORT_LESS_THAN ([a-z\-]+\s+\d+|\w+)
Value ENTRY_PORT_GREATER_THAN ([a-z\-]+\s+\d+|\w+)
Value ENTRY_PORT_RANGE_START ([a-z\-]+\s+\d+|\w+)
Value ENTRY_PORT_RANGE_END ([a-z\-]+\s+\d+|\w+)
Value ICMP_KEY_VALUE (alternate-address|conversion-error|echo|echo-reply|information-reply|information-request|mask-reply|mask-request|mobile-redirect|parameter-problem|redirect|router-advertisement|router-solicitation|source-quench|time-exceeded|timestamp-reply|timestamp-request|traceroute|unreachable|\d{1,3})
Value ICMP_VALUE (\d+)
Value SRC_SERVICE_OBJECT_GROUP (\S+)
Value SRC_PORT (\S+)
Value SRC_PORT_LESS_THAN (\S+)
Value SRC_PORT_GREATER_THAN (\S+)
Value SRC_PORT_RANGE_START (\S+)
Value SRC_PORT_RANGE_END (\S+)
Value SRC_PORT_GRP (\S+)
Value SRC_PORT_OBJECT (\S+)
Value RAW_LINE (.*)
Start
^access\-list\s+cached\s+ACL* -> NoRecord
^\s+alert\-interval* -> NoRecord
^\s+access\-list\s* -> NoRecord
^access-list\s+${ACL_NAME}\s+line\s+${LINE_NUM}\s+remark\s+${REMARK}\s*$$ -> Record
^access\-list\s+${ACL_NAME};\s+${ACL_TOT_ELEM}\s+elements;\s+name\s+hash:\s+${ACL_NAME_HASH}\s* -> Record
^access\-list\s+${ACL_NAME}\s+line\s+${LINE_NUM}\s+${TYPE}\s+${ACTION}\s+(${PROTOCOL}|object\s+${SVC_OBJECT}|object\-group\s+${SVC_OBJECT_GRP}+)\s+(user\s+${USER}\s+|object\-group\-user\s+${USER_GROUP}\s+){0,1}(object\-group\-security\s+${SRC_SECURITY_GROUP_NAME}\s+){0,1}(${SRC_V6HOST}|${SRC_V6NETWORK}\/${SRC_V6MASK}|interface\s+${SRC_INTFC}|object\-group\s+${SRC_OBJECT_GRP}|object\s+${SRC_OBJECT}|host\s+${SRC_HOST}|${SRC_NETWORK}\s+${SRC_MASK}|${SRC_ANY})\s+((eq\s+${SRC_PORT}|lt\s+${SRC_PORT_LESS_THAN}|gt\s+${SRC_PORT_GREATER_THAN}|range\s+${SRC_PORT_RANGE_START}\s+${SRC_PORT_RANGE_END}|object\-group\s+${SRC_PORT_GRP}|object\s+${SRC_PORT_OBJECT})\s+){0,1}(object\-group\-security\s+${DST_SECURITY_GROUP}\s+){0,1}(interface\s+${DST_INTFC}|object\-group\s+${DST_OBJECT_GRP}|object\s+${DST_OBJECT}|host\s+${DST_HOST}|${DST_V6HOST}|${DST_V6NETWORK}\/${DST_V6MASK}|${DST_NETWORK}\s+${DST_MASK}|${DST_ANY})\s+((eq\s+${DST_PORT}|lt\s+${DST_PORT_LESS_THAN}|gt\s+${DST_PORT_GREATER_THAN}|range\s+${DST_PORT_RANGE_START}\s+${DST_PORT_RANGE_END}|object\-group\s+${DST_PORT_GRP}|object\s+${DST_PORT_OBJECT})\s+){0,1}(${ICMP_KEY_VALUE}(\s+${ICMP_VALUE})?\s+){0,1}((log\s+(${LOG_LEVEL}\s+interval\s+${LOG_INTERVAL}|disable|default))\s+){0,1}(time\-range\s+${TIME_RANGE}\s+){0,1}(${ACE_STATE}\s+){0,1}\(hitcnt=${HIT_COUNT}\)\s+(\(inactive\)\s+){0,1}${LINE_HASH}\s* -> Continue
^${RAW_LINE} -> Record
^.* -> Error "Did not match any rules"

View file

@ -0,0 +1,23 @@
from string import Template
# Read the content of files
with open("access-list-values.txt", "r") as f:
access_list_values_template = Template(f.read())
with open("access-list-parsers.txt", "r") as f:
parsers = f.read()
# Substitute values into the template
d = {
"services_groups": "1|2|3|4|5|5|5"
"services_objects": "1|2|3|4",
}
access_list_values = access_list_values_template.substitute(d)
# Write to the output file
with open("access-list.txt", "w") as f:
f.write(access_list_values)
f.write(parsers)
print(access_list_values)
print(parsers)

View file

@ -0,0 +1,36 @@
{
"interface": "str",
"type": "str",
"action": "str",
"enabled": "bool",
"description": [
"str"
],
"source": {
"type": "str",
"value": {
"ip_version": "str",
"address": "str",
"name": "str",
"group": "str",
"interface": "str"
}
},
"destination": {
"type": "str",
"value": {
"ip_version": "str",
"address": "str",
"name": "str",
"group": "str",
"interface": "str"
},
},
"source_service": "",
"destination_service": "",
"logging": {
"enabled": "bool",
"level": "int",
"interval": "int"
}
}

69
asa/policies_parser.tfsm Normal file
View file

@ -0,0 +1,69 @@
Value Required ACL_NAME (\S+)
Value ACL_TOT_ELEM (\d+)
Value ACL_NAME_HASH (0x\w+)
Value USER (\S+)
Value REMARK (.+?)
Value USER_GROUP (\S+)
Value SRC_SERVICE (\S+)
Value TYPE (standard|extended)
Value LINE_NUM (\d+)
Value ACTION (permit|deny)
Value PROTOCOL ([a-z0-9]+)
Value SOURCE (\S+)
Value ACE_STATE (inactive)
Value SVC_OBJECT_GRP (\S+)
Value SVC_OBJECT (\S+)
Value SRC_INTFC (\S+)
Value SRC_OBJECT_GRP (\S+)
Value SRC_OBJECT (\S+)
Value SRC_HOST (\d+\.\d+\.\d+\.\d+)
Value SRC_V6HOST ([0-9a-f:]+)
Value SRC_NETWORK (\d+\.\d+\.\d+\.\d+)
Value SRC_V6NETWORK ([0-9a-f:]+)
Value SRC_MASK (\d+\.\d+\.\d+\.\d+)
Value SRC_V6MASK (\d{1,3})
Value SRC_ANY (any[46]{0,1})
Value DST_INTFC (\S+)
Value DST_OBJECT_GRP (\S+)
Value DST_OBJECT (\S+)
Value DST_HOST (\d+\.\d+\.\d+\.\d+)
Value DST_V6HOST ([0-9a-f:]+)
Value DST_NETWORK (\d+\.\d+\.\d+\.\d+)
Value DST_V6NETWORK ([0-9a-f:]+)
Value DST_MASK (\d+\.\d+\.\d+\.\d+)
Value DST_V6MASK (\d{1,3})
Value DST_ANY (any[46]{0,1})
Value DST_PORT (\S+)
Value DST_PORT_LESS_THAN (\S+)
Value DST_PORT_GREATER_THAN (\S+)
Value DST_PORT_RANGE_START (\S+)
Value DST_PORT_RANGE_END (\S+)
Value DST_PORT_GRP (\S+)
Value DST_PORT_OBJECT (\S+)
Value DST_ICMP_TYPE ((?!log|time|inactive)\S+)
Value SRC_SECURITY_GROUP_NAME (\S+)
Value DST_SECURITY_GROUP_NAME (\S+)
Value SRC_SECURITY_GROUP_TAG (\S+)
Value DST_SECURITY_GROUP_TAG (\S+)
Value HIT_COUNT (\d+)
Value LINE_HASH (0x\w+)
Value DST_SERVICE (\S+)
Value LOG_LEVEL ([a-z0-9]+)
Value LOG_INTERVAL (\d+)
Value TIME_RANGE (\S+)
Value ENTRY_PORT ([a-z\-]+\s+\d+|[\w\-]+)
Value ENTRY_PORT_LESS_THAN ([a-z\-]+\s+\d+|\w+)
Value ENTRY_PORT_GREATER_THAN ([a-z\-]+\s+\d+|\w+)
Value ENTRY_PORT_RANGE_START ([a-z\-]+\s+\d+|\w+)
Value ENTRY_PORT_RANGE_END ([a-z\-]+\s+\d+|\w+)
Start
^access\-list\s+cached\s+ACL* -> NoRecord
^\s+alert\-interval* -> NoRecord
^access\-list\s+${ACL_NAME};\s+${ACL_TOT_ELEM}\s+elements;\s+name\s+hash:\s+${ACL_NAME_HASH}\s* -> Record
^access\-list\s+${ACL_NAME}\s+line\s+${LINE_NUM}\s+${TYPE}\s+${ACTION}\s+(${PROTOCOL}|object\-group\s+${SVC_OBJECT_GRP}+)\s+(user\s+${USER}\s+|object\-group\-user\s+${USER_GROUP}\s+){0,1}(object\-group\-security\s+${SRC_OBJECT_GRP}\s+){0,1}(object\-group\s+${SRC_OBJECT}|${SRC_ANY}|interface\s+${SRC_INTFC}|${SRC_HOST})\s+(eq\s+${SRC_SERVICE}\s+){0,1}(object\-group\-security\s+${DST_OBJECT_GRP}\s+){0,1}(${DST_ANY}|interface\s+${DST_INTFC}|${DST_HOST}|${DST_NETWORK}\s+${DST_MASK})\s+((log\s+(${LOG_LEVEL}\s+interval\s+${LOG_INTERVAL}|disable|default))\s+){0,1}(eq\s+${DST_SERVICE}\s+){0,1}(object\-group\s+${DST_PORT_GRP}\s+){0,1}((eq\s+${ENTRY_PORT}|lt\s+${ENTRY_PORT_LESS_THAN}|gt\s+${ENTRY_PORT_GREATER_THAN}|range\s+${ENTRY_PORT_RANGE_START}\s+${ENTRY_PORT_RANGE_END})\s+){0,1}(time\-range\s+${TIME_RANGE}\s+){0,1}(${ACE_STATE}\s+){0,1}\(hitcnt=${HIT_COUNT}\)\s+(\(inactive\)\s+){0,1}${LINE_HASH}\s* -> Record
^\s+access\-list\s+${ACL_NAME}\s+line\s+${LINE_NUM}\s+${TYPE}\s+${ACTION}\s+(${PROTOCOL}|object\-group\s+${SVC_OBJECT_GRP})\s+(user\s+${USER}\s+|object\-group\-user\s+${USER_GROUP}\s+){0,1}(security\-group\s+name\s+${SRC_SECURITY_GROUP_NAME}\s+|security\-group\s+tag\s+${SRC_SECURITY_GROUP_TAG}\s+){0,1}(${SRC_ANY}|interface\s+${SRC_INTFC}|${SRC_HOST})\s+(eq\s+${SRC_SERVICE}\s+){0,1}(security\-group\s+name\s+${DST_SECURITY_GROUP_NAME}\s+|security\-group\s+tag\s+${DST_SECURITY_GROUP_TAG}\s+){0,1}(${DST_ANY}|interface\s+${DST_INTFC}|${DST_NETWORK}\s+${DST_MASK}|${DST_HOST})\s+((log\s+(${LOG_LEVEL}\s+interval\s+${LOG_INTERVAL}|disable|default))\s+){0,1}(eq\s+${DST_SERVICE}\s+){0,1}(object\-group\s+${DST_PORT_GRP}\s+){0,1}((eq\s+${ENTRY_PORT}|lt\s+${ENTRY_PORT_LESS_THAN}|gt\s+${ENTRY_PORT_GREATER_THAN}|range\s+${ENTRY_PORT_RANGE_START}\s+${ENTRY_PORT_RANGE_END})\s+){0,1}(time\-range\s+${TIME_RANGE}\s+){0,1}(${ACE_STATE}\s+){0,1}\(hitcnt=${HIT_COUNT}\)\s+(\(inactive\)\s+){0,1}${LINE_HASH}\s* -> Record
^access-list\s+${ACL_NAME}\s+line\s+${LINE_NUM}\s+remark\s+${REMARK}\s*$$ -> Record
^.* -> Error "Did not match any rules"

8
asa/policies_samples/1 Normal file
View file

@ -0,0 +1,8 @@
Start
^access\-list\s+cached\s+ACL* -> NoRecord
^\s+alert\-interval* -> NoRecord
^access\-list\s+${ACL_NAME};\s+${ACL_TOT_ELEM}\s+elements;\s+name\s+hash:\s+${ACL_NAME_HASH}\s* -> Record
^access\-list\s+${ACL_NAME}\s+line\s+${LINE_NUM}\s+${TYPE}\s+${ACTION}\s+(${PROTOCOL}|object\s+${SVC_OBJECT}|object\-group\s+${SVC_OBJECT_GRP}+)\s+(user\s+${USER}\s+|object\-group\-user\s+${USER_GROUP}\s+){0,1}(object\-group\-security\s+${SRC_SECURITY_GROUP_NAME}\s+){0,1}(interface\s+${SRC_INTFC}|object\-group\s+${SRC_OBJECT_GRP}|object\s+${SRC_OBJECT}|host\s+${SRC_HOST}|${SRC_NETWORK}\s+${SRC_MASK}|${SRC_ANY})\s+((eq\s+${SRC_PORT}|lt\s+${SRC_PORT_LESS_THAN}|gt\s+${SRC_PORT_GREATER_THAN}|range\s+${SRC_PORT_RANGE_START}\s+${SRC_PORT_RANGE_END}|object\-group\s+${SRC_PORT_GRP}|object\s+${SRC_PORT_OBJECT})\s+){0,1}(object\-group\-security\s+${DST_SECURITY_GROUP}\s+){0,1}(interface\s+${DST_INTFC}|object\-group\s+${DST_OBJECT_GRP}|object\s+${DST_OBJECT}|host\s+${DST_HOST}|${DST_NETWORK}\s+${DST_MASK}|${DST_ANY})\s+((eq\s+${DST_PORT}|lt\s+${DST_PORT_LESS_THAN}|gt\s+${DST_PORT_GREATER_THAN}|range\s+${DST_PORT_RANGE_START}\s+${DST_PORT_RANGE_END}|object\-group\s+${DST_PORT_GRP}|object\s+${DST_PORT_OBJECT})\s+){0,1}(${ICMP_KEY_VALUE}(\s+${ICMP_VALUE})?\s+){0,1}((log\s+(${LOG_LEVEL}\s+interval\s+${LOG_INTERVAL}|disable|default))\s+){0,1}(time\-range\s+${TIME_RANGE}\s+){0,1}(${ACE_STATE}\s+){0,1}\(hitcnt=${HIT_COUNT}\)\s+(\(inactive\)\s+){0,1}${LINE_HASH}\s* -> Record
^\s+access\-list\s* -> NoRecord
^access-list\s+${ACL_NAME}\s+line\s+${LINE_NUM}\s+remark\s+${REMARK}\s* -> Record
^.* -> Error "Did not match any rules"

27
asa/policies_samples/2 Normal file
View file

@ -0,0 +1,27 @@
access-list privet; 18 elements; name hash: 0xefbebe65
access-list privet line 1 remark description_test
access-list privet line 2 extended permit ospf object-group-user DM_INLINE_USER_2 any any log notifications interval 300 time-range test (hitcnt=0) 0xf6a7844b
access-list privet line 3 remark Description_string1
access-list privet line 4 remark Description_string2
access-list privet line 5 extended permit tcp object-group-user DM_INLINE_USER_3 any4 eq ftp any log alerts interval 300 time-range test (hitcnt=0) 0xc1b3a980
access-list privet line 6 extended permit tcp any any object-group SERVICE_TEST_GROUP_TCP (hitcnt=0) 0xcd904c71
access-list privet line 6 extended permit tcp any any eq bgp (hitcnt=0) 0xd0c07b5e
access-list privet line 7 extended permit tcp any object-group-security test_resolved_sec_group any object-group TCP_TEST_GROUP (hitcnt=0) 0xabd765ab
access-list privet line 7 extended permit tcp any security-group name resolved(unresolved) any range 100 200 (hitcnt=0) (inactive) 0x2d20941a
access-list privet line 8 extended permit 22 any any (hitcnt=0) 0x78153e47
access-list privet line 9 extended permit ip any any (hitcnt=0) 0xda4ada01
access-list privet line 10 extended permit object-group TCPUDP any eq tacacs any eq talk (hitcnt=0) 0x8ba25c62
access-list privet line 10 extended permit udp any eq tacacs any eq talk (hitcnt=0) 0x0ca1b296
access-list privet line 10 extended permit tcp any eq tacacs any eq talk (hitcnt=0) 0x6e50e509
access-list privet line 11 extended permit object-group TCPUDP any any object-group TCPUDP_SERVICE_GROUP_TEST inactive (hitcnt=0) (inactive) 0x58d4348f
access-list privet line 11 extended permit udp any any eq domain inactive (hitcnt=0) (inactive) 0x76f558c7
access-list privet line 11 extended permit udp any any eq nfs inactive (hitcnt=0) (inactive) 0x1adfbbe0
access-list privet line 11 extended permit tcp any any eq domain inactive (hitcnt=0) (inactive) 0xcb660d27
access-list privet line 11 extended permit tcp any any eq nfs inactive (hitcnt=0) (inactive) 0xaddac76f
access-list privet line 12 extended permit udp object-group TEST_NET_GROUP any (hitcnt=0) 0x702ed2e2
access-list privet line 12 extended permit udp any6 any (hitcnt=0) 0x2b0a59df
access-list privet line 12 extended permit udp any4 any (hitcnt=0) 0xf9aecfa0
access-list privet line 12 extended permit udp 172.31.142.0 255.255.255.0 any (hitcnt=0) 0x6d00c1e3
access-list privet line 13 extended permit ip any object range_object_net log critical interval 300 time-range test (hitcnt=0) 0x15480b53
access-list privet line 13 extended permit ip any range 192.254.24.6 192.254.24.15 log critical interval 300 time-range test (hitcnt=0) 0x15480b53
access-list privet line 14 extended permit ip host 145.252.24.2 any (hitcnt=0) 0xc29e3a56

254
asa/recursion_groups.py Normal file
View file

@ -0,0 +1,254 @@
from tokenize import group
network_groups = {
"FQDN_GROUP": {
"name": "FQDN_GROUP",
"description": "123",
"members": [
{
"type": "object",
"net_object": "FQDN_OBJ"
}
]
},
"ds_group_1": {
"name": "ds_group_1",
"description": "some description",
"members": [
{
"net_object": "2001:db8:85a3::",
"prefix_length": "65"
},
{
"type": "172.31.142.0",
"host": "255.255.255.0"
},
{
"type": "object",
"net_object": "ds_object_fqdn_v4"
},
{
"type": "object",
"net_object": "ds_object_network_v4"
},
{
"type": "object",
"net_object": "tetetet"
},
{
"type": "group",
"grp_object": "FQDN_GROUP"
}
]
},
"net_group1": {
"name": "net_group1",
"description": "",
"members": [
{
"type": "group",
"grp_object": "FQDN_GROUP"
},
{
"type": "object",
"net_object": "ds_object_host_v6"
},
{
"type": "object",
"net_object": "ds_object_network_v4"
}
]
},
"net_group2": {
"name": "net_group2",
"description": "",
"members": [
{
"net_object": "2001:db8:85a3::",
"prefix_length": "65"
},
{
"type": "group",
"grp_object": "ds_group_1"
},
{
"type": "group",
"grp_object": "net_group1"
}
]
},
"net_group3": {
"name": "net_group3",
"description": "",
"members": [
{
"type": "object",
"net_object": "ds_object_range_v6"
},
{
"type": "object",
"net_object": "hostname"
},
{
"type": "group",
"grp_object": "net_group2"
},
{
"type": "object",
"net_object": "tetetet"
}
]
},
"net_group4": {
"name": "net_group4",
"description": "",
"members": [
{
"type": "172.31.142.0",
"host": "255.255.255.0"
},
{
"type": "group",
"grp_object": "net_group3"
},
{
"type": "object",
"net_object": "net_obj_ipv6"
}
]
}
}
network_objects = {
"FQDN_OBJ": {
"description": "descr",
"type": "fqdn",
"fqdn_ip_version": "v4",
"fqdn_address": "www.example.com"
},
"hostname": {
"type": "subnet",
"network": "192.168.116.0",
"netmask": "255.255.255.0"
},
"tetetet": {
"description": "123",
"type": "host",
"host": "1.2.3.4"
},
"range_test": {
"description": "range descr",
"type": "range",
"start_ip": "1.2.3.4",
"end_ip": "4.3.2.1"
},
"ds_object_host_v4": {
"description": "some_descr",
"type": "host",
"host": "1.2.3.4"
},
"ds_object_host_v6": {
"description": "some descr",
"type": "host",
"host": "d46:3dfb:8158:f9fe:132a:d956:f7c8:a69a"
},
"ds_object_range_v4": {
"type": "range",
"start_ip": "1.2.3.4",
"end_ip": "5.6.7.8"
},
"ds_object_range_v6": {
"description": "some descr",
"type": "range",
"start_ip": "d46:3dfb:8158:f9fe:132a:d956:f7c8:a69a",
"end_ip": "d46:3dfb:8158:f9fe:132a:d956:f7c8:a69b"
},
"ds_object_network_v4": {
"type": "subnet",
"network": "1.2.3.0",
"netmask": "255.255.255.0"
},
"ds_object_fqdn_v4": {
"type": "fqdn",
"fqdn_ip_version": "v4",
"fqdn_address": "www.ya.ru"
},
"ds_object_fqdn_v6": {
"description": "some descr",
"type": "fqdn",
"fqdn_ip_version": "v6",
"fqdn_address": "www.example.com"
},
"net_obj_ipv6": {
"type": "subnet",
"network": "2001:db8:85a3::",
"prefix_length": "48"
},
"172.31.142.54": {
"type": "host",
"host": "172.31.142.54"
},
"1.1.1.1": {
"type": "host",
"host": "1.1.1.1"
}
}
def parse_member(group_member, parsed_members):
member_type = group_member.get("type", None)
if not member_type:
parsed_members.append(group_member)
return parsed_members
if member_type == "object":
parsed_members.append(network_objects[group_member["net_object"]])
return parsed_members
if group_member["type"] == "group":
group_members = network_groups[group_member["grp_object"]]["members"]
for in_member in group_members:
parse_member(in_member, parsed_members)
else:
parsed_members.append(group_member)
return parsed_members
parsed_groups = {}
for group_name, group_inners in network_groups.items():
tmp_members = []
for member in group_inners["members"]:
parse_member(member, tmp_members)
del group_inners["members"]
parsed_groups[group_name] = group_inners
parsed_groups[group_name]["members"] = tmp_members
# GPT Code
# def parse_member(group_member, parsed_members, network_objects, network_groups):
# member_type = group_member.get("type")
# if not member_type:
# parsed_members.append(group_member)
# elif member_type == "object":
# parsed_members.append(network_objects.get(group_member["net_object"]))
# elif member_type == "group":
# group_members = network_groups.get(group_member["grp_object"], {}).get("members", [])
# for in_member in group_members:
# parse_member(in_member, parsed_members, network_objects, network_groups)
# def optimize_groups(network_objects, network_groups):
# parsed_groups = {}
# for group_name, group_inners in network_groups.items():
# tmp_members = []
# for member in group_inners.get("members", []):
# parse_member(member, tmp_members, network_objects, network_groups)
# parsed_groups[group_name] = group_inners.copy()
# parsed_groups[group_name]["members"] = tmp_members
# del parsed_groups[group_name]["members"] # Removing redundant members
# return parsed_groups
# # Example usage
# optimized_groups = optimize_groups(network_objects, network_groups)

1627
asa/recursion_services.py Normal file

File diff suppressed because it is too large Load diff

511
asa/test.log Normal file
View file

@ -0,0 +1,511 @@
DEBUG:paramiko.transport:starting thread (client mode): 0xc4c66320
DEBUG:paramiko.transport:Local version/idstring: SSH-2.0-paramiko_3.4.0
DEBUG:paramiko.transport:Remote version/idstring: SSH-2.0-Cisco-1.25
INFO:paramiko.transport:Connected (version 2.0, client Cisco-1.25)
DEBUG:paramiko.transport:=== Key exchange possibilities ===
DEBUG:paramiko.transport:kex algos: diffie-hellman-group1-sha1
DEBUG:paramiko.transport:server key: ssh-rsa
DEBUG:paramiko.transport:client encrypt: aes128-cbc, aes192-cbc, aes256-cbc, aes128-ctr
DEBUG:paramiko.transport:server encrypt: aes128-cbc, aes192-cbc, aes256-cbc, aes128-ctr
DEBUG:paramiko.transport:client mac: hmac-sha1, hmac-sha1-96
DEBUG:paramiko.transport:server mac: hmac-sha1, hmac-sha1-96
DEBUG:paramiko.transport:client compress: none
DEBUG:paramiko.transport:server compress: none
DEBUG:paramiko.transport:client lang: <none>
DEBUG:paramiko.transport:server lang: <none>
DEBUG:paramiko.transport:kex follows: False
DEBUG:paramiko.transport:=== Key exchange agreements ===
DEBUG:paramiko.transport:Kex: diffie-hellman-group1-sha1
DEBUG:paramiko.transport:HostKey: ssh-rsa
DEBUG:paramiko.transport:Cipher: aes128-ctr
DEBUG:paramiko.transport:MAC: hmac-sha1
DEBUG:paramiko.transport:Compression: none
DEBUG:paramiko.transport:=== End of kex handshake ===
DEBUG:paramiko.transport:kex engine KexGroup1 specified hash_algo <built-in function openssl_sha1>
DEBUG:paramiko.transport:Switch to new keys ...
DEBUG:paramiko.transport:Adding ssh-rsa host key for 172.31.142.14: b'cb9cd264fd6ee3861e726078c83a4600'
DEBUG:paramiko.transport:userauth is OK
INFO:paramiko.transport:Authentication (password) successful!
DEBUG:paramiko.transport:[chan 0] Max packet in: 32768 bytes
DEBUG:paramiko.transport:[chan 0] Max packet out: 4096 bytes
DEBUG:paramiko.transport:Secsh channel 0 opened.
DEBUG:paramiko.transport:[chan 0] Sesch channel 0 request ok
DEBUG:paramiko.transport:[chan 0] Sesch channel 0 request ok
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:write_channel: b'show curpriv\n'
DEBUG:netmiko:read_channel: Type help or '?' for a list of available commands.
ciscoasa/admin>
ciscoasa/admin>
DEBUG:netmiko:read_channel: show curpriv
Username : user
Current privilege level : 1
Current Mode/s : P_UNPR
ciscoasa/admin>
DEBUG:netmiko:Pattern found: (show\ curpriv) Type help or '?' for a list of available commands.
ciscoasa/admin>
ciscoasa/admin> show curpriv
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Clear buffer detects data in the channel
DEBUG:netmiko:read_channel:
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
ciscoasa/admin>
DEBUG:netmiko:
Parenthesis found in pattern.
pattern: (\#|>)
This can be problemtic when used in read_until_pattern().
You should ensure that you use either non-capture groups i.e. '(?:' or that the
parenthesis completely wrap the pattern '(pattern)'
DEBUG:netmiko:Pattern found: (\#|>)
ciscoasa/admin>
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Clear buffer detects data in the channel
DEBUG:netmiko:read_channel:
DEBUG:netmiko:[find_prompt()]: prompt is ciscoasa/admin>
DEBUG:netmiko:write_channel: b'login\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: login
Username:
DEBUG:netmiko:Pattern found: (login) login
DEBUG:netmiko:read_channel:
DEBUG:netmiko:write_channel: b'user\n'
DEBUG:netmiko:read_channel: user
Password:
DEBUG:netmiko:write_channel: b'********\n'
DEBUG:netmiko:read_channel: ***********
ciscoasa/admin#
DEBUG:netmiko:In disable_paging
DEBUG:netmiko:Command: terminal pager 0
DEBUG:netmiko:write_channel: b'terminal pager 0\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: terminal pager 0
DEBUG:netmiko:Pattern found: (terminal\ pager\ 0) terminal pager 0
DEBUG:netmiko:terminal pager 0
DEBUG:netmiko:Exiting disable_paging
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:read_channel: ciscoasa/admin#
DEBUG:netmiko:Pattern found: ([>\#])
ciscoasa/admin#
DEBUG:netmiko:write_channel: b'configure terminal\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
ciscoasa/admin#
DEBUG:netmiko:read_channel: configure terminal
ciscoasa/admin(config)#
DEBUG:netmiko:Pattern found: (configure\ terminal)
ciscoasa/admin# configure terminal
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Pattern found: (ciscoasa/admin.*)
ciscoasa/admin(config)#
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
ciscoasa/admin(config)#
DEBUG:netmiko:Pattern found: ([>\#])
ciscoasa/admin(config)#
DEBUG:netmiko:write_channel: b'terminal width 511\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: terminal width
DEBUG:netmiko:read_channel: 511
ciscoasa/admin(config)#
DEBUG:netmiko:Pattern found: (terminal\ width\ 511) terminal width 511
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Pattern found: ((?:ciscoasa/admin.*$|#.*$))
ciscoasa/admin(config)#
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
ciscoasa/admin(config)#
DEBUG:netmiko:Pattern found: ([>\#])
ciscoasa/admin(config)#
DEBUG:netmiko:write_channel: b'end\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: end
ciscoasa/admin#
DEBUG:netmiko:Pattern found: (end) end
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Pattern found: (#.*)
ciscoasa/admin#
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
ciscoasa/admin#
DEBUG:netmiko:Pattern found: ([>\#])
ciscoasa/admin#
DEBUG:netmiko:exit_config_mode: end
ciscoasa/admin#
DEBUG:netmiko:
ciscoasa/admin# configure terminal
ciscoasa/admin(config)# terminal width 511
ciscoasa/admin(config)# end
ciscoasa/admin#
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Clear buffer detects data in the channel
DEBUG:netmiko:read_channel:
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
ciscoasa/admin#
DEBUG:netmiko:
Parenthesis found in pattern.
pattern: (\#|>)
This can be problemtic when used in read_until_pattern().
You should ensure that you use either non-capture groups i.e. '(?:' or that the
parenthesis completely wrap the pattern '(pattern)'
DEBUG:netmiko:Pattern found: (\#|>)
ciscoasa/admin#
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Clear buffer detects data in the channel
DEBUG:netmiko:read_channel:
DEBUG:netmiko:[find_prompt()]: prompt is ciscoasa/admin#
DEBUG:netmiko:write_channel: b'login\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: login
^
ERROR: % Invalid input detected at '^' marker.
ciscoasa/admin#
DEBUG:netmiko:Pattern found: (login) login
DEBUG:netmiko:read_channel:
DEBUG:netmiko:write_channel: b'login\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: login
^
ERROR: % Invalid input detected at '^' marker.
ciscoasa/admin#
DEBUG:netmiko:Pattern found: (login) login
DEBUG:netmiko:read_channel:
DEBUG:paramiko.transport:starting thread (client mode): 0x1fc6a3e0
DEBUG:paramiko.transport:Local version/idstring: SSH-2.0-paramiko_3.4.0
DEBUG:paramiko.transport:Remote version/idstring: SSH-2.0-Cisco-1.25
INFO:paramiko.transport:Connected (version 2.0, client Cisco-1.25)
DEBUG:paramiko.transport:=== Key exchange possibilities ===
DEBUG:paramiko.transport:kex algos: diffie-hellman-group1-sha1
DEBUG:paramiko.transport:server key: ssh-rsa
DEBUG:paramiko.transport:client encrypt: aes128-cbc, aes192-cbc, aes256-cbc, aes128-ctr
DEBUG:paramiko.transport:server encrypt: aes128-cbc, aes192-cbc, aes256-cbc, aes128-ctr
DEBUG:paramiko.transport:client mac: hmac-sha1, hmac-sha1-96
DEBUG:paramiko.transport:server mac: hmac-sha1, hmac-sha1-96
DEBUG:paramiko.transport:client compress: none
DEBUG:paramiko.transport:server compress: none
DEBUG:paramiko.transport:client lang: <none>
DEBUG:paramiko.transport:server lang: <none>
DEBUG:paramiko.transport:kex follows: False
DEBUG:paramiko.transport:=== Key exchange agreements ===
DEBUG:paramiko.transport:Kex: diffie-hellman-group1-sha1
DEBUG:paramiko.transport:HostKey: ssh-rsa
DEBUG:paramiko.transport:Cipher: aes128-ctr
DEBUG:paramiko.transport:MAC: hmac-sha1
DEBUG:paramiko.transport:Compression: none
DEBUG:paramiko.transport:=== End of kex handshake ===
DEBUG:paramiko.transport:kex engine KexGroup1 specified hash_algo <built-in function openssl_sha1>
DEBUG:paramiko.transport:Switch to new keys ...
DEBUG:paramiko.transport:Adding ssh-rsa host key for 172.31.142.14: b'cb9cd264fd6ee3861e726078c83a4600'
DEBUG:paramiko.transport:userauth is OK
INFO:paramiko.transport:Authentication (password) successful!
DEBUG:paramiko.transport:[chan 0] Max packet in: 32768 bytes
DEBUG:paramiko.transport:[chan 0] Max packet out: 4096 bytes
DEBUG:paramiko.transport:Secsh channel 0 opened.
DEBUG:paramiko.transport:[chan 0] Sesch channel 0 request ok
DEBUG:paramiko.transport:[chan 0] Sesch channel 0 request ok
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:write_channel: b'show curpriv\n'
DEBUG:netmiko:read_channel: Type help or '?' for a list of available commands.
ciscoasa/admin>
ciscoasa/admin>
DEBUG:netmiko:read_channel: show curpriv
Username : user
Current privilege level : 1
Current Mode/s : P_UNPR
ciscoasa/admin>
DEBUG:netmiko:Pattern found: (show\ curpriv) Type help or '?' for a list of available commands.
ciscoasa/admin>
ciscoasa/admin> show curpriv
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Clear buffer detects data in the channel
DEBUG:netmiko:read_channel:
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
ciscoasa/admin>
DEBUG:netmiko:
Parenthesis found in pattern.
pattern: (\#|>)
This can be problemtic when used in read_until_pattern().
You should ensure that you use either non-capture groups i.e. '(?:' or that the
parenthesis completely wrap the pattern '(pattern)'
DEBUG:netmiko:Pattern found: (\#|>)
ciscoasa/admin>
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Clear buffer detects data in the channel
DEBUG:netmiko:read_channel:
DEBUG:netmiko:[find_prompt()]: prompt is ciscoasa/admin>
DEBUG:netmiko:write_channel: b'login\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: login
Username:
DEBUG:netmiko:Pattern found: (login) login
DEBUG:netmiko:read_channel:
DEBUG:netmiko:write_channel: b'user\n'
DEBUG:netmiko:read_channel: user
Password:
DEBUG:netmiko:write_channel: b'********\n'
DEBUG:netmiko:read_channel: ***********
ciscoasa/admin#
DEBUG:netmiko:In disable_paging
DEBUG:netmiko:Command: terminal pager 0
DEBUG:netmiko:write_channel: b'terminal pager 0\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: terminal pager 0
ciscoasa/admin#
DEBUG:netmiko:Pattern found: (terminal\ pager\ 0) terminal pager 0
DEBUG:netmiko:terminal pager 0
DEBUG:netmiko:Exiting disable_paging
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Pattern found: ([>\#])
ciscoasa/admin#
DEBUG:netmiko:write_channel: b'configure terminal\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
ciscoasa/admin# configure
DEBUG:netmiko:read_channel: terminal
ciscoasa/admin(config)#
DEBUG:netmiko:Pattern found: (configure\ terminal)
ciscoasa/admin# configure terminal
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Pattern found: (ciscoasa/admin.*)
ciscoasa/admin(config)#
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
ciscoasa/admin(config)#
DEBUG:netmiko:Pattern found: ([>\#])
ciscoasa/admin(config)#
DEBUG:netmiko:write_channel: b'terminal width 511\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: terminal width 511
ciscoasa/admin(config)#
DEBUG:netmiko:Pattern found: (terminal\ width\ 511) terminal width 511
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Pattern found: ((?:ciscoasa/admin.*$|#.*$))
ciscoasa/admin(config)#
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
ciscoasa/admin(config)#
DEBUG:netmiko:Pattern found: ([>\#])
ciscoasa/admin(config)#
DEBUG:netmiko:write_channel: b'end\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: end
ciscoasa/admin#
DEBUG:netmiko:Pattern found: (end) end
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Pattern found: (#.*)
ciscoasa/admin#
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
ciscoasa/admin#
DEBUG:netmiko:Pattern found: ([>\#])
ciscoasa/admin#
DEBUG:netmiko:exit_config_mode: end
ciscoasa/admin#
DEBUG:netmiko:
ciscoasa/admin# configure terminal
ciscoasa/admin(config)# terminal width 511
ciscoasa/admin(config)# end
ciscoasa/admin#
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Clear buffer detects data in the channel
DEBUG:netmiko:read_channel:
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
ciscoasa/admin#
DEBUG:netmiko:
Parenthesis found in pattern.
pattern: (\#|>)
This can be problemtic when used in read_until_pattern().
You should ensure that you use either non-capture groups i.e. '(?:' or that the
parenthesis completely wrap the pattern '(pattern)'
DEBUG:netmiko:Pattern found: (\#|>)
ciscoasa/admin#
DEBUG:netmiko:read_channel:
DEBUG:netmiko:Clear buffer detects data in the channel
DEBUG:netmiko:read_channel:
DEBUG:netmiko:[find_prompt()]: prompt is ciscoasa/admin#
DEBUG:netmiko:write_channel: b'login\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: login
^
ERROR: % Invalid input detected at '^' marker.
ciscoasa/admin#
DEBUG:netmiko:Pattern found: (login) login
DEBUG:netmiko:read_channel:
DEBUG:netmiko:write_channel: b'login\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: login
^
ERROR: % Invalid input detected at '^' marker.
ciscoasa/admin#
DEBUG:netmiko:Pattern found: (login) login
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:write_channel: b'\n'
DEBUG:netmiko:read_channel:
ciscoasa/admin#
DEBUG:netmiko:read_channel:
DEBUG:netmiko:[find_prompt()]: prompt is ciscoasa/admin#
DEBUG:netmiko:write_channel: b'show version\n'
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: show version
Cisco Adaptive Security Appliance Software Version 9.1(7)32 <context>
Device Manager Version 7.12(2)
Compiled on Tue 04-Sep-18 08:37 by builders
ciscoasa up 51 days 6 hours
DEBUG:netmiko:Pattern found: (show\ version) show version
DEBUG:netmiko:read_channel: Hardware: ASA5510, 1024 MB RAM, CPU Pentium 4 Celeron 1600 MHz,
Internal ATA Compact Flash, 256MB
BIOS Flash M50FW016 @ 0xfff00000, 2048KB
Encryption hardware device : Cisco ASA-55xx on-board accelerator (revision 0x0)
Boot microcode : CN1000-MC-BOOT-2.00
SSL/IKE microcode : CNlite-MC-SSLm-PLUS-2.08
IPSec microcode : CNlite-MC-IPSECm-MAIN-2.09
Number of accelerators: 1
0: Ext: Ethernet0/0 : address is 4403.a70f.e0d4, irq 9
1: Ext: Ethernet0/1 : address is 4403.a70f.e0d5, irq 9
2: Ext: Ethernet0/2 : address is 4403.a70f.e0d6, irq 9
3: Ext: Ethernet0/3 : address is 4403.a70f.e0d7, irq 9
4: Ext: Management0/0 : address is 4403.a70f.e0d8, irq 11
5: Int: Not used : irq 11
6: Int: Not used : irq 5
Licensed features for this platform:
Maximum Physical Interfaces : Unlimited perpetual
Maximum VLANs : 100 perpetual
Inside Hosts : Unlimited perpetual
Failover : Active/Active perpetual
Encryption-DES : Enabled perpetual
Encryption-3DES-AES : Enabled perpetual
Security Contexts : 2 perpetual
GTP/GPRS : Disabled perpetual
AnyConnect Premium Peers : 2 perpetual
AnyConnect Essentials : 250 perpetual
Other VPN Peers : 250 perpetual
Total VPN Peers : 250 perpetual
Shared License : Disabled perpetual
AnyConnect for Mobile : Enabled perpetual
AnyConnect for Cisco VPN Phone : Disabled perpetual
Advanced Endpoint Assessment : Disabled perpetual
UC Phone Proxy Sessions : 2 perpetual
Total UC Proxy Sessions : 2 perpetual
Botnet Traffic Filter : Disabled perpetual
Intercompany Media Engine : Disabled perpetual
Cluster : Disabled perpetual
This platform has an ASA 5510 Security Plus license.
Serial Number: JMX172180D3
Running Permanent Activation Key: 0x9717ed4f 0x98ed5681 0x19a08924 0xd3d0bc64 0x0037cba8
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel:
DEBUG:netmiko:read_channel: Configuration register is 0x1
Configuration last modified by user at 17:22:40.250 GMT Wed Jul 3 2024
ciscoasa/admin#

8
astraLdap/.idea/.gitignore vendored Normal file
View file

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="FacetManager">
<facet type="django" name="Django">
<configuration>
<option name="rootFolder" value="$MODULE_DIR$" />
<option name="settingsModule" value="astraLdap/settings.py" />
<option name="manageScript" value="$MODULE_DIR$/manage.py" />
<option name="environment" value="&lt;map/&gt;" />
<option name="doNotUseTestRunner" value="false" />
<option name="trackFilePattern" value="migrations" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Remote Python 3.7.3 (sftp://astra@172.16.122.129:22/usr/bin/python3)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
<option name="format" value="PLAIN" />
<option name="myDocStringFormat" value="Plain" />
</component>
<component name="TemplatesService">
<option name="TEMPLATE_CONFIGURATION" value="Django" />
</component>
</module>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PublishConfigData" autoUpload="Always" serverName="astraLdap" remoteFilesAllowedToDisappearOnAutoupload="false" confirmBeforeUploading="false">
<option name="confirmBeforeUploading" value="false" />
<serverData>
<paths name="astra@172.16.122.129:22 password">
<serverdata>
<mappings>
<mapping deploy="/tmp/pycharm_project_794" local="$PROJECT_DIR$" />
</mappings>
</serverdata>
</paths>
<paths name="astraLdap">
<serverdata>
<mappings>
<mapping deploy="/" local="$PROJECT_DIR$" web="/" />
</mappings>
</serverdata>
</paths>
</serverData>
<option name="myAutoUpload" value="ALWAYS" />
</component>
</project>

View file

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyInterpreterInspection" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
</component>

View file

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

4
astraLdap/.idea/misc.xml Normal file
View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Remote Python 3.7.3 (sftp://astra@172.16.122.129:22/usr/bin/python3)" project-jdk-type="Python SDK" />
</project>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/astraLdap.iml" filepath="$PROJECT_DIR$/.idea/astraLdap.iml" />
</modules>
</component>
</project>

View file

View file

@ -0,0 +1,16 @@
"""
ASGI config for astraLdap project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'astraLdap.settings')
application = get_asgi_application()

View file

@ -0,0 +1,126 @@
"""
Django settings for astraLdap project.
Generated by 'django-admin startproject' using Django 3.2.
For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-kyvycdk5z&4-j3%(0h$6(a36ji0dmei9teg)tw)cocg8-=v2vu'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ldapauth'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'astraLdap.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'astraLdap.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
STATIC_URL = '/static/'
# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

View file

@ -0,0 +1,22 @@
"""astraLdap URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path("ldap/", include('ldapauth.urls'))
]

View file

@ -0,0 +1,16 @@
"""
WSGI config for astraLdap project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'astraLdap.settings')
application = get_wsgi_application()

BIN
astraLdap/db.sqlite3 Normal file

Binary file not shown.

View file

View file

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

View file

@ -0,0 +1,6 @@
from django.apps import AppConfig
class LdapauthConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'ldapauth'

View file

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

View file

@ -0,0 +1,28 @@
import ldap
class LdapConnectManager:
def __init__(self, ldap_ip: str, ldap_domain: str):
self.ldap_ip = ldap_ip
self.ldap_domain = ldap_domain
def establish_ldap_connection(self):
try:
ldap_connection = ldap.initialize(f"ldap://{self.ldap_ip}")
print(ldap_connection)
return "All good"
except ldap.SERVER_DOWN:
print("Cannot connect to LDAP server")
return "Cannot connect to LDAP server"
def user_authentication(self, username: str, password: str):
ldap_connector = ldap.initialize(f"ldap://{self.ldap_ip}")
try:
ldap_connector.bind_s(f"dc=EPP,dc=RU,cn=vasya", password)
ldap_result = ldap_connector.search("dc=EPP,dc=RU", ldap.SCOPE_SUBTREE, "(&(objectClass=Person)(cn=vasya))", None)
res_type, data = ldap_connector.result(ldap_result, 0)
print(f"\n\n\n\n\n\n\n\n\n\n{data}")
return data
except ldap.SERVER_DOWN:
return "Server is offline"
except ldap.INVALID_CREDENTIALS:
return "Password is incorrect"

View file

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View file

@ -0,0 +1,10 @@
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from . import views
urlpatterns = [
path('test_ldap_conncetion/', views.LdapTestConnection.as_view()),
path('test_ldap_auth/<str:username>/<str:password>', views.LdapTestAuth.as_view()),
]
urlpatterns = format_suffix_patterns(urlpatterns)

View file

@ -0,0 +1,15 @@
from rest_framework.views import APIView
from rest_framework.response import Response
from django.http import JsonResponse
from .services import LdapConnectManager
class LdapTestConnection(APIView):
def get(self, request):
ldap_connector = LdapConnectManager("astra.epp.ru", "wscusers.local")
return JsonResponse({"ldap_status": ldap_connector.establish_ldap_connection()})
class LdapTestAuth(APIView):
def get(self, request, username, password):
ldap_connector = LdapConnectManager("astra.epp.ru", "wscusers")
return JsonResponse({"ldap_status": ldap_connector.user_authentication(username, password)})

22
astraLdap/manage.py Executable file
View file

@ -0,0 +1,22 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'astraLdap.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()

26
classes/cls_playground.py Normal file
View file

@ -0,0 +1,26 @@
class BPerms:
pass
class DManage(BPerms):
pass
class DRead(BPerms):
pass
class SMCPerms:
dt = DManage
dr = DRead
@classmethod
def get_perms_names(cls):
perms_names = [attr_name for attr_name, attr_type in cls.__dict__.items() if isinstance(attr_type, type)]
# for attr_name, attr_type in cls.__dict__.items():
# if isinstance(attr_type, type):
# perms_names.append(attr_name)
return perms_names
print(SMCPerms.get_perms_names())

12
console.env Normal file
View file

@ -0,0 +1,12 @@
SECRET_KEY='django-insecure-hzdxy#u441-_&!jhfmxi0%w9r9xoa*oowy9aix*44f4q896ww8'
DEBUG=1
LOG_LEVEL=INFO
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=console_db
DB_USER=console_user
DB_PASSWORD=console_user_password
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
SMC_LICENSE_KEY='6087bee1-85b6-416e-8dce-cf5609ecc77f'
LICENSE_SERVER_ADDRESS='http://10.10.14.28:8000'

573
dashboard.drawio Normal file

File diff suppressed because one or more lines are too long

35
db_dropper_backend.py Normal file
View file

@ -0,0 +1,35 @@
import psycopg2
import subprocess
import os
# Clean all untracked migrations
os.system("git clean -xf */migrations/")
# establishing the connection
conn = psycopg2.connect(
database="postgres", user='console_user', password='console_user_password', host='127.0.0.1', port='5432'
)
conn.autocommit = True
# Creating a cursor object using the cursor() method
cursor = conn.cursor()
# Preparing query to create a database
sql = '''DROP DATABASE console_db;'''
# Creating a database
try:
cursor.execute(sql)
print("Database dropped successfully ->")
except psycopg2.ProgrammingError:
print("Database license does not exists")
sql = '''CREATE database console_db;'''
cursor.execute(sql)
print("-> Database created successfully")
sql = '''grant all privileges on database console_db to console_user;'''
cursor.execute(sql)
print("Database user license_user has all rights to database license")
# Closing the connection
conn.close()
subprocess.run(['python3', 'manage.py', 'makemigrations'])
subprocess.run(['python3', 'manage.py', 'migrate'])

31
db_dropper_license.py Normal file
View file

@ -0,0 +1,31 @@
import psycopg2
import subprocess
# establishing the connection
conn = psycopg2.connect(
database="postgres", user='license_user', password='license_user_password', host='127.0.0.1', port='5432'
)
conn.autocommit = True
# Creating a cursor object using the cursor() method
cursor = conn.cursor()
# Preparing query to create a database
sql = '''DROP DATABASE license;'''
# Creating a database
try:
cursor.execute(sql)
print("Database dropped successfully ->")
except psycopg2.ProgrammingError:
print("Database license does not exists")
sql = '''CREATE database license;'''
cursor.execute(sql)
print("-> Database created successfully")
sql = '''grant all privileges on database license to license_user;'''
cursor.execute(sql)
print("Database user license_user has all rights to database license")
# Closing the connection
conn.close()
subprocess.run(['python3', 'manage.py', 'makemigrations'])
subprocess.run(['python3', 'manage.py', 'migrate'])

15
db_waiter.py Normal file
View file

@ -0,0 +1,15 @@
def wait_for_db_object(database_model_to_wait, model_field_to_get, model_value_to_get, timeout):
counter = 0
while counter < timeout:
try:
if model_field_to_get == "id":
database_model_to_wait.objects.get(pk=model_value_to_get)
elif model_field_to_get == "name":
database_model_to_wait.objects.get(name=model_value_to_get)
else:
return False
return True
except database_model_to_wait.DoesNotExist:
time.sleep(1)
counter += 1
return False

View file

41
dome_front/Dockerfile Normal file
View file

@ -0,0 +1,41 @@
# Use Node.js LTS image as base
FROM node:lts
# Set working directory
WORKDIR /app
# Copy repository into container
COPY . .
# Install Node Version Manager
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
# Install Node.js v18.14.0
RUN /bin/bash -c "source ~/.bashrc && nvm install v18.14.0"
# Export path to installed Node.js
RUN echo 'export PATH="/home/astra/.nvm/versions/node/v18.14.0/bin:${PATH}"' >> ~/.bashrc
# Activate NVM
SHELL ["/bin/bash", "--login", "-c"]
# Configure npm registry
RUN npm config --global set 'registry=https://nexuswatchman.t1-consulting.ru/repository/npm-group/'
RUN npm config --global set 'fund=false'
# Install npm dependencies
RUN npm install
# Create environment file
RUN touch .env.local
# Populate environment file with backend URL
RUN echo 'API_URL="http://172.31.142.195:8080"' >> .env.local
# Expose port 3000
EXPOSE 3000
# Command to run the development server
CMD ["npm", "run", "dev"]

BIN
drawings/test.rnote Normal file

Binary file not shown.

0
enums/__init__.py Normal file
View file

10
enums/main.py Normal file
View file

@ -0,0 +1,10 @@
from enum import Enum
from typing import Any
class CronSettings(Enum):
MINUTE_1 = 1
print(CronSettings["MINUTE_1"].value)

3
golang/go.mod Normal file
View file

@ -0,0 +1,3 @@
module tour_of_go/exercises
go 1.21.3

View file

@ -0,0 +1,19 @@
package main
import (
"fmt"
)
func Sqrt(x float64) float64 {
z := float64(1)
for i:=0; i<10; i++ {
z -= (z*z-x)/(2*z)
}
return z
}
func main() {
fmt.Println(Sqrt(2))
fmt.Println(Sqrt(4))
fmt.Println(Sqrt(122))
}

112
ldap_test/adsearch.py Normal file
View file

@ -0,0 +1,112 @@
""""
import ldap
from ldap.controls import SimplePagedResultsControl
ldap.set_option(ldap.OPT_REFERRALS, 0)
ldap.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
connection = ldap.initialize(f"ldap://10.10.14.103")
# connection.simple_bind_s("admin", "password")
base = "dc=EPP,dc=RU"
scope = ldap.SCOPE_SUBTREE
filter = "(&(objectClass=person)(description=vasya@EPP.RU))"
attrs = ['*']
req_ctrl = SimplePagedResultsControl(criticality=True, size=1000, cookie='')
pagination_settings = SimplePagedResultsControl(criticality=True, size=1000, cookie='')
ldap_search_query = connection.search_ext(
base, ldap.SCOPE_SUBTREE, filter, attrlist=attrs, serverctrls=[pagination_settings]
)
known_ldap_resp_ctrls = {
SimplePagedResultsControl.controlType: SimplePagedResultsControl,
}
total_results = []
pages = 0
while True:
pages += 1
rtype, rdata, rmsgid, serverctrls = connection.result3(ldap_search_query,
resp_ctrl_classes=known_ldap_resp_ctrls)
print(rdata)
page_controls = [
c
for c in serverctrls
if c.controlType == SimplePagedResultsControl.controlType
]
if page_controls:
if page_controls[0].cookie:
# Copy cookie from response control to request control
pagination_settings.cookie = page_controls[0].cookie
ldap_search_query = connection.search_ext(
base,
ldap.SCOPE_SUBTREE,
filter,
attrlist=attrs,
serverctrls=[pagination_settings]
)
else:
break
else:
print("Warning: Server ignores RFC 2696 control.")
break
"""
"""
import ldap
import gssapi
user = "vasya"
password = "1234qwertY*"
mech = gssapi.Mechanism.from_name('krb5')
name = gssapi.Name(user, gssapi.NameType.user_principal_name)
creds = mech.acquire_cred_with_password(name, password)
target = "ldap/astra.epp.ru@EPP.RU"
ctx = gssapi.SecurityContext(creds, mech)
ctx_flags = gssapi.RequirementFlag.mutual_authentication | gssapi.RequirementFlag.confidentiality
ctx.initiate_security_context(target_name=target, flags=ctx_flags)
query = "(uid=user1)"
ldap_connection = ldap.initialize(f"ldap://epp.ru")
result = ctx.init_sec_context(lambda data: ldap_connection.sasl_interactive_bind_s("", gssapi.raw(data)), query)
krb = gssapi.Name('kerberos', gssapi.NameType.krb5_nt_principal_name)
"""
"""
import ldap, ldap.sasl, urllib
ldap_conn = ldap.initialize("ldap://epp.ru")
auth = ldap.sasl.gssapi()
# Bind to the LDAP server using GSSAPI authentication
ldap_conn.sasl_gssapi_bind_s('', auth)
# Check if the bind was successful
print(ldap_conn.whoami_s())
"""
"""
import logging
from abc import ABC, abstractmethod
from typing import Any, Optional, Tuple, Type
from gssapi import Name, NameType
from gssapi.exceptions import GSSError
from gssapi.raw import acquire_cred_with_password
_log = logging.getLogger(__name__)
"""
import ldap, ldap.sasl
l = ldap.initialize("ldap://epp.ru")
auth = ldap.sasl.gssapi("")
l.sasl_bind_s("", auth, cred="")
res = l.search_s("dc=nil,dc=b17",ldap.SCOPE_BASE,"(objectClass=*)")
print(res)
l.unbind()

17
ldap_test/main.py Normal file
View file

@ -0,0 +1,17 @@
#! /usr/bin/python3
import ldap
import ldap.sasl
HOST = "172.31.142.142"
PORT = 636
user_name = "wscusers\JohnDoe"
pwd = "T1Rules@123"
if __name__ == '__main__':
ldap_conn = ldap.initialize("ldap://[%s]" % (HOST))
ldap_conn.simple_bind_s(user_name, pwd)
try:
print(ldap_conn.whoami_s())
except ldap.INVALID_CREDENTIALS as e:
print(e)

25
ldap_test/testai.py Normal file
View file

@ -0,0 +1,25 @@
import ldap
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
conn = ldap.initialize('ldap://10.10.14.103')
# conn.simple_bind_s('admin@admin', '3pro01003ton')
groups = []
results = conn.search_s('dc=EPP,dc=RU', ldap.SCOPE_SUBTREE, 'objectClass=posixGroup', ["cn", "memberUid"])
for result in results:
print(result[1])
groups.append(result[1]['cn'][0].decode('utf-8'))
print(groups)
# for group in groups:
# group_name = group
# group_users = conn.search_s('dc=EPP,dc=RU', ldap.SCOPE_BASE, "(objectClass=posixGroup)", ["*"])
# print(group_users)
# user_list = []
# for user in group_users[0][1]["memberUid"]:
# user_dn = "uid={},ou=users,dc=EPP,dc=RU".format(user.decode())
# user_data = conn.search_s(user_dn, ldap.SCOPE_BASE)
# user_list.append(user_data[0][1]["cn"][0])
# print("Group {} contains users: {}".format(group_name, ", ".join(user_list)))

25
leetcode.py Normal file
View file

@ -0,0 +1,25 @@
from typing import List
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
iterator = 0
nums1 = nums1[:m]
nums2 = nums2[:n]
while nums2:
try:
if nums1[iterator] >= nums2[0]:
nums1.insert(iterator, nums2[0])
nums2.pop(0)
iterator += 1
except IndexError:
nums1 += nums2
break
print(nums1)
sl = Solution()
sl.merge([1, 2, 3, 0, 0, 0], 3, [2, 5, 6], 3)

0
license_generator.py Normal file
View file

View file

@ -0,0 +1,16 @@
"""
ASGI config for license_server project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'license_server.settings')
application = get_asgi_application()

View file

@ -0,0 +1,125 @@
"""
Django settings for license_server project.
Generated by 'django-admin startproject' using Django 3.2.7.
For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-$)x2z=0+8j8n#kp3+%+f!hayts2fxee2k5h)^2x^pc*gc#y&jp'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'license_server.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'license_server.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
STATIC_URL = '/static/'
# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

View file

@ -0,0 +1,21 @@
"""license_server URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]

View file

@ -0,0 +1,16 @@
"""
WSGI config for license_server project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'license_server.settings')
application = get_wsgi_application()

22
license_server/manage.py Executable file
View file

@ -0,0 +1,22 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'license_server.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()

0
ndr/__init__.py Normal file
View file

View file

View file

@ -0,0 +1,79 @@
import requests
import base64
import subprocess
import json
from dh_tests import DiffieHellmanConsoleManager
SMC_LICENSE_KEY = "6087bee1-85b6-416e-8dce-cf5609ecc77f"
NDR_LICENSE_KEY = "7eea457f-5069-452d-b623-122bfe22b75e"
NDR_IP_ADDRESS = "192.168.56.10"
REGISTER_DEVICE_API_URL = f"https://{NDR_IP_ADDRESS}:8000/api/v1/auth/session/add-trusted-device"
# Forming base64 wsmc code
smc_base64_license_key = base64.b64encode(SMC_LICENSE_KEY.encode('utf-8')).decode('utf-8')
# Forming base64 ndr code
ndr_base64_license_key = base64.b64encode(NDR_LICENSE_KEY.encode('utf-8')).decode('utf-8')
# Declaring DH manager
dh_manager = DiffieHellmanConsoleManager()
# Генерируем параметры Diffie-Hellman
# dhparam_command = ['openssl', 'dhparam', '-out', 'dhp.pem', '2048']
# subprocess.run(dhparam_command, check=True)
dh_manager.dh_params = dh_manager.generate_dh_params()
# Генерируем закрытый ключ DH
# genpkey_command = ['openssl', 'genpkey', '-paramfile', 'dhp.pem', '-out', 'dhkeyA.pem']
# subprocess.run(genpkey_command, check=True)
dh_manager.host_private_key = dh_manager.generate_host_private_key(dh_params=dh_manager.dh_params)
# Извлекаем открытый ключ DH из закрытого ключа
# pkey_command = ['openssl', 'pkey', '-in', 'dhkeyA.pem', '-pubout', '-out', 'dhpubA.pem']
# subprocess.run(pkey_command, check=True)
dh_manager.host_public_key = dh_manager.generate_host_public_key(dh_manager.host_private_key)
# Получаем ключ из файла
# f = open("dhpubA.pem", "r")
global_key_A = dh_manager.host_public_key
smc_global_key = base64.b64encode(global_key_A.encode('utf-8')).decode('utf-8')
print("-"*60)
print(smc_base64_license_key)
print("-"*60)
print(ndr_base64_license_key)
print("-"*60)
print(smc_global_key)
# Делаем запрос на регистрацию устройства
request_data = {
"lic_key_ndr": ndr_base64_license_key,
"lic_key_smc": smc_base64_license_key,
"public_key": smc_global_key
}
response = requests.post(REGISTER_DEVICE_API_URL, json=request_data, verify=False)
print("Status code:", response.status_code)
print("Headers:", response.headers)
response_body = json.loads(response.text)
print("Response body:", response_body['data']['public_key'])
dh_manager.remote_public_key = dh_manager.decode_remote_public_key(response_body['data']['public_key'])
print('-'*10 + "Add trusted device result" + '-'*10)
print(dh_manager.dh_params)
print(dh_manager.host_public_key)
print(dh_manager.host_private_key)
print(dh_manager.remote_public_key)
print('-'*30)
dh_manager.shared_key = dh_manager.generate_shared_key(
dh_manager.host_private_key,
dh_manager.remote_public_key
)

View file

@ -0,0 +1,2 @@
SMC_LICENSE_KEY = "6087bee1-85b6-416e-8dce-cf5609ecc77f"
NDR_LICENSE_KEY = "7eea457f-5069-452d-b623-122bfe22b75e"

18
ndr/connection/decoder.py Normal file
View file

@ -0,0 +1,18 @@
import base64
# Закодированная строка
encoded_string = "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQ0pEQ0NBUmNHQ1NxR1NJYjNEUUVEQVRDQ0FRZ0NnZ0VCQU52bmxsWklOOTFZWXRZY1gxdmxvNG5hanZHVQp5R20wQ0srTlNLODNtM2R2TEVoM0xRMFRxSTJ1YjVqT2pxWmgyOFlGMDZMSEtQQkpJQ2xGWXNFbFk0SHI5R1FRCm8zb2dqVFJ2dmExUHFkS2d5UnNQK3JpZ2lHdmJRNHZZNm1ubGU2UWtFcGJCSnBOSXV6ZmhRWU1PM0xwT2kvbSsKamttOW1jU1FYYVhaYU5CcjVsMERuZ2c4YkFtd1Fzb1gyM2xvV2VwSDF1NmlMQzlrV0VFdTV1VDdJMWhFOTdNaApuRTRDTzRzY01LSXNFT2hyanQ3U3ZGdmxobWFta1dQQ2VOUlBIWlFwdGk2QXlSWkcyUmNNbWd5NlI3dklaQU9YClBJNml5aTZ2ayttSStWczNBQTROekY0RU5RZDlmdjJvNEdaNGt3UWJSNHV3RktndG9waWx4NmNubkhjQ0FRSUQKZ2dFRkFBS0NBUUFSdWp1UGZKTGdlQmR5UVM2K0d2RmhkUFZuMlBJZjhQR2FUWnZSeFpjQWtBbHliVjlldjljeAozenlUaVNsT2xhbU03a09kUzFYNWt3LzVRenJTalEwaVVsMUNOTWVxY3BZOHNKT0tobFNDOFlIMEF4QjY3UmcwCkRZWThQejEzYkY4elV5UGNudUFEdDNUNHVETFBYekd2ZUdwYW54a3BldUtlZ1dva0VRYWJQV21LcmkzTkNTYVAKZDREUkF1bVE1VE5KNXRxMXdTSHlUbzUvSXU1RkZGWWpqVSt6WTVTYVdsZHBwVmNnQURQRFVqOFlzczdBeEVaaQp6UlIvZWdmc1ZoL25pZTRrMTRUMjFTNzB1aDJSam8zNlUwZ0J1aFVLV2RXZTVGL1ZSTWJxaXc1NW5MNXRLYzRyCjdHSzBCQUtuVm1GQmQ5dDMvTUJyTnhxN1A5bjJFYkhpCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo="
# Декодирование строки
decoded_bytes = base64.b64decode(encoded_string)
print(decoded_bytes)
decoded_string = decoded_bytes.decode("utf-8")
# Вывод результата
print(decoded_string)
f = open("dhpubB.pem", "w")
f.write(decoded_string)
f.close()

154
ndr/connection/dh_tests.py Normal file
View file

@ -0,0 +1,154 @@
import subprocess
import tempfile
import base64
import os
class DiffieHellmanConsoleManager():
"""Class for managing diffie-hellman crypto operations"""
host_private_key = None
host_public_key = None
remote_public_key = None
shared_key = None
dh_params = None
def generate_dh_params(self) -> str:
"""Method for generating Diffie-Hellman (DH) parameters"""
# Generating DH parameters
dhparam_command = ['openssl', 'dhparam', '2048']
# Capturing result of generator command to string
completed_process = subprocess.run(dhparam_command, check=True, capture_output=True, text=True)
dhparam_output = completed_process.stdout
# Returning DH parameters
return dhparam_output
def generate_host_private_key(self, dh_params: str) -> str:
"""Method for generating console private key for further usage in DH algorithms
Args:
dh_params (str): DH paramters, that are generated earlier
Returns:
str: console private key
"""
# Creating temporary file with DH params
with tempfile.NamedTemporaryFile(mode='w', delete=False) as temp_file:
temp_file.write(dh_params)
temp_filename = temp_file.name
# Generating console private key
generate_private_console_key_command = ['openssl', 'genpkey', '-paramfile', temp_filename]
# Capturing result of generator command to string
generator_command_invoker = subprocess.run(generate_private_console_key_command,
check=True,
capture_output=True,
text=True)
command_result_output = generator_command_invoker.stdout
# Closing and deleting temporary file
temp_file.close()
# Returning console private key
return command_result_output
def generate_host_public_key(self, host_private_key: str) -> str:
"""Method for generating console public key
Args:
host_private_key (str): console private key, that is used to create public key
Returns:
str: Console public key
"""
# Creating temporary file with console private key
with tempfile.NamedTemporaryFile(mode='w', delete=False) as temp_file:
temp_file.write(host_private_key)
temp_filename = temp_file.name
# Generating console public key
generate_private_console_key_command = ['openssl', 'pkey', '-in', temp_filename, '-pubout']
# Capturing result of generator command to string
generator_command_invoker = subprocess.run(generate_private_console_key_command,
check=True,
capture_output=True,
text=True)
command_result_output = generator_command_invoker.stdout
# Closing and deleting temporary file
temp_file.close()
# Returning console private key
return command_result_output
def decode_remote_public_key(self, encoded_public_key: str) -> str:
"""Method for decoding publice key, received from remote
Args:
encoded_public_key (str): encoded remote public key
Returns:
str: decoded remote public key
"""
# TODO: Add exception handler if key could not be decoded
decoded_public_key = base64.b64decode(encoded_public_key).decode('utf-8')
return decoded_public_key
def generate_shared_key(self, host_private_key: str, remote_public_key: str) -> str:
"""Method for creation shared key, that will be used to encrypt data between host and remote
Args:
host_private_key (str): console private key
remote_public_key (str): remote public key
Returns:
str: shared key for encryption
"""
# Creating temporary file with console private key
with tempfile.NamedTemporaryFile(mode='w', delete=False) as host_private_key_file:
host_private_key_file.write(host_private_key)
host_private_key_filename = host_private_key_file.name
# Creating temportaty file with remote public key
with tempfile.NamedTemporaryFile(mode='w', delete=False) as remote_public_key_file:
remote_public_key_file.write(remote_public_key)
remote_public_key_filename = remote_public_key_file.name
command = [
"openssl", "pkeyutl", "-derive", "-inkey", host_private_key_filename,
'-peerkey', remote_public_key_filename, "-out", "secretSharedClass.bin"
]
subprocess.run(
command,
check=True,
)
# command_result_output = generator_command_invoker.stdout
file_name = "secretSharedClass.bin" # Specify the name of the file you want to delete
with open(file_name, "rb") as shared_file:
shared_secret = shared_file.read().hex()
self.shared_key = shared_secret
if os.path.exists(file_name):
os.remove(file_name)
print(f"File '{file_name}' deleted successfully.")
else:
print(f"File '{file_name}' does not exist.")
# Closing and deleting temporary files
host_private_key_file.close()
remote_public_key_file.close()
print("|"*60)
print(self.shared_key)
print("|"*60)
return self.shared_key

14
ndr/connection/dhkeyA.pem Normal file
View file

@ -0,0 +1,14 @@
-----BEGIN PRIVATE KEY-----
MIICJgIBADCCARcGCSqGSIb3DQEDATCCAQgCggEBANHsh3vTs6z/NFlvkX2enUrV
OdUoCr5ovgVqVh1+euL1jai+Bm+iTvIWtyzbTkdk/o5j/0z4NuYVWGM0DQnQcPft
zGYL6YQu+FDopRa4W5+V0xkszpMiGkjXCA+vQuu5yil7ydLyFU+WqRmkhPLIOFea
UuMKPmYPeZ/9D//t3yBIn08C9W/v1vo+57Uz8V1iwHgDduXSnmRjAFi0gs99rQGA
RK8wx+9OydG/SX9+CowuWY1BGPnMgZvhLQqhH7cA7AlOtw2WIrldNRpsVke+Fwx7
BEkZCDMJqpNHZl08iD6g4/HSj5/d+NDdrlTcEitfMcwU+SdDZ5/0k1G8l9HLMU8C
AQIEggEEAoIBAECVEhtMoDotoZRyFzN4LQ7zmZM77lSYY+DvR6Z/rb8woNTOAUb4
ZaGebTfbdok4e2nE+trjacL6brYui6siWRZUouWCZzPfoBnPexNtnI3k8WNwF7SW
BoPP34lpXZZFOWix0B6UhXOpYC+OB/6/ntlP+bhuEOh7LD7iCoepvqc+LLFewnaL
rtQaNwvdP5nPF2AojmDkRI4Ngp/2+7w1trvDTP9DckomIPeTJmfAFmGSlAXNiPBV
6MsBo0kJrJF3HXJfeYkUt/jp3C7RkVU3kcwLBTUJsbo6sh8GtzdWV+SEJWEJvSLv
YrWKoOw2FANtV0A50D6HcDe7xjQN5tl3lns=
-----END PRIVATE KEY-----

8
ndr/connection/dhp.pem Normal file
View file

@ -0,0 +1,8 @@
-----BEGIN DH PARAMETERS-----
MIIBCAKCAQEA0eyHe9OzrP80WW+RfZ6dStU51SgKvmi+BWpWHX564vWNqL4Gb6JO
8ha3LNtOR2T+jmP/TPg25hVYYzQNCdBw9+3MZgvphC74UOilFrhbn5XTGSzOkyIa
SNcID69C67nKKXvJ0vIVT5apGaSE8sg4V5pS4wo+Zg95n/0P/+3fIEifTwL1b+/W
+j7ntTPxXWLAeAN25dKeZGMAWLSCz32tAYBErzDH707J0b9Jf34KjC5ZjUEY+cyB
m+EtCqEftwDsCU63DZYiuV01GmxWR74XDHsESRkIMwmqk0dmXTyIPqDj8dKPn934
0N2uVNwSK18xzBT5J0Nnn/STUbyX0csxTwIBAg==
-----END DH PARAMETERS-----

14
ndr/connection/dhpubA.pem Normal file
View file

@ -0,0 +1,14 @@
-----BEGIN PUBLIC KEY-----
MIICJDCCARcGCSqGSIb3DQEDATCCAQgCggEBANHsh3vTs6z/NFlvkX2enUrVOdUo
Cr5ovgVqVh1+euL1jai+Bm+iTvIWtyzbTkdk/o5j/0z4NuYVWGM0DQnQcPftzGYL
6YQu+FDopRa4W5+V0xkszpMiGkjXCA+vQuu5yil7ydLyFU+WqRmkhPLIOFeaUuMK
PmYPeZ/9D//t3yBIn08C9W/v1vo+57Uz8V1iwHgDduXSnmRjAFi0gs99rQGARK8w
x+9OydG/SX9+CowuWY1BGPnMgZvhLQqhH7cA7AlOtw2WIrldNRpsVke+Fwx7BEkZ
CDMJqpNHZl08iD6g4/HSj5/d+NDdrlTcEitfMcwU+SdDZ5/0k1G8l9HLMU8CAQID
ggEFAAKCAQBAlRQiFuaZIt+3yCgX0b8mogYd6fQkYpweQ0oFrQzIRTn0fv8gTLqV
20wjC6NDOQEe/OtckifXfkr75aC5G0reRu09DQf9RZermRnrcIi1UiZ0BIgoIqoI
kcU0PslI6shopR0cnVYXQ1ol6qJBNEo3Fl4GATiacjvTobGY9Vu9Plwsll/D6BgC
ro6oR5o9mxz8dLPMwtryTrd/qbYTz9mRuquhO+WEvy4cvIroTuCXKZfCEUdxBvk8
/nnKlVfoemo3XTVrOLy5o8sCeTOY29K8tdxfMijUWL4llFRTQCxESOoKZyWDpXN1
g7AGXAVzQ0TGA21kkvyI5D3zilMBgMrp
-----END PUBLIC KEY-----

14
ndr/connection/dhpubB.pem Normal file
View file

@ -0,0 +1,14 @@
-----BEGIN PUBLIC KEY-----
MIICJDCCARcGCSqGSIb3DQEDATCCAQgCggEBANvnllZIN91YYtYcX1vlo4najvGU
yGm0CK+NSK83m3dvLEh3LQ0TqI2ub5jOjqZh28YF06LHKPBJIClFYsElY4Hr9GQQ
o3ogjTRvva1PqdKgyRsP+rigiGvbQ4vY6mnle6QkEpbBJpNIuzfhQYMO3LpOi/m+
jkm9mcSQXaXZaNBr5l0Dngg8bAmwQsoX23loWepH1u6iLC9kWEEu5uT7I1hE97Mh
nE4CO4scMKIsEOhrjt7SvFvlhmamkWPCeNRPHZQpti6AyRZG2RcMmgy6R7vIZAOX
PI6iyi6vk+mI+Vs3AA4NzF4ENQd9fv2o4GZ4kwQbR4uwFKgtopilx6cnnHcCAQID
ggEFAAKCAQARujuPfJLgeBdyQS6+GvFhdPVn2PIf8PGaTZvRxZcAkAlybV9ev9cx
3zyTiSlOlamM7kOdS1X5kw/5QzrSjQ0iUl1CNMeqcpY8sJOKhlSC8YH0AxB67Rg0
DYY8Pz13bF8zUyPcnuADt3T4uDLPXzGveGpanxkpeuKegWokEQabPWmKri3NCSaP
d4DRAumQ5TNJ5tq1wSHyTo5/Iu5FFFYjjU+zY5SaWldppVcgADPDUj8Yss7AxEZi
zRR/egfsVh/nie4k14T21S70uh2Rjo36U0gBuhUKWdWe5F/VRMbqiw55nL5tKc4r
7GK0BAKnVmFBd9t3/MBrNxq7P9n2EbHi
-----END PUBLIC KEY-----

View file

@ -0,0 +1,103 @@
import requests
import base64
import hashlib
from Cryptodome.Cipher import AES
from Cryptodome.Util.Padding import pad
from constants import SMC_LICENSE_KEY, NDR_LICENSE_KEY
USER_NAME = "root"
USER_ROLE = "admin"
FRONT_IP = "192.168.0.1"
# Функция считывания общего ключа
def shared_key_reader():
# Считываем общий секрет
with open("secretShared.bin", "rb") as shared_file:
# Считываем содержимое файла и преобразуем его в шестнадцатиричное представление с помощью
# функции hex()
shared_secret = shared_file.read().hex()
return shared_secret
SHARED_KEY = shared_key_reader()
# Константы для запроса
# Authorization-key
# Данные, которе требуется зашифровать
# data = (SMC_LICENSE_KEY + NDR_LICENSE_KEY).encode("utf-8")
# POSTMAN
pre_data = base64.b64encode((SMC_LICENSE_KEY + NDR_LICENSE_KEY).encode('utf-8'))
# Преобразуем SHARED_KEY в байтовую строку с использованием кодировки UTF-8
key = SHARED_KEY
# Создаем инвертированный закодированный ключ
encoded_reversed_key = key[::-1].encode("utf-8")
# Вычисление вектора инициализации следующим образом:
# Берется hash-сумма MD5 от инвертированного общего ключа
# C помощью функции hexdigest() получаем строкове представление хэш суммы в виде 16ричных чисел
# Обрезаем полученое строковое представление до 16 символов
# Кодируем получившуюся строку в UTF-8
iv = hashlib.md5(encoded_reversed_key).hexdigest()[:16].encode('utf-8')
# Вычисляем хэш-сумму MD5 и представляем ее в 16ричном виде, а затем кодируем в UTF-8
key_hash = hashlib.md5(key.encode('utf-8')).hexdigest()
# Создаем объект cipher от класса AES с использованием ключа key, режима AES.MODE_CBS
# (Cipher Block Chaining) и вектора инициализации iv
cipher = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv)
# Получаем шифр путем:
# С помощью функции pad() данные data дополняются до размера блока AES и шифруются объектом cipher
encrypted = cipher.encrypt(pad(pre_data, AES.block_size))
# Полученное преобразуем в base64
encrypted_base64_authorization_key = base64.b64encode(encrypted).decode('utf-8')
authorization_key_header_data = "x-ndr-key " + encrypted_base64_authorization_key
# Authorization user
user_data = base64.b64encode(USER_NAME.encode('utf-8'))
cipher_user = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv)
encrypted_user = cipher_user.encrypt(pad(user_data, AES.block_size))
encrypted_base64_authorization_user = base64.b64encode(encrypted_user).decode('utf-8')
authorization_user_header_data = "x-ndr-user " + encrypted_base64_authorization_user
# Authorization role
user_role_data = base64.b64encode(USER_ROLE.encode('utf-8'))
cipher_role = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv)
encrypted_user_role = cipher_role.encrypt(pad(user_role_data, AES.block_size))
encrypted_base64_authorization_role = base64.b64encode(encrypted_user_role).decode('utf-8')
authorization_role_header_data = "x-ndr-role " + encrypted_base64_authorization_role
# Authorization ip
ip_data = base64.b64encode(FRONT_IP.encode('utf-8'))
cipher_ip = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv)
encrypted_ip = cipher_ip.encrypt(pad(ip_data, AES.block_size))
encrypted_base64_authorization_ip = base64.b64encode(encrypted_ip).decode('utf-8')
authorization_ip_header_data = "x-ndr-ip " + encrypted_base64_authorization_ip
# print("\n\n\n")
# print("key = " + encrypted_base64_authorization_key)
# print("user = " + encrypted_base64_authorization_user)
# print("role = " + encrypted_base64_authorization_role)
# print("ip = " + encrypted_base64_authorization_ip)
# print("\n\n\n")
# Запрос
request_url = "https://192.168.56.10:8000/api/v1/auth/session/login"
headers = {
"Authorization-key": authorization_key_header_data,
"Authorization-user": authorization_user_header_data,
"Authorization-role": authorization_role_header_data,
"Authorization-ip": authorization_ip_header_data,
}
response = requests.post(request_url, headers=headers, verify=False)

View file

40
ndr/notes.md Normal file
View file

@ -0,0 +1,40 @@
# Вопросы
Правильно ли я понимаю, что команды:
openssl dhparam -out dhp.pem 2048
openssl genpkey -paramfile dhp.pem -out dhkeyA.pem
openssl pkey -in dhkeyA.pem -pubout -out dhpubA.pem
Работают следующим образом:
1. Генерируем параметры Диффи-Хеллмана и записываем их в файл `dhp.pem`. Параметры используются для обмена ключами между клиентом и сервером при использовании протокола TLS/SSL. Длина ключа = 2048 битам;
2. Генерируем закрытый ключ DH и записываем его в файл `dhkeyA.pem`;
3. Извлекаем открытый ключ DH из закрытого ключа и записываем его в файл `dhpubA.pem`.
Затем в запрос уже кладем ключ из файла `dhpubA.pem`?
# Заметки
## Пример корректного ответа на регистрацию нового устройства
```json
{
"public_key": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQ0pEQ0NBUmNHQ1NxR1NJYjNEUUVEQVRDQ0FRZ0NnZ0VCQU52bmxsWklOOTFZWXRZY1gxdmxvNG5hanZHVQp5R20wQ0srTlNLODNtM2R2TEVoM0xRMFRxSTJ1YjVqT2pxWmgyOFlGMDZMSEtQQkpJQ2xGWXNFbFk0SHI5R1FRCm8zb2dqVFJ2dmExUHFkS2d5UnNQK3JpZ2lHdmJRNHZZNm1ubGU2UWtFcGJCSnBOSXV6ZmhRWU1PM0xwT2kvbSsKamttOW1jU1FYYVhaYU5CcjVsMERuZ2c4YkFtd1Fzb1gyM2xvV2VwSDF1NmlMQzlrV0VFdTV1VDdJMWhFOTdNaApuRTRDTzRzY01LSXNFT2hyanQ3U3ZGdmxobWFta1dQQ2VOUlBIWlFwdGk2QXlSWkcyUmNNbWd5NlI3dklaQU9YClBJNml5aTZ2ayttSStWczNBQTROekY0RU5RZDlmdjJvNEdaNGt3UWJSNHV3RktndG9waWx4NmNubkhjQ0FRSUQKZ2dFRkFBS0NBUUFSdWp1UGZKTGdlQmR5UVM2K0d2RmhkUFZuMlBJZjhQR2FUWnZSeFpjQWtBbHliVjlldjljeAozenlUaVNsT2xhbU03a09kUzFYNWt3LzVRenJTalEwaVVsMUNOTWVxY3BZOHNKT0tobFNDOFlIMEF4QjY3UmcwCkRZWThQejEzYkY4elV5UGNudUFEdDNUNHVETFBYekd2ZUdwYW54a3BldUtlZ1dva0VRYWJQV21LcmkzTkNTYVAKZDREUkF1bVE1VE5KNXRxMXdTSHlUbzUvSXU1RkZGWWpqVSt6WTVTYVdsZHBwVmNnQURQRFVqOFlzczdBeEVaaQp6UlIvZWdmc1ZoL25pZTRrMTRUMjFTNzB1aDJSam8zNlUwZ0J1aFVLV2RXZTVGL1ZSTWJxaXc1NW5MNXRLYzRyCjdHSzBCQUtuVm1GQmQ5dDMvTUJyTnhxN1A5bjJFYkhpCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=",
"shared_key": "d8750acfb7f535c62b05a1b7e0fd19fa800bea21dc6647827f47b753edad4edb06f4953ce92448045c696bd836e8c0fbd8b13732dedff0daf1aeb7072e58325cf0c9819c28b619ca215819c37a76ebc750d97747c0ba59cc981854012f07149f92904e222059dbc0f8b6b3bbf1091c9c9526e768ddd404ecaad88bb6ca0793b3e989022d1d799d02a43efb8e7ce3b51dd19bff0e833575c317080bd72d74a466b5107641a0408d1524a2bbcee94b0018ebbdd3c3720f32909430b26bc5d07402d3821010e9b78bfeb2cb7c60d41afc4e753d02bf468bca0817bd050471586b1d36f7d532081d45ee28747ad64c764fec9a94d135c51f8732ba3f4ac8179ae030"
}
```
## dhpubB.pem
Данный ключ формируется из <тут будет ответ на вопрос из confluence>
## Пример ответа, если токен протух
```json
{
"request_id": "92cc3d29147930a6d3ba-0000",
"name": "yii\web\UnauthorizedHttpException",
"message": "Token is expired!",
"data": {},
"status": 401,
"type": "yii\web\UnauthorizedHttpException"
}
```

View file

@ -0,0 +1,129 @@
# Общие поля
* `type`
* `required` - по дефолту `false`
* `primary_key` - только одно поле в объекте имеет статус `true`, остальные по дефолту `false`
# Primary key
```json
"if": {
"primaryKey": true,
"type": "range",
"multiple": false,
"range": {
"em2": "em2 (aa:bb:cc:dd:ff:aa)",
"em3": "em3 (aa:bb:cc:dd:ff:aa)"
},
"allowCustomValue": false
},
```
# Bool
```json
"enable": {
"type": "bool"
},
```
# Regexp
```json
"descr": {
"type": "regexp",
"pattern": "/^[A-Za-z]{1}[A-Za-z0-9_]{2,15}$/",
"not": false
},
```
# Range
## Not required
```json
"type": {
"type": "range",
"multiple": false,
"range": {
"none": "None",
"staticv4": "Static IPv4",
"dhcp": "DHCP"
},
"allowCustomValue": false
},
```
## Required
```json
"gateway": {
"required": true,
"type": "range",
"multiple": false,
"range": {
"none": "Auto-detect"
},
"allowCustomValue": false
},
```
# Number
## Not required
```json
"mtu": {
"type": "number",
"allowArray": false,
"integerOnly": false,
"min": 576,
"max": 65535
},
```
## Required
```json
"subnet": {
"required": true,
"type": "number",
"allowArray": false,
"integerOnly": false,
"min": 1,
"max": 32
},
```
# IP
## Required
```json
"ipaddr": {
"required": true,
"type": "ip",
"networks": false,
"ipv6": false,
"ipv4": true,
"subnet": false,
"expandIPv6": false
},
```
## Not required
```json
"alias_address": {
"type": "ip",
"networks": false,
"ipv6": false,
"ipv4": true,
"subnet": false,
"expandIPv6": false
},
```
# Unknown
```json
"system_name": {
"required": true
},
```
```json
"spoofmac": {
"type": "mac"
},
```
```json
"dhcphostname": {
"type": "hostname"
},
```
# Вопросы
1. Что означает `integer_only` в option'ах `number`? То что можно отослать число с плавающей точкой?

24
ndr/shared_key_creator.py Normal file
View file

@ -0,0 +1,24 @@
import base64
import subprocess
# Открываем закрытый ключ DH
with open("dhkeyA.pem", "rb") as key_file:
key_data = key_file.read()
# Открываем открытый ключ DH
with open("dhpubB.pem", "rb") as peerkey_file:
peerkey_data = peerkey_file.read()
pkeyutl_command = ["openssl", "pkeyutl", "-derive", "-inkey", "dhkeyA.pem", "-peerkey", "dhpubB.pem", "-out", "secretShared.bin"]
subprocess.run(pkeyutl_command, input=key_data, check=True)
def shared_key_reader():
# Считываем общий секрет
with open("secretShared.bin", "rb") as shared_file:
shared_secret = shared_file.read().hex()
return shared_secret
print(shared_key_reader())

0
none_val/__init__.py Normal file
View file

26
none_val/playground.py Normal file
View file

@ -0,0 +1,26 @@
class Test:
def __init__(self, val) -> None:
self.val = val
def p(self):
print(self.val)
print(type(self.val))
print(str(self.val))
print(f"Hello from {self.val}")
t = Test(val=None)
t.p()
class TestTwo:
def __init__(self, val) -> None:
if not isinstance(val, int):
raise OSError
self.val = val
def p(self):
print(self.val)
print(type(self.val))
t_two = TestTwo(val=True)
t_two.p()

920
poetry.lock generated Normal file
View file

@ -0,0 +1,920 @@
# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand.
[[package]]
name = "bcrypt"
version = "4.1.3"
description = "Modern password hashing for your software and your servers"
category = "main"
optional = false
python-versions = ">=3.7"
files = [
{file = "bcrypt-4.1.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:48429c83292b57bf4af6ab75809f8f4daf52aa5d480632e53707805cc1ce9b74"},
{file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a8bea4c152b91fd8319fef4c6a790da5c07840421c2b785084989bf8bbb7455"},
{file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d3b317050a9a711a5c7214bf04e28333cf528e0ed0ec9a4e55ba628d0f07c1a"},
{file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:094fd31e08c2b102a14880ee5b3d09913ecf334cd604af27e1013c76831f7b05"},
{file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4fb253d65da30d9269e0a6f4b0de32bd657a0208a6f4e43d3e645774fb5457f3"},
{file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:193bb49eeeb9c1e2db9ba65d09dc6384edd5608d9d672b4125e9320af9153a15"},
{file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:8cbb119267068c2581ae38790e0d1fbae65d0725247a930fc9900c285d95725d"},
{file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6cac78a8d42f9d120b3987f82252bdbeb7e6e900a5e1ba37f6be6fe4e3848286"},
{file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:01746eb2c4299dd0ae1670234bf77704f581dd72cc180f444bfe74eb80495b64"},
{file = "bcrypt-4.1.3-cp37-abi3-win32.whl", hash = "sha256:037c5bf7c196a63dcce75545c8874610c600809d5d82c305dd327cd4969995bf"},
{file = "bcrypt-4.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:8a893d192dfb7c8e883c4576813bf18bb9d59e2cfd88b68b725990f033f1b978"},
{file = "bcrypt-4.1.3-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0d4cf6ef1525f79255ef048b3489602868c47aea61f375377f0d00514fe4a78c"},
{file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5698ce5292a4e4b9e5861f7e53b1d89242ad39d54c3da451a93cac17b61921a"},
{file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec3c2e1ca3e5c4b9edb94290b356d082b721f3f50758bce7cce11d8a7c89ce84"},
{file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3a5be252fef513363fe281bafc596c31b552cf81d04c5085bc5dac29670faa08"},
{file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5f7cd3399fbc4ec290378b541b0cf3d4398e4737a65d0f938c7c0f9d5e686611"},
{file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:c4c8d9b3e97209dd7111bf726e79f638ad9224b4691d1c7cfefa571a09b1b2d6"},
{file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:31adb9cbb8737a581a843e13df22ffb7c84638342de3708a98d5c986770f2834"},
{file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:551b320396e1d05e49cc18dd77d970accd52b322441628aca04801bbd1d52a73"},
{file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6717543d2c110a155e6821ce5670c1f512f602eabb77dba95717ca76af79867d"},
{file = "bcrypt-4.1.3-cp39-abi3-win32.whl", hash = "sha256:6004f5229b50f8493c49232b8e75726b568535fd300e5039e255d919fc3a07f2"},
{file = "bcrypt-4.1.3-cp39-abi3-win_amd64.whl", hash = "sha256:2505b54afb074627111b5a8dc9b6ae69d0f01fea65c2fcaea403448c503d3991"},
{file = "bcrypt-4.1.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:cb9c707c10bddaf9e5ba7cdb769f3e889e60b7d4fea22834b261f51ca2b89fed"},
{file = "bcrypt-4.1.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9f8ea645eb94fb6e7bea0cf4ba121c07a3a182ac52876493870033141aa687bc"},
{file = "bcrypt-4.1.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f44a97780677e7ac0ca393bd7982b19dbbd8d7228c1afe10b128fd9550eef5f1"},
{file = "bcrypt-4.1.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d84702adb8f2798d813b17d8187d27076cca3cd52fe3686bb07a9083930ce650"},
{file = "bcrypt-4.1.3.tar.gz", hash = "sha256:2ee15dd749f5952fe3f0430d0ff6b74082e159c50332a1413d51b5689cf06623"},
]
[package.extras]
tests = ["pytest (>=3.2.1,!=3.3.0)"]
typecheck = ["mypy"]
[[package]]
name = "certifi"
version = "2023.5.7"
description = "Python package for providing Mozilla's CA Bundle."
category = "main"
optional = false
python-versions = ">=3.6"
files = [
{file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"},
{file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"},
]
[[package]]
name = "cffi"
version = "1.16.0"
description = "Foreign Function Interface for Python calling C code."
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"},
{file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"},
{file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"},
{file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"},
{file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"},
{file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"},
{file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"},
{file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"},
{file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"},
{file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"},
{file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"},
{file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"},
{file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"},
{file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"},
{file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"},
{file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"},
{file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"},
{file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"},
{file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"},
{file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"},
{file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"},
{file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"},
{file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"},
{file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"},
{file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"},
{file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"},
{file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"},
{file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"},
{file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"},
{file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"},
{file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"},
{file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"},
{file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"},
{file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"},
{file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"},
{file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"},
{file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"},
{file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"},
{file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"},
{file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"},
{file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"},
{file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"},
{file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"},
{file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"},
{file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"},
{file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"},
{file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"},
{file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"},
{file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"},
{file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"},
{file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"},
{file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"},
]
[package.dependencies]
pycparser = "*"
[[package]]
name = "charset-normalizer"
version = "3.1.0"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
category = "main"
optional = false
python-versions = ">=3.7.0"
files = [
{file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"},
{file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"},
{file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"},
{file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"},
{file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"},
{file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"},
{file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"},
{file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"},
{file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"},
{file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"},
{file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"},
{file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"},
{file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"},
{file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"},
{file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"},
{file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"},
{file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"},
{file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"},
{file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"},
{file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"},
{file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"},
{file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"},
{file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"},
{file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"},
{file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"},
{file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"},
{file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"},
{file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"},
{file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"},
{file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"},
{file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"},
{file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"},
{file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"},
{file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"},
{file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"},
{file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"},
{file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"},
{file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"},
{file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"},
{file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"},
{file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"},
{file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"},
{file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"},
{file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"},
{file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"},
{file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"},
{file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"},
{file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"},
{file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"},
{file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"},
{file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"},
{file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"},
{file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"},
{file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"},
{file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"},
{file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"},
{file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"},
{file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"},
{file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"},
{file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"},
{file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"},
{file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"},
{file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"},
{file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"},
{file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"},
{file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"},
{file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"},
{file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"},
{file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"},
{file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"},
{file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"},
{file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"},
{file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"},
{file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"},
{file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"},
]
[[package]]
name = "cryptography"
version = "42.0.8"
description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
category = "main"
optional = false
python-versions = ">=3.7"
files = [
{file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"},
{file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"},
{file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"},
{file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"},
{file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"},
{file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"},
{file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"},
{file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"},
{file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"},
{file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"},
{file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"},
{file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"},
{file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"},
{file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"},
{file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"},
{file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"},
{file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"},
{file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"},
{file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"},
{file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"},
{file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"},
{file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"},
{file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"},
{file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"},
{file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"},
{file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"},
{file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"},
{file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"},
{file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"},
{file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"},
{file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"},
{file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"},
]
[package.dependencies]
cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""}
[package.extras]
docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"]
docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"]
nox = ["nox"]
pep8test = ["check-sdist", "click", "mypy", "ruff"]
sdist = ["build"]
ssh = ["bcrypt (>=3.1.5)"]
test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"]
test-randomorder = ["pytest-randomly"]
[[package]]
name = "decorator"
version = "5.1.1"
description = "Decorators for Humans"
category = "main"
optional = false
python-versions = ">=3.5"
files = [
{file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"},
{file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"},
]
[[package]]
name = "future"
version = "0.18.3"
description = "Clean single-source support for Python 3 and 2"
category = "main"
optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
files = [
{file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"},
]
[[package]]
name = "greenlet"
version = "2.0.2"
description = "Lightweight in-process concurrent programming"
category = "main"
optional = false
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
files = [
{file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"},
{file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"},
{file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"},
{file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"},
{file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"},
{file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"},
{file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"},
{file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"},
{file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"},
{file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"},
{file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"},
{file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"},
{file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"},
{file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"},
{file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"},
{file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"},
{file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"},
{file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"},
{file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"},
{file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"},
{file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"},
{file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"},
{file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"},
{file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"},
{file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"},
{file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"},
{file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"},
{file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"},
{file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"},
{file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"},
{file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"},
{file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"},
{file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"},
{file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"},
{file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"},
{file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"},
{file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"},
{file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"},
{file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"},
{file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"},
{file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"},
{file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"},
{file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"},
{file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"},
{file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"},
{file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"},
{file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"},
{file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"},
{file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"},
{file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"},
{file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"},
{file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"},
{file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"},
{file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"},
{file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"},
{file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"},
{file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"},
{file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"},
{file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"},
{file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"},
]
[package.extras]
docs = ["Sphinx", "docutils (<0.18)"]
test = ["objgraph", "psutil"]
[[package]]
name = "gssapi"
version = "1.8.2"
description = "Python GSSAPI Wrapper"
category = "main"
optional = false
python-versions = ">=3.7"
files = [
{file = "gssapi-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c14cf97d61073d8211abfded77066af791356868022acda10224a8212639cf5"},
{file = "gssapi-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a36bc089036196aa03c3c312ea1639677065b3d7e8f37edbba731f61f5e56dd6"},
{file = "gssapi-1.8.2-cp310-cp310-win32.whl", hash = "sha256:cdd6bff2cf7f3a5a5a24cddde137b6e117fe53aad81f240dee2e8e383c0b289b"},
{file = "gssapi-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:f75b094913a1757e5e634b70b03e808cab0eb02c802ec50b760636b23b0aa50c"},
{file = "gssapi-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:47d69b1fd3bd0764d7a14500c6cbd8fd08198ee6e1737048a01ad7024d57f67d"},
{file = "gssapi-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67c85758a6b40042509c96bb00d0873a501491453ad5b0da88dbfa9343c8ffea"},
{file = "gssapi-1.8.2-cp311-cp311-win32.whl", hash = "sha256:4aaed04439aed8eba525ea44dd7219ecd97d520254320e66ac53d9ae4acb8fe5"},
{file = "gssapi-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8b4c1c664635153b0055a08bf30ec1552c8aa064a76f565d7905057500f334b3"},
{file = "gssapi-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:02e0a8f35e1f5b1c0eada646e3da1af3022c25e8df26ded3fd18ee78abb155ea"},
{file = "gssapi-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:84bfd1b3954a5a608302884a36586eed6f623f6f38fcd331ad55937eca1ea89f"},
{file = "gssapi-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:85e7e623dfe51fef3f613acb965c4fa1866e7a7ee2c2558cbe2f203798171510"},
{file = "gssapi-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:512a2bd98e8003f48d98908bf54d1ed94c5388764e0a09fdc24cc691422a4162"},
{file = "gssapi-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:13aba9a947994f5f5f1fb6f425b397a359b191cee2983fa33911cf5e212d6cfb"},
{file = "gssapi-1.8.2-cp38-cp38-win32.whl", hash = "sha256:43c8b1acb8efa1f881ff7f7e912ccdc611689484190b7cc83f538b44f8992cbd"},
{file = "gssapi-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:787262e0db124d302c972d30e6f4b7c81423e696d08ee6e07047194a9bce2664"},
{file = "gssapi-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d6be1d8e07cc151e217f8a0ccf7c28ca5a1bb0ae00c8512586642c9f876a7298"},
{file = "gssapi-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75763c49b3e18da60e160d76e8ac9a27b0bbd637c6e88513150fbb7158ae15d7"},
{file = "gssapi-1.8.2-cp39-cp39-win32.whl", hash = "sha256:dcd2be270bf490b6007eb3734795aaeddf92848f79b69d6a23f6204ccaa9b6c7"},
{file = "gssapi-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:fac7d1f4b14383bd29d3996cf5f6f23d0dc50ffd7965d2bc35bcc0849da24152"},
{file = "gssapi-1.8.2.tar.gz", hash = "sha256:b78e0a021cc91158660e4c5cc9263e07c719346c35a9c0f66725e914b235c89a"},
]
[package.dependencies]
decorator = "*"
[[package]]
name = "idna"
version = "3.4"
description = "Internationalized Domain Names in Applications (IDNA)"
category = "main"
optional = false
python-versions = ">=3.5"
files = [
{file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"},
{file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
]
[[package]]
name = "netmiko"
version = "4.3.0"
description = "Multi-vendor library to simplify legacy CLI connections to network devices"
category = "main"
optional = false
python-versions = ">=3.8,<4.0"
files = [
{file = "netmiko-4.3.0-py3-none-any.whl", hash = "sha256:a873b186e0b61be4a2100eda51e996d917ceddce195b734346b686757e61d324"},
{file = "netmiko-4.3.0.tar.gz", hash = "sha256:da90f6efdf33b4140eb6cd7f2272773c2ce144fa74ac34d5ecac1b4d4607f1fb"},
]
[package.dependencies]
ntc-templates = ">=2.0.0"
paramiko = ">=2.9.5"
pyserial = ">=3.3"
pyyaml = ">=5.3"
scp = ">=0.13.6"
textfsm = ">=1.1.3"
[[package]]
name = "ntc-templates"
version = "5.1.0"
description = "TextFSM Templates for Network Devices, and Python wrapper for TextFSM's CliTable."
category = "main"
optional = false
python-versions = "<4.0,>=3.8"
files = [
{file = "ntc_templates-5.1.0-py3-none-any.whl", hash = "sha256:8784bbf790a814789910c04148ee84726183228f173a118b80e0c7420290b4dd"},
{file = "ntc_templates-5.1.0.tar.gz", hash = "sha256:820583f35a8d7411c86b70635a6acd65ce357b8bc19e1f408ce836eac30a6371"},
]
[package.dependencies]
textfsm = ">=1.1.0,<2.0.0"
[[package]]
name = "paramiko"
version = "3.4.0"
description = "SSH2 protocol library"
category = "main"
optional = false
python-versions = ">=3.6"
files = [
{file = "paramiko-3.4.0-py3-none-any.whl", hash = "sha256:43f0b51115a896f9c00f59618023484cb3a14b98bbceab43394a39c6739b7ee7"},
{file = "paramiko-3.4.0.tar.gz", hash = "sha256:aac08f26a31dc4dffd92821527d1682d99d52f9ef6851968114a8728f3c274d3"},
]
[package.dependencies]
bcrypt = ">=3.2"
cryptography = ">=3.3"
pynacl = ">=1.5"
[package.extras]
all = ["gssapi (>=1.4.1)", "invoke (>=2.0)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"]
gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"]
invoke = ["invoke (>=2.0)"]
[[package]]
name = "psycopg2-binary"
version = "2.9.7"
description = "psycopg2 - Python-PostgreSQL Database Adapter"
category = "main"
optional = false
python-versions = ">=3.6"
files = [
{file = "psycopg2-binary-2.9.7.tar.gz", hash = "sha256:1b918f64a51ffe19cd2e230b3240ba481330ce1d4b7875ae67305bd1d37b041c"},
{file = "psycopg2_binary-2.9.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ea5f8ee87f1eddc818fc04649d952c526db4426d26bab16efbe5a0c52b27d6ab"},
{file = "psycopg2_binary-2.9.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2993ccb2b7e80844d534e55e0f12534c2871952f78e0da33c35e648bf002bbff"},
{file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbbc3c5d15ed76b0d9db7753c0db40899136ecfe97d50cbde918f630c5eb857a"},
{file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:692df8763b71d42eb8343f54091368f6f6c9cfc56dc391858cdb3c3ef1e3e584"},
{file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dcfd5d37e027ec393a303cc0a216be564b96c80ba532f3d1e0d2b5e5e4b1e6e"},
{file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17cc17a70dfb295a240db7f65b6d8153c3d81efb145d76da1e4a096e9c5c0e63"},
{file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e5666632ba2b0d9757b38fc17337d84bdf932d38563c5234f5f8c54fd01349c9"},
{file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7db7b9b701974c96a88997d458b38ccb110eba8f805d4b4f74944aac48639b42"},
{file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c82986635a16fb1fa15cd5436035c88bc65c3d5ced1cfaac7f357ee9e9deddd4"},
{file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4fe13712357d802080cfccbf8c6266a3121dc0e27e2144819029095ccf708372"},
{file = "psycopg2_binary-2.9.7-cp310-cp310-win32.whl", hash = "sha256:122641b7fab18ef76b18860dd0c772290566b6fb30cc08e923ad73d17461dc63"},
{file = "psycopg2_binary-2.9.7-cp310-cp310-win_amd64.whl", hash = "sha256:f8651cf1f144f9ee0fa7d1a1df61a9184ab72962531ca99f077bbdcba3947c58"},
{file = "psycopg2_binary-2.9.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4ecc15666f16f97709106d87284c136cdc82647e1c3f8392a672616aed3c7151"},
{file = "psycopg2_binary-2.9.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fbb1184c7e9d28d67671992970718c05af5f77fc88e26fd7136613c4ece1f89"},
{file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7968fd20bd550431837656872c19575b687f3f6f98120046228e451e4064df"},
{file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:094af2e77a1976efd4956a031028774b827029729725e136514aae3cdf49b87b"},
{file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26484e913d472ecb6b45937ea55ce29c57c662066d222fb0fbdc1fab457f18c5"},
{file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f309b77a7c716e6ed9891b9b42953c3ff7d533dc548c1e33fddc73d2f5e21f9"},
{file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6d92e139ca388ccfe8c04aacc163756e55ba4c623c6ba13d5d1595ed97523e4b"},
{file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2df562bb2e4e00ee064779902d721223cfa9f8f58e7e52318c97d139cf7f012d"},
{file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4eec5d36dbcfc076caab61a2114c12094c0b7027d57e9e4387b634e8ab36fd44"},
{file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1011eeb0c51e5b9ea1016f0f45fa23aca63966a4c0afcf0340ccabe85a9f65bd"},
{file = "psycopg2_binary-2.9.7-cp311-cp311-win32.whl", hash = "sha256:ded8e15f7550db9e75c60b3d9fcbc7737fea258a0f10032cdb7edc26c2a671fd"},
{file = "psycopg2_binary-2.9.7-cp311-cp311-win_amd64.whl", hash = "sha256:8a136c8aaf6615653450817a7abe0fc01e4ea720ae41dfb2823eccae4b9062a3"},
{file = "psycopg2_binary-2.9.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2dec5a75a3a5d42b120e88e6ed3e3b37b46459202bb8e36cd67591b6e5feebc1"},
{file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc10da7e7df3380426521e8c1ed975d22df678639da2ed0ec3244c3dc2ab54c8"},
{file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee919b676da28f78f91b464fb3e12238bd7474483352a59c8a16c39dfc59f0c5"},
{file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb1c0e682138f9067a58fc3c9a9bf1c83d8e08cfbee380d858e63196466d5c86"},
{file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00d8db270afb76f48a499f7bb8fa70297e66da67288471ca873db88382850bf4"},
{file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b0c2b466b2f4d89ccc33784c4ebb1627989bd84a39b79092e560e937a11d4ac"},
{file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:51d1b42d44f4ffb93188f9b39e6d1c82aa758fdb8d9de65e1ddfe7a7d250d7ad"},
{file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:11abdbfc6f7f7dea4a524b5f4117369b0d757725798f1593796be6ece20266cb"},
{file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f02f4a72cc3ab2565c6d9720f0343cb840fb2dc01a2e9ecb8bc58ccf95dc5c06"},
{file = "psycopg2_binary-2.9.7-cp37-cp37m-win32.whl", hash = "sha256:81d5dd2dd9ab78d31a451e357315f201d976c131ca7d43870a0e8063b6b7a1ec"},
{file = "psycopg2_binary-2.9.7-cp37-cp37m-win_amd64.whl", hash = "sha256:62cb6de84d7767164a87ca97e22e5e0a134856ebcb08f21b621c6125baf61f16"},
{file = "psycopg2_binary-2.9.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:59f7e9109a59dfa31efa022e94a244736ae401526682de504e87bd11ce870c22"},
{file = "psycopg2_binary-2.9.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:95a7a747bdc3b010bb6a980f053233e7610276d55f3ca506afff4ad7749ab58a"},
{file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c721ee464e45ecf609ff8c0a555018764974114f671815a0a7152aedb9f3343"},
{file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4f37bbc6588d402980ffbd1f3338c871368fb4b1cfa091debe13c68bb3852b3"},
{file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac83ab05e25354dad798401babaa6daa9577462136ba215694865394840e31f8"},
{file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:024eaeb2a08c9a65cd5f94b31ace1ee3bb3f978cd4d079406aef85169ba01f08"},
{file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1c31c2606ac500dbd26381145684d87730a2fac9a62ebcfbaa2b119f8d6c19f4"},
{file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:42a62ef0e5abb55bf6ffb050eb2b0fcd767261fa3faf943a4267539168807522"},
{file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7952807f95c8eba6a8ccb14e00bf170bb700cafcec3924d565235dffc7dc4ae8"},
{file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e02bc4f2966475a7393bd0f098e1165d470d3fa816264054359ed4f10f6914ea"},
{file = "psycopg2_binary-2.9.7-cp38-cp38-win32.whl", hash = "sha256:fdca0511458d26cf39b827a663d7d87db6f32b93efc22442a742035728603d5f"},
{file = "psycopg2_binary-2.9.7-cp38-cp38-win_amd64.whl", hash = "sha256:d0b16e5bb0ab78583f0ed7ab16378a0f8a89a27256bb5560402749dbe8a164d7"},
{file = "psycopg2_binary-2.9.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6822c9c63308d650db201ba22fe6648bd6786ca6d14fdaf273b17e15608d0852"},
{file = "psycopg2_binary-2.9.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f94cb12150d57ea433e3e02aabd072205648e86f1d5a0a692d60242f7809b15"},
{file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5ee89587696d808c9a00876065d725d4ae606f5f7853b961cdbc348b0f7c9a1"},
{file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad5ec10b53cbb57e9a2e77b67e4e4368df56b54d6b00cc86398578f1c635f329"},
{file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:642df77484b2dcaf87d4237792246d8068653f9e0f5c025e2c692fc56b0dda70"},
{file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6a8b575ac45af1eaccbbcdcf710ab984fd50af048fe130672377f78aaff6fc1"},
{file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f955aa50d7d5220fcb6e38f69ea126eafecd812d96aeed5d5f3597f33fad43bb"},
{file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ad26d4eeaa0d722b25814cce97335ecf1b707630258f14ac4d2ed3d1d8415265"},
{file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ced63c054bdaf0298f62681d5dcae3afe60cbae332390bfb1acf0e23dcd25fc8"},
{file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2b04da24cbde33292ad34a40db9832a80ad12de26486ffeda883413c9e1b1d5e"},
{file = "psycopg2_binary-2.9.7-cp39-cp39-win32.whl", hash = "sha256:18f12632ab516c47c1ac4841a78fddea6508a8284c7cf0f292cb1a523f2e2379"},
{file = "psycopg2_binary-2.9.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb3b8d55924a6058a26db69fb1d3e7e32695ff8b491835ba9f479537e14dcf9f"},
]
[[package]]
name = "pyasn1"
version = "0.4.8"
description = "ASN.1 types and codecs"
category = "main"
optional = false
python-versions = "*"
files = [
{file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"},
{file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"},
]
[[package]]
name = "pyasn1-modules"
version = "0.2.8"
description = "A collection of ASN.1-based protocols modules."
category = "main"
optional = false
python-versions = "*"
files = [
{file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"},
{file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"},
]
[package.dependencies]
pyasn1 = ">=0.4.6,<0.5.0"
[[package]]
name = "pycparser"
version = "2.22"
description = "C parser in Python"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"},
{file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"},
]
[[package]]
name = "pycryptodomex"
version = "3.18.0"
description = "Cryptographic library for Python"
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
files = [
{file = "pycryptodomex-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6"},
{file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e"},
{file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8"},
{file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c"},
{file = "pycryptodomex-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5"},
{file = "pycryptodomex-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb"},
{file = "pycryptodomex-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37"},
{file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8"},
{file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35"},
{file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422"},
{file = "pycryptodomex-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88"},
{file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7"},
{file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c"},
{file = "pycryptodomex-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef"},
{file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2"},
{file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b"},
{file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74"},
{file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646"},
{file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb"},
{file = "pycryptodomex-3.18.0-cp35-abi3-win32.whl", hash = "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222"},
{file = "pycryptodomex-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278"},
{file = "pycryptodomex-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a"},
{file = "pycryptodomex-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d"},
{file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a"},
{file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419"},
{file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff"},
{file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194"},
{file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7"},
{file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f"},
{file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196"},
{file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470"},
{file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"},
]
[[package]]
name = "pynacl"
version = "1.5.0"
description = "Python binding to the Networking and Cryptography (NaCl) library"
category = "main"
optional = false
python-versions = ">=3.6"
files = [
{file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"},
{file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"},
{file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"},
{file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"},
{file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"},
{file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"},
{file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"},
{file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"},
{file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"},
{file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"},
]
[package.dependencies]
cffi = ">=1.4.1"
[package.extras]
docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"]
tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"]
[[package]]
name = "pyserial"
version = "3.5"
description = "Python Serial Port Extension"
category = "main"
optional = false
python-versions = "*"
files = [
{file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"},
{file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"},
]
[package.extras]
cp2110 = ["hidapi"]
[[package]]
name = "python-dotenv"
version = "1.0.0"
description = "Read key-value pairs from a .env file and set them as environment variables"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"},
{file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"},
]
[package.extras]
cli = ["click (>=5.0)"]
[[package]]
name = "python-ldap"
version = "3.4.3"
description = "Python modules for implementing LDAP clients"
category = "main"
optional = false
python-versions = ">=3.6"
files = [
{file = "python-ldap-3.4.3.tar.gz", hash = "sha256:ab26c519a0ef2a443a2a10391fa3c5cb52d7871323399db949ebfaa9f25ee2a0"},
]
[package.dependencies]
pyasn1 = ">=0.3.7"
pyasn1_modules = ">=0.1.5"
[[package]]
name = "pyyaml"
version = "6.0.1"
description = "YAML parser and emitter for Python"
category = "main"
optional = false
python-versions = ">=3.6"
files = [
{file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"},
{file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"},
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"},
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"},
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"},
{file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"},
{file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"},
{file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"},
{file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"},
{file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"},
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"},
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"},
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"},
{file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"},
{file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"},
{file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
{file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
{file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
{file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
{file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
{file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
{file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"},
{file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"},
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"},
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"},
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"},
{file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"},
{file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"},
{file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"},
{file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"},
{file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"},
{file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"},
{file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"},
{file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"},
{file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"},
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"},
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"},
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"},
{file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"},
{file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"},
{file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"},
{file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"},
{file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"},
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"},
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"},
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"},
{file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"},
{file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"},
{file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"},
{file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
]
[[package]]
name = "requests"
version = "2.30.0"
description = "Python HTTP for Humans."
category = "main"
optional = false
python-versions = ">=3.7"
files = [
{file = "requests-2.30.0-py3-none-any.whl", hash = "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294"},
{file = "requests-2.30.0.tar.gz", hash = "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4"},
]
[package.dependencies]
certifi = ">=2017.4.17"
charset-normalizer = ">=2,<4"
idna = ">=2.5,<4"
urllib3 = ">=1.21.1,<3"
[package.extras]
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
[[package]]
name = "scp"
version = "0.15.0"
description = "scp module for paramiko"
category = "main"
optional = false
python-versions = "*"
files = [
{file = "scp-0.15.0-py2.py3-none-any.whl", hash = "sha256:9e7f721e5ac563c33eb0831d0f949c6342f1c28c3bdc3b02f39d77b5ea20df7e"},
{file = "scp-0.15.0.tar.gz", hash = "sha256:f1b22e9932123ccf17eebf19e0953c6e9148f589f93d91b872941a696305c83f"},
]
[package.dependencies]
paramiko = "*"
[[package]]
name = "six"
version = "1.16.0"
description = "Python 2 and 3 compatibility utilities"
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
files = [
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
]
[[package]]
name = "sqlalchemy"
version = "2.0.20"
description = "Database Abstraction Library"
category = "main"
optional = false
python-versions = ">=3.7"
files = [
{file = "SQLAlchemy-2.0.20-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759b51346aa388c2e606ee206c0bc6f15a5299f6174d1e10cadbe4530d3c7a98"},
{file = "SQLAlchemy-2.0.20-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1506e988ebeaaf316f183da601f24eedd7452e163010ea63dbe52dc91c7fc70e"},
{file = "SQLAlchemy-2.0.20-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5768c268df78bacbde166b48be788b83dddaa2a5974b8810af422ddfe68a9bc8"},
{file = "SQLAlchemy-2.0.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3f0dd6d15b6dc8b28a838a5c48ced7455c3e1fb47b89da9c79cc2090b072a50"},
{file = "SQLAlchemy-2.0.20-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:243d0fb261f80a26774829bc2cee71df3222587ac789b7eaf6555c5b15651eed"},
{file = "SQLAlchemy-2.0.20-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6eb6d77c31e1bf4268b4d61b549c341cbff9842f8e115ba6904249c20cb78a61"},
{file = "SQLAlchemy-2.0.20-cp310-cp310-win32.whl", hash = "sha256:bcb04441f370cbe6e37c2b8d79e4af9e4789f626c595899d94abebe8b38f9a4d"},
{file = "SQLAlchemy-2.0.20-cp310-cp310-win_amd64.whl", hash = "sha256:d32b5ffef6c5bcb452723a496bad2d4c52b346240c59b3e6dba279f6dcc06c14"},
{file = "SQLAlchemy-2.0.20-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd81466bdbc82b060c3c110b2937ab65ace41dfa7b18681fdfad2f37f27acdd7"},
{file = "SQLAlchemy-2.0.20-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6fe7d61dc71119e21ddb0094ee994418c12f68c61b3d263ebaae50ea8399c4d4"},
{file = "SQLAlchemy-2.0.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4e571af672e1bb710b3cc1a9794b55bce1eae5aed41a608c0401885e3491179"},
{file = "SQLAlchemy-2.0.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3364b7066b3c7f4437dd345d47271f1251e0cfb0aba67e785343cdbdb0fff08c"},
{file = "SQLAlchemy-2.0.20-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1be86ccea0c965a1e8cd6ccf6884b924c319fcc85765f16c69f1ae7148eba64b"},
{file = "SQLAlchemy-2.0.20-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1d35d49a972649b5080557c603110620a86aa11db350d7a7cb0f0a3f611948a0"},
{file = "SQLAlchemy-2.0.20-cp311-cp311-win32.whl", hash = "sha256:27d554ef5d12501898d88d255c54eef8414576f34672e02fe96d75908993cf53"},
{file = "SQLAlchemy-2.0.20-cp311-cp311-win_amd64.whl", hash = "sha256:411e7f140200c02c4b953b3dbd08351c9f9818d2bd591b56d0fa0716bd014f1e"},
{file = "SQLAlchemy-2.0.20-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3c6aceebbc47db04f2d779db03afeaa2c73ea3f8dcd3987eb9efdb987ffa09a3"},
{file = "SQLAlchemy-2.0.20-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d3f175410a6db0ad96b10bfbb0a5530ecd4fcf1e2b5d83d968dd64791f810ed"},
{file = "SQLAlchemy-2.0.20-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8186be85da6587456c9ddc7bf480ebad1a0e6dcbad3967c4821233a4d4df57"},
{file = "SQLAlchemy-2.0.20-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c3d99ba99007dab8233f635c32b5cd24fb1df8d64e17bc7df136cedbea427897"},
{file = "SQLAlchemy-2.0.20-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:76fdfc0f6f5341987474ff48e7a66c3cd2b8a71ddda01fa82fedb180b961630a"},
{file = "SQLAlchemy-2.0.20-cp37-cp37m-win32.whl", hash = "sha256:d3793dcf5bc4d74ae1e9db15121250c2da476e1af8e45a1d9a52b1513a393459"},
{file = "SQLAlchemy-2.0.20-cp37-cp37m-win_amd64.whl", hash = "sha256:79fde625a0a55220d3624e64101ed68a059c1c1f126c74f08a42097a72ff66a9"},
{file = "SQLAlchemy-2.0.20-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:599ccd23a7146e126be1c7632d1d47847fa9f333104d03325c4e15440fc7d927"},
{file = "SQLAlchemy-2.0.20-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1a58052b5a93425f656675673ef1f7e005a3b72e3f2c91b8acca1b27ccadf5f4"},
{file = "SQLAlchemy-2.0.20-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79543f945be7a5ada9943d555cf9b1531cfea49241809dd1183701f94a748624"},
{file = "SQLAlchemy-2.0.20-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63e73da7fb030ae0a46a9ffbeef7e892f5def4baf8064786d040d45c1d6d1dc5"},
{file = "SQLAlchemy-2.0.20-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ce5e81b800a8afc870bb8e0a275d81957e16f8c4b62415a7b386f29a0cb9763"},
{file = "SQLAlchemy-2.0.20-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb0d3e94c2a84215532d9bcf10229476ffd3b08f481c53754113b794afb62d14"},
{file = "SQLAlchemy-2.0.20-cp38-cp38-win32.whl", hash = "sha256:8dd77fd6648b677d7742d2c3cc105a66e2681cc5e5fb247b88c7a7b78351cf74"},
{file = "SQLAlchemy-2.0.20-cp38-cp38-win_amd64.whl", hash = "sha256:6f8a934f9dfdf762c844e5164046a9cea25fabbc9ec865c023fe7f300f11ca4a"},
{file = "SQLAlchemy-2.0.20-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:26a3399eaf65e9ab2690c07bd5cf898b639e76903e0abad096cd609233ce5208"},
{file = "SQLAlchemy-2.0.20-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4cde2e1096cbb3e62002efdb7050113aa5f01718035ba9f29f9d89c3758e7e4e"},
{file = "SQLAlchemy-2.0.20-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b09ba72e4e6d341bb5bdd3564f1cea6095d4c3632e45dc69375a1dbe4e26ec"},
{file = "SQLAlchemy-2.0.20-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b74eeafaa11372627ce94e4dc88a6751b2b4d263015b3523e2b1e57291102f0"},
{file = "SQLAlchemy-2.0.20-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:77d37c1b4e64c926fa3de23e8244b964aab92963d0f74d98cbc0783a9e04f501"},
{file = "SQLAlchemy-2.0.20-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:eefebcc5c555803065128401a1e224a64607259b5eb907021bf9b175f315d2a6"},
{file = "SQLAlchemy-2.0.20-cp39-cp39-win32.whl", hash = "sha256:3423dc2a3b94125094897118b52bdf4d37daf142cbcf26d48af284b763ab90e9"},
{file = "SQLAlchemy-2.0.20-cp39-cp39-win_amd64.whl", hash = "sha256:5ed61e3463021763b853628aef8bc5d469fe12d95f82c74ef605049d810f3267"},
{file = "SQLAlchemy-2.0.20-py3-none-any.whl", hash = "sha256:63a368231c53c93e2b67d0c5556a9836fdcd383f7e3026a39602aad775b14acf"},
{file = "SQLAlchemy-2.0.20.tar.gz", hash = "sha256:ca8a5ff2aa7f3ade6c498aaafce25b1eaeabe4e42b73e25519183e4566a16fc6"},
]
[package.dependencies]
greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""}
typing-extensions = ">=4.2.0"
[package.extras]
aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"]
aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"]
asyncio = ["greenlet (!=0.4.17)"]
asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"]
mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"]
mssql = ["pyodbc"]
mssql-pymssql = ["pymssql"]
mssql-pyodbc = ["pyodbc"]
mypy = ["mypy (>=0.910)"]
mysql = ["mysqlclient (>=1.4.0)"]
mysql-connector = ["mysql-connector-python"]
oracle = ["cx-oracle (>=7)"]
oracle-oracledb = ["oracledb (>=1.0.1)"]
postgresql = ["psycopg2 (>=2.7)"]
postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"]
postgresql-pg8000 = ["pg8000 (>=1.29.1)"]
postgresql-psycopg = ["psycopg (>=3.0.7)"]
postgresql-psycopg2binary = ["psycopg2-binary"]
postgresql-psycopg2cffi = ["psycopg2cffi"]
postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"]
pymysql = ["pymysql"]
sqlcipher = ["sqlcipher3-binary"]
[[package]]
name = "textfsm"
version = "1.1.3"
description = "Python module for parsing semi-structured text into python tables."
category = "main"
optional = false
python-versions = "*"
files = [
{file = "textfsm-1.1.3-py2.py3-none-any.whl", hash = "sha256:dcbeebc6a6137bed561c71a56344d752e6dbc04ae5ea309252cb70fb97ccc9cd"},
{file = "textfsm-1.1.3.tar.gz", hash = "sha256:577ef278a9237f5341ae9b682947cefa4a2c1b24dbe486f94f2c95addc6504b5"},
]
[package.dependencies]
future = "*"
six = "*"
[[package]]
name = "typing-extensions"
version = "4.7.1"
description = "Backported and Experimental Type Hints for Python 3.7+"
category = "main"
optional = false
python-versions = ">=3.7"
files = [
{file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"},
{file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"},
]
[[package]]
name = "urllib3"
version = "2.0.2"
description = "HTTP library with thread-safe connection pooling, file post, and more."
category = "main"
optional = false
python-versions = ">=3.7"
files = [
{file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"},
{file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"},
]
[package.extras]
brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"]
socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
zstd = ["zstandard (>=0.18.0)"]
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
content-hash = "a2ec9d9ef582a657d66141c0675915f9ed7e3edab18296f73953f5c97004d02f"

31
pyproject.toml Normal file
View file

@ -0,0 +1,31 @@
[tool.poetry]
name = "t0xa-sanbox"
version = "0.1.0"
description = ""
authors = ["ashalimov <ashalimov@t1-consulting.ru>"]
readme = "README.md"
packages = [{include = "t0xa_sanbox"}]
[tool.poetry.dependencies]
python = "^3.10"
certifi = "2023.5.7"
charset-normalizer = "3.1.0"
decorator = "5.1.1"
gssapi = "1.8.2"
idna = "3.4"
pyasn1 = "0.4.8"
pyasn1-modules = "0.2.8"
python-ldap = "3.4.3"
requests = "2.30.0"
urllib3 = "2.0.2"
pycryptodomex = "^3.17"
sqlalchemy = "^2.0.20"
psycopg2-binary = "^2.9.7"
python-dotenv = "^1.0.0"
textfsm = "^1.1.3"
netmiko = "^4.3.0"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

4
pyrightconfig.json Normal file
View file

@ -0,0 +1,4 @@
{
"venv": ".venv",
"venvPath": "/home/pro100ton/Documents/development/sandbox"
}

64
regex/basic.py Normal file
View file

@ -0,0 +1,64 @@
import re
# Input text
input_text = """
object-group service service_group_proto_3
service-object object proto_3
object-group user DM_INLINE_USER_3
group-object user_group2
group-object test_user_group
object-group user DM_INLINE_USER_4
group-object user_group_all
user LOCAL\\ussss
object-group user DM_INLINE_USER_5
group-object test_user_group
group-object user_group2
object-group protocol nda
group-object TCPUDP
object-group service tcpudp tcp-udp
group-object tcpudp_serv_group1
object-group network DM_INLINE_NETWORK_1
group-object net_group3
network-object object tetetet
object-group protocol ip_proto_group
protocol-object ip
object-group protocol TTCCPPUUDDPP
protocol-object udp
protocol-object tcp
object-group protocol DM_INLINE_PROTOCOL_2
protocol-object icmp
protocol-object icmp6
object-group network U_NETWORK
network-object host 10.1.46.10
network-object host 12.16.10.61
network-object host 100.60.4.2
object-group network ds_group_2
network-object ::/1
network-object host fc::ee
network-object 1.2.3.0 255.255.255.0
network-object host 1.2.3.4
access-list OUTSIDE_access_in remark Test new description one
"""
def filter_necessary_data(text: str):
result = []
lines = text.splitlines()
i = 0
while i < len(lines):
if lines[i].startswith("object-group network"):
result.append(lines[i])
i += 1
while i < len(lines) and lines[i].startswith(" "):
result.append(lines[i])
i += 1
else:
i += 1
return result
print(filter_necessary_data(input_text))

BIN
secretShared.bin Normal file

Binary file not shown.

3375
services_groups.json Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,10 @@
<mxfile host="Electron" modified="2023-08-20T18:26:36.002Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.3.7 Chrome/112.0.5615.204 Electron/24.5.0 Safari/537.36" etag="VHBpQC06OYo-KDZxe-r2" version="21.3.7" type="device">
<diagram name="Page-1" id="9-c6SfMRSVphvga-snEZ">
<mxGraphModel dx="1114" dy="1155" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
</root>
</mxGraphModel>
</diagram>
</mxfile>

View file

View file

@ -0,0 +1,36 @@
import os
from typing import List, Optional
from dotenv import load_dotenv
from sqlalchemy import (Boolean, Column, ForeignKey, Integer, MetaData, String,
Table, create_engine, text, insert, select)
from sqlalchemy.orm import (DeclarativeBase, Mapped, Session, mapped_column,
relationship)
load_dotenv()
DB_PASS = os.getenv("DOCKER_POSTGRES_PASS")
# Create engine for connecting to postgres test db
DB_ENGINE = create_engine(
f'postgresql+psycopg2://postgres:{DB_PASS}@localhost:5432/postgres')
METADATA_OBJECT = MetaData()
# Declaring user table
CORE_USER_TABLE = Table(
"user_account",
METADATA_OBJECT,
Column("id", Integer, primary_key=True),
Column("name", String(30)),
Column("fullname", String),
)
# Declaring address table
CORE_ADDRESS_TABLE = Table(
"address",
METADATA_OBJECT,
Column("id", Integer, primary_key=True),
Column("user_id", ForeignKey("user_account.id"), nullable=False),
Column("email_address", String, nullable=False)
)

View file

@ -0,0 +1,51 @@
import os
from typing import List, Optional
from dotenv import load_dotenv
from sqlalchemy import ForeignKey, String, create_engine, Table
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship, Session
from sqlalchemy import MetaData
metadata_obj = MetaData()
load_dotenv()
DB_PASS = os.getenv("DOCKER_POSTGRES_PASS")
# Create engine for connecting to postgres test db
engine = create_engine(
f'postgresql+psycopg2://postgres:{DB_PASS}@localhost:5432/postgres')
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = "user_account"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(30))
fullname: Mapped[Optional[str]]
addresses: Mapped[List["Address"]] = relationship(back_populates="user")
def __repr__(self) -> str:
return f"User(id={self.id!r}, name={self.name!r}, fullname={self.fullname!r})"
class Address(Base):
__tablename__ = "address"
id: Mapped[int] = mapped_column(primary_key=True)
email_address: Mapped[str]
user_id = mapped_column(ForeignKey("user_account.id"))
user: Mapped[User] = relationship(back_populates="addresses")
def __repr__(self) -> str:
return f"Address(id={self.id!r}, email_address={self.email_address!r})"
# Base.metadata.create_all(engine)
# user_table = Table("user_account", metadata_obj, autoload_with=engine)
# address_table = Table("address", metadata_obj, autoload_with=engine)
# user_table
krabs = User(name="ehkrabs", fullname="Mister krabs")
session = Session(engine)
session.add(krabs)
print(session.new)
session.flush()

View file

@ -0,0 +1,25 @@
from sqlalchemy.orm import Session
from sqlalchemy import create_engine
from sqlalchemy_sandbox.training_core import User
# Create engine for connecting to postgres test db
engine = create_engine(
'postgresql+psycopg2://postgres:pgpwd4habr@localhost:5432/postgres')
engine.connect()
with Session(engine) as session:
toxa = User(
username="pro100ton",
first_name="Anton",
last_name="Shalimov",
is_coach = False
)
pan_stepan = User(
username="Panstepan",
first_name="Pan",
last_name="Stepan",
is_coach = True
)
session.add_all([toxa, pan_stepan])
session.commit()

View file

@ -0,0 +1,70 @@
import os
from typing import List, Optional
from dotenv import load_dotenv
from sqlalchemy import (Boolean, Column, ForeignKey, Integer, MetaData, String,
Table, create_engine, text, insert, select)
from sqlalchemy.orm import (DeclarativeBase, Mapped, Session, mapped_column,
relationship)
load_dotenv()
DB_PASS = os.getenv("DOCKER_POSTGRES_PASS")
# Create engine for connecting to postgres test db
engine = create_engine(
f'postgresql+psycopg2://postgres:{DB_PASS}@localhost:5432/postgres')
metadata_object = MetaData()
# Declaring user table
user_table = Table(
"user_account",
metadata_object,
Column("id", Integer, primary_key=True),
Column("name", String(30)),
Column("fullname", String),
)
# Declaring address table
address_table = Table(
"address",
metadata_object,
Column("id", Integer, primary_key=True),
Column("user_id", ForeignKey("user_account.id"), nullable=False),
Column("email_address", String, nullable=False)
)
# metadata_object.create_all(engine)
# stmt = insert(user_table).values(name="spongebob", fullname="Spongebob squarepants").returning(user_table.c.id, user_table.c.name)
# select_statement = select(user_table.c.id, user_table.c.name + "@google.com")
# insert_statement = insert(address_table).from_select(
# ["user_id", "email_address"], select_statement
# ).returning(address_table.c.id, address_table.c.email_address)
# with engine.connect() as conn:
# result = conn.execute(insert_statement)
# conn.commit()
# for row in result:
# print(row)
# with engine.connect() as conn:
# result = conn.execute(
# insert(user_table),
# [
# {"name": "sandy", "fullname": "Sandy Cheeks"},
# {"name": "patrick", "fullname": "Patrick Star"},
# ],
# )
# conn.commit()
# insert_stmt = insert(address_table).returning(
# address_table.c.id, address_table.c.email_address
# )
# print(insert_stmt)
# with engine.connect() as conn:
# result = conn.execute(stmt)
# conn.commit()
# print(result)

View file

@ -0,0 +1,100 @@
from alchemy_utils import CORE_ADDRESS_TABLE, CORE_USER_TABLE, DB_ENGINE
from declarative_orm import Address, User
from sqlalchemy import literal_column, select, text
from sqlalchemy.orm import Session
# stmt = select(CORE_USER_TABLE).where(CORE_USER_TABLE.c.name == "sandy")
# with DB_ENGINE.connect() as conn:
# for row in conn.execute(stmt):
# print(row)
# stmt = select(User).where(User.name=="sandy")
# with Session(DB_ENGINE) as session:
# for row in session.execute(statement=stmt):
# print(row)
# print(select(CORE_USER_TABLE.c.name, CORE_USER_TABLE.c.fullname))
# print(select(CORE_USER_TABLE.c["name", "fullname"]))
# print(select(User))
# with Session(DB_ENGINE) as session:
# row = session.execute(select(User)).first()
# print(row)
# rows = session.execute(select(User))
# print("-"*60)
# for row in rows:
# print(row)
# with Session(DB_ENGINE) as session:
# row = session.scalars(select(User)).first()
# print(row)
# rows = session.scalars(select(User))
# print("-"*60)
# for row in rows:
# print(row)
# with Session(DB_ENGINE) as session:
# row = session.execute(select(User.name, User.fullname))
# for r in row:
# print(r)
# with Session(DB_ENGINE) as session:
# result = session.execute(
# select(User.name, Address).where(User.id == Address.user_id).order_by(Address.id)
# ).all()
# print(result)
# stmt = select(
# ("Username: " + CORE_USER_TABLE.c.name).label("username")
# ).order_by(CORE_USER_TABLE.c.name)
# with DB_ENGINE.connect() as conn:
# for row in conn.execute(stmt):
# print(f"{row.username}")
# stmt = select(text("'some phrase'"), CORE_USER_TABLE.c.name).order_by(CORE_USER_TABLE.c.name)
# with DB_ENGINE.connect() as conn:
# print(conn.execute(stmt).all())
# stmt = select(literal_column("'some phrase'").label("p"), CORE_USER_TABLE.c.name).order_by(
# CORE_USER_TABLE.c.name
# )
# with DB_ENGINE.connect() as conn:
# for row in conn.execute(stmt):
# print(f"{row.p}, {row.name}")
# print(select(CORE_USER_TABLE).where(CORE_USER_TABLE.c.name=="patrick"))
# print(
# select(CORE_ADDRESS_TABLE.c.email_address)
# .where(CORE_USER_TABLE.c.name == "patrick")
# .where(CORE_ADDRESS_TABLE.c.user_id == CORE_USER_TABLE.c.id)
# )
# from sqlalchemy import and_, or_
# print(
# select(Address.email_address).where(
# and_(
# or_(User.name == "patrick", User.name == "sandy"),
# Address.user_id == User.id,
# )
# )
# )
# print(select(CORE_USER_TABLE.c.name))
# print(
# select(CORE_USER_TABLE.c.name, CORE_ADDRESS_TABLE.c.email_address).join_from(
# CORE_USER_TABLE, CORE_ADDRESS_TABLE
# )
# )
print(
select(CORE_ADDRESS_TABLE.c.email_address)
.select_from(CORE_USER_TABLE)
.join(CORE_ADDRESS_TABLE, CORE_USER_TABLE.c.id == CORE_ADDRESS_TABLE.c.user_id)
)

View file

@ -0,0 +1,20 @@
from typing import List, Optional
from dotenv import load_dotenv
from sqlalchemy import String, create_engine, Boolean, text
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship, Session
import os
load_dotenv()
DB_PASS = os.getenv("DOCKER_POSTGRES_PASS")
# Create engine for connecting to postgres test db
engine = create_engine(
f'postgresql+psycopg2://postgres:{DB_PASS}@localhost:5432/postgres')
stmt = text("SELECT x, y FROM some_table WHERE y > :y ORDER BY x, y")
with Session(engine) as session:
result = session.execute(stmt, {"y": 6})
for row in result:
print(f"x: {row.x} y: {row.y}")

View file

@ -0,0 +1,102 @@
<mxfile host="Electron" modified="2023-08-20T19:15:23.883Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.3.7 Chrome/112.0.5615.204 Electron/24.5.0 Safari/537.36" etag="0AgMfITTYZQliHUd80LE" version="21.3.7" type="device">
<diagram name="Page-1" id="9-c6SfMRSVphvga-snEZ">
<mxGraphModel dx="928" dy="963" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-1" value="User" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="40" y="80" width="140" height="156" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-2" value="+ id: int" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-1">
<mxGeometry y="26" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-3" value="+ username: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-1">
<mxGeometry y="52" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-4" value="+ first_name: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-1">
<mxGeometry y="78" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-5" value="+ second_name: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-1">
<mxGeometry y="104" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-6" value="+ is_coach: bool" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-1">
<mxGeometry y="130" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-7" value="Exercise" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="360" y="613" width="140" height="104" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-8" value="+ training: FK" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;fontStyle=2" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-7">
<mxGeometry y="26" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-15" value="+ training_equipment" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-7">
<mxGeometry y="52" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-32" value="+ muscle_group" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-7">
<mxGeometry y="78" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-13" value="&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;br&gt;&lt;b&gt;Exercise type&lt;/b&gt;" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;whiteSpace=wrap;" vertex="1" parent="1">
<mxGeometry x="450" y="280" width="140" height="70" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-14" value="literal1" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-13">
<mxGeometry y="40" width="140" height="30" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-17" value="Exercise approach" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="660" y="613" width="140" height="104" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-18" value="+ exercise: FK" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;fontStyle=2" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-17">
<mxGeometry y="26" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-19" value="+ reps: int" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-17">
<mxGeometry y="52" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-25" value="+ weight: float" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-17">
<mxGeometry y="78" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-22" value="" style="endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;" edge="1" parent="1" source="tmW_OTcV_v2Xw-86ZwJH-17" target="tmW_OTcV_v2Xw-86ZwJH-7">
<mxGeometry relative="1" as="geometry">
<mxPoint x="520" y="810" as="sourcePoint" />
<mxPoint x="680" y="810" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-23" value="0..n" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-22">
<mxGeometry x="-1" relative="1" as="geometry">
<mxPoint x="-30" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-24" value="1" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-22">
<mxGeometry x="1" relative="1" as="geometry">
<mxPoint x="20" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-26" value="Training" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="60" y="613" width="140" height="104" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-27" value="+ datetime: datetime" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-26">
<mxGeometry y="26" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-28" value="+ notes: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-26">
<mxGeometry y="52" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-33" value="+ coach: FK" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-26">
<mxGeometry y="78" width="140" height="26" as="geometry" />
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-29" value="" style="endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;" edge="1" parent="1" source="tmW_OTcV_v2Xw-86ZwJH-7" target="tmW_OTcV_v2Xw-86ZwJH-26">
<mxGeometry relative="1" as="geometry">
<mxPoint x="530" y="662" as="sourcePoint" />
<mxPoint x="410" y="662" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-30" value="0..n" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-29">
<mxGeometry x="-1" relative="1" as="geometry">
<mxPoint x="-30" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="tmW_OTcV_v2Xw-86ZwJH-31" value="1" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="tmW_OTcV_v2Xw-86ZwJH-29">
<mxGeometry x="1" relative="1" as="geometry">
<mxPoint x="20" as="offset" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View file

@ -0,0 +1,83 @@
from typing import List, Optional
from dotenv import load_dotenv
from sqlalchemy import String, create_engine, Boolean, text
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
import os
load_dotenv()
DB_PASS = os.getenv("DOCKER_POSTGRES_PASS")
# Create engine for connecting to postgres test db
engine = create_engine(
f'postgresql+psycopg2://postgres:{DB_PASS}@localhost:5432/postgres')
# engine.connect()
# class Base(DeclarativeBase):
# pass
# class User(Base):
# __tablename__ = "user_account"
# id: Mapped[int] = mapped_column(primary_key=True)
# username: Mapped[str] = mapped_column(String(30))
# first_name: Mapped[str] = mapped_column(String(50))
# last_name: Mapped[Optional[str]] = mapped_column(String(50))
# is_coach: Mapped[bool] = mapped_column(Boolean())
# def __repr__(self) -> str:
# return f"User(id={self.id!r}, name={self.name!r}, first_name={self.first_name!r}, is_coach={self.is_coach})"
# Base.metadata.create_all(engine)
# with engine.connect() as conn:
# result = conn.execute(text("select 'hello world'"))
# print(result.all())
# Commiting style one
# with engine.connect() as conn:
# conn.execute(text("CREATE TABLE some_table (x int, y int)"))
# conn.execute(
# text("INSERT INTO some_table (x,y) VALUES (:x, :y)"),
# [{"x": 1, "y": 1}, {"x": 2, "y": 4}]
# )
# conn.commit()
# Commiting style two
# with engine.begin() as conn:
# conn.execute(
# text("INSERT INTO some_table (x,y) VALUES (:x, :y)"),
# [{"x": 6, "y": 8}, {"x": 9, "y": 10}]
# )
# Managing Result object
# with engine.connect() as conn:
# result = conn.execute(text("SELECT x, y FROM some_table"))
# for row in result:
# print(f"x: {row.x} y: {row.y}")
# Sending parameters
# with engine.connect() as conn:
# result = conn.execute(text("SELECT x, y FROM some_table where y > :y"), {"y": 20})
# for row in result:
# print(f"x: {row.x} y: {row.y}")
# Sending multiple params
# with engine.connect() as conn:
# conn.execute(
# text("INSERT INTO some_table (x, y) VALUES (:x, :y)"),
# [{"x": 11, "y": 12}, {"x": 13, "y": 14}],
# )
# conn.commit()
with engine.connect() as conn:
conn.execute(
text("DROP TABLE some_table")
)
conn.commit()

Some files were not shown because too many files have changed in this diff Show more