agilicus 1.244.3__py3-none-any.whl → 1.246.0__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- agilicus/__init__.py +2 -1
- agilicus/agilicus_api/api/rules_api.py +6 -0
- agilicus/agilicus_api/api_client.py +1 -1
- agilicus/agilicus_api/configuration.py +1 -1
- agilicus/agilicus_api/docs/ListStandaloneRulesetBundlesResponse.md +2 -0
- agilicus/agilicus_api/docs/RulesApi.md +4 -1
- agilicus/agilicus_api/model/list_standalone_ruleset_bundles_response.py +24 -0
- agilicus/agilicus_api_README.md +1 -1
- agilicus/main.py +2 -0
- agilicus/policy/policies.py +97 -0
- agilicus/policy/policy_main.py +31 -0
- agilicus/policy/templates.py +194 -0
- agilicus/rules/rules.py +63 -22
- agilicus/rules/rules_main.py +9 -1
- {agilicus-1.244.3.dist-info → agilicus-1.246.0.dist-info}/METADATA +1 -1
- {agilicus-1.244.3.dist-info → agilicus-1.246.0.dist-info}/RECORD +19 -16
- {agilicus-1.244.3.dist-info → agilicus-1.246.0.dist-info}/LICENSE.txt +0 -0
- {agilicus-1.244.3.dist-info → agilicus-1.246.0.dist-info}/WHEEL +0 -0
- {agilicus-1.244.3.dist-info → agilicus-1.246.0.dist-info}/entry_points.txt +0 -0
agilicus/__init__.py
CHANGED
@@ -38,6 +38,7 @@ def create_or_update(
|
|
38
38
|
create_method: Callable,
|
39
39
|
update_method: Callable = None,
|
40
40
|
to_dict=True,
|
41
|
+
guid_finder=find_guid,
|
41
42
|
) -> [dict, str]:
|
42
43
|
"""A helper method that handles duplicate (409)
|
43
44
|
creation of objects. On 409, if the update_method is provided,
|
@@ -70,7 +71,7 @@ def create_or_update(
|
|
70
71
|
raise
|
71
72
|
result = json.loads(body)
|
72
73
|
if update_method:
|
73
|
-
guid =
|
74
|
+
guid = guid_finder(result)
|
74
75
|
if to_dict:
|
75
76
|
return update_method(guid, obj).to_dict(), 200
|
76
77
|
else:
|
@@ -2364,6 +2364,7 @@ class RulesApi(object):
|
|
2364
2364
|
org_id (str): Organisation Unique identifier. [optional]
|
2365
2365
|
label (str): Filters based on whether or not the items in the collection have the given label. . [optional]
|
2366
2366
|
get_rulesets (bool): When querying a bundle, return all rulesets associated with bundle . [optional]
|
2367
|
+
standalone_ruleset_bundles_etag (str): The entity tag (etag) for a list of bundles. If the returned etag matches the requested etag, then no data is returned, along with status code 304. . [optional]
|
2367
2368
|
_return_http_data_only (bool): response data without head status
|
2368
2369
|
code and headers. Default is True.
|
2369
2370
|
_preload_content (bool): if False, the urllib3.HTTPResponse object
|
@@ -2430,6 +2431,7 @@ class RulesApi(object):
|
|
2430
2431
|
'org_id',
|
2431
2432
|
'label',
|
2432
2433
|
'get_rulesets',
|
2434
|
+
'standalone_ruleset_bundles_etag',
|
2433
2435
|
],
|
2434
2436
|
'required': [],
|
2435
2437
|
'nullable': [
|
@@ -2463,6 +2465,8 @@ class RulesApi(object):
|
|
2463
2465
|
(str,),
|
2464
2466
|
'get_rulesets':
|
2465
2467
|
(bool,),
|
2468
|
+
'standalone_ruleset_bundles_etag':
|
2469
|
+
(str,),
|
2466
2470
|
},
|
2467
2471
|
'attribute_map': {
|
2468
2472
|
'limit': 'limit',
|
@@ -2471,6 +2475,7 @@ class RulesApi(object):
|
|
2471
2475
|
'org_id': 'org_id',
|
2472
2476
|
'label': 'label',
|
2473
2477
|
'get_rulesets': 'get_rulesets',
|
2478
|
+
'standalone_ruleset_bundles_etag': 'standalone_ruleset_bundles_etag',
|
2474
2479
|
},
|
2475
2480
|
'location_map': {
|
2476
2481
|
'limit': 'query',
|
@@ -2479,6 +2484,7 @@ class RulesApi(object):
|
|
2479
2484
|
'org_id': 'query',
|
2480
2485
|
'label': 'query',
|
2481
2486
|
'get_rulesets': 'query',
|
2487
|
+
'standalone_ruleset_bundles_etag': 'query',
|
2482
2488
|
},
|
2483
2489
|
'collection_format_map': {
|
2484
2490
|
}
|
@@ -77,7 +77,7 @@ class ApiClient(object):
|
|
77
77
|
self.default_headers[header_name] = header_value
|
78
78
|
self.cookie = cookie
|
79
79
|
# Set default User-Agent.
|
80
|
-
self.user_agent = 'OpenAPI-Generator/1.
|
80
|
+
self.user_agent = 'OpenAPI-Generator/1.246.0/python'
|
81
81
|
|
82
82
|
def __enter__(self):
|
83
83
|
return self
|
@@ -387,7 +387,7 @@ class Configuration(object):
|
|
387
387
|
"OS: {env}\n"\
|
388
388
|
"Python Version: {pyversion}\n"\
|
389
389
|
"Version of the API: 2024.03.19\n"\
|
390
|
-
"SDK Package Version: 1.
|
390
|
+
"SDK Package Version: 1.246.0".\
|
391
391
|
format(env=sys.platform, pyversion=sys.version)
|
392
392
|
|
393
393
|
def get_host_settings(self):
|
@@ -7,6 +7,8 @@ Name | Type | Description | Notes
|
|
7
7
|
------------ | ------------- | ------------- | -------------
|
8
8
|
**standalone_ruleset_bundles** | [**[StandaloneRulesetBundle]**](StandaloneRulesetBundle.md) | List of StandaloneRulesetBundle |
|
9
9
|
**limit** | **int** | Limit on the number of rows in the response |
|
10
|
+
**page_at_id** | **str** | The id to request in the pagination query to get the next page. | [optional]
|
11
|
+
**standalone_ruleset_bundles_etag** | **str** | The entity tag (etag) associated with standalone_ruleset_bundles. | [optional]
|
10
12
|
**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional]
|
11
13
|
|
12
14
|
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
@@ -2101,12 +2101,13 @@ with agilicus_api.ApiClient(configuration) as api_client:
|
|
2101
2101
|
org_id = "1234" # str | Organisation Unique identifier (optional)
|
2102
2102
|
label = "label-1" # str | Filters based on whether or not the items in the collection have the given label. (optional)
|
2103
2103
|
get_rulesets = True # bool | When querying a bundle, return all rulesets associated with bundle (optional)
|
2104
|
+
standalone_ruleset_bundles_etag = "asdflkjasf" # str | The entity tag (etag) for a list of bundles. If the returned etag matches the requested etag, then no data is returned, along with status code 304. (optional)
|
2104
2105
|
|
2105
2106
|
# example passing only required values which don't have defaults set
|
2106
2107
|
# and optional values
|
2107
2108
|
try:
|
2108
2109
|
# List all standalone ruleset bundles
|
2109
|
-
api_response = api_instance.list_standalone_ruleset_bundles(limit=limit, name=name, page_at_id=page_at_id, org_id=org_id, label=label, get_rulesets=get_rulesets)
|
2110
|
+
api_response = api_instance.list_standalone_ruleset_bundles(limit=limit, name=name, page_at_id=page_at_id, org_id=org_id, label=label, get_rulesets=get_rulesets, standalone_ruleset_bundles_etag=standalone_ruleset_bundles_etag)
|
2110
2111
|
pprint(api_response)
|
2111
2112
|
except agilicus_api.ApiException as e:
|
2112
2113
|
print("Exception when calling RulesApi->list_standalone_ruleset_bundles: %s\n" % e)
|
@@ -2123,6 +2124,7 @@ Name | Type | Description | Notes
|
|
2123
2124
|
**org_id** | **str**| Organisation Unique identifier | [optional]
|
2124
2125
|
**label** | **str**| Filters based on whether or not the items in the collection have the given label. | [optional]
|
2125
2126
|
**get_rulesets** | **bool**| When querying a bundle, return all rulesets associated with bundle | [optional]
|
2127
|
+
**standalone_ruleset_bundles_etag** | **str**| The entity tag (etag) for a list of bundles. If the returned etag matches the requested etag, then no data is returned, along with status code 304. | [optional]
|
2126
2128
|
|
2127
2129
|
### Return type
|
2128
2130
|
|
@@ -2142,6 +2144,7 @@ Name | Type | Description | Notes
|
|
2142
2144
|
| Status code | Description | Response headers |
|
2143
2145
|
|-------------|-------------|------------------|
|
2144
2146
|
**200** | Query succeeded | - |
|
2147
|
+
**304** | Response not modified | - |
|
2145
2148
|
|
2146
2149
|
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
2147
2150
|
|
@@ -81,6 +81,22 @@ class ListStandaloneRulesetBundlesResponse(ModelNormal):
|
|
81
81
|
def limit(self, new_value):
|
82
82
|
self.limit = new_value
|
83
83
|
|
84
|
+
@property
|
85
|
+
def page_at_id(self):
|
86
|
+
return self.get("page_at_id")
|
87
|
+
|
88
|
+
@page_at_id.setter
|
89
|
+
def page_at_id(self, new_value):
|
90
|
+
self.page_at_id = new_value
|
91
|
+
|
92
|
+
@property
|
93
|
+
def standalone_ruleset_bundles_etag(self):
|
94
|
+
return self.get("standalone_ruleset_bundles_etag")
|
95
|
+
|
96
|
+
@standalone_ruleset_bundles_etag.setter
|
97
|
+
def standalone_ruleset_bundles_etag(self, new_value):
|
98
|
+
self.standalone_ruleset_bundles_etag = new_value
|
99
|
+
|
84
100
|
@cached_property
|
85
101
|
def additional_properties_type():
|
86
102
|
"""
|
@@ -106,6 +122,8 @@ class ListStandaloneRulesetBundlesResponse(ModelNormal):
|
|
106
122
|
return {
|
107
123
|
'standalone_ruleset_bundles': ([StandaloneRulesetBundle],), # noqa: E501
|
108
124
|
'limit': (int,), # noqa: E501
|
125
|
+
'page_at_id': (str,), # noqa: E501
|
126
|
+
'standalone_ruleset_bundles_etag': (str,), # noqa: E501
|
109
127
|
}
|
110
128
|
|
111
129
|
@cached_property
|
@@ -117,6 +135,8 @@ class ListStandaloneRulesetBundlesResponse(ModelNormal):
|
|
117
135
|
attribute_map = {
|
118
136
|
'standalone_ruleset_bundles': 'standalone_ruleset_bundles', # noqa: E501
|
119
137
|
'limit': 'limit', # noqa: E501
|
138
|
+
'page_at_id': 'page_at_id', # noqa: E501
|
139
|
+
'standalone_ruleset_bundles_etag': 'standalone_ruleset_bundles_etag', # noqa: E501
|
120
140
|
}
|
121
141
|
|
122
142
|
read_only_vars = {
|
@@ -164,6 +184,8 @@ class ListStandaloneRulesetBundlesResponse(ModelNormal):
|
|
164
184
|
Animal class but this time we won't travel
|
165
185
|
through its discriminator because we passed in
|
166
186
|
_visited_composed_classes = (Animal,)
|
187
|
+
page_at_id (str): The id to request in the pagination query to get the next page.. [optional] # noqa: E501
|
188
|
+
standalone_ruleset_bundles_etag (str): The entity tag (etag) associated with standalone_ruleset_bundles.. [optional] # noqa: E501
|
167
189
|
"""
|
168
190
|
|
169
191
|
_check_type = kwargs.pop('_check_type', True)
|
@@ -254,6 +276,8 @@ class ListStandaloneRulesetBundlesResponse(ModelNormal):
|
|
254
276
|
Animal class but this time we won't travel
|
255
277
|
through its discriminator because we passed in
|
256
278
|
_visited_composed_classes = (Animal,)
|
279
|
+
page_at_id (str): The id to request in the pagination query to get the next page.. [optional] # noqa: E501
|
280
|
+
standalone_ruleset_bundles_etag (str): The entity tag (etag) associated with standalone_ruleset_bundles.. [optional] # noqa: E501
|
257
281
|
"""
|
258
282
|
|
259
283
|
_check_type = kwargs.pop('_check_type', True)
|
agilicus/agilicus_api_README.md
CHANGED
@@ -4,7 +4,7 @@ Agilicus is API-first. Modern software is controlled by other software, is open,
|
|
4
4
|
The `agilicus_api` package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
|
5
5
|
|
6
6
|
- API version: 2024.03.19
|
7
|
-
- Package version: 1.
|
7
|
+
- Package version: 1.246.0
|
8
8
|
- Build package: org.openapitools.codegen.languages.PythonClientCodegen
|
9
9
|
For more information, please visit [https://www.agilicus.com/api](https://www.agilicus.com/api)
|
10
10
|
|
agilicus/main.py
CHANGED
@@ -75,6 +75,7 @@ from .labels import labels_main
|
|
75
75
|
from .rules import rules_main
|
76
76
|
from .products import products_main
|
77
77
|
from .features import features_main
|
78
|
+
from .policy import policy_main
|
78
79
|
from .features.features import format_features
|
79
80
|
from .credentials_commands import credentials_main
|
80
81
|
from .files_pkg import files_main
|
@@ -7939,6 +7940,7 @@ def main():
|
|
7939
7940
|
hosts_main.add_commands(cli)
|
7940
7941
|
labels_main.add_commands(cli)
|
7941
7942
|
rules_main.add_commands(cli)
|
7943
|
+
policy_main.add_commands(cli)
|
7942
7944
|
products_main.add_commands(cli)
|
7943
7945
|
credentials_main.add_commands(cli)
|
7944
7946
|
features_main.add_commands(cli)
|
@@ -0,0 +1,97 @@
|
|
1
|
+
from ..input_helpers import (
|
2
|
+
get_org_from_input_or_ctx,
|
3
|
+
)
|
4
|
+
|
5
|
+
from .. import context
|
6
|
+
from ..rules.rules import (
|
7
|
+
add_list_resources_sdk,
|
8
|
+
list_rules,
|
9
|
+
list_rule_trees,
|
10
|
+
list_rulesets,
|
11
|
+
RuleAddInfo,
|
12
|
+
RulesetAddInfo,
|
13
|
+
RuleTreeAddInfo,
|
14
|
+
)
|
15
|
+
|
16
|
+
from ..output.table import (
|
17
|
+
format_table,
|
18
|
+
column,
|
19
|
+
)
|
20
|
+
|
21
|
+
from .templates import MultifactorTemplate, MFA_LABEL
|
22
|
+
|
23
|
+
|
24
|
+
class LabelAddInfo:
|
25
|
+
def __init__(self, apiclient):
|
26
|
+
super().__init__()
|
27
|
+
self.create_fn = lambda obj: apiclient.rules_api.create_ruleset_label(obj)
|
28
|
+
# Can't replace. Just return the object
|
29
|
+
self.replace_fn = lambda guid, obj: obj
|
30
|
+
self.name_getter = lambda obj: obj.spec.name
|
31
|
+
self.guid_finder = lambda obj_as_dict: obj_as_dict["spec"]["name"]
|
32
|
+
|
33
|
+
|
34
|
+
def set_multifactor_policy(ctx, name, duration, label=None, **kwargs):
|
35
|
+
org_id = get_org_from_input_or_ctx(ctx, **kwargs)
|
36
|
+
tmpl = MultifactorTemplate(name, duration, org_id=org_id, labels=label)
|
37
|
+
|
38
|
+
token = context.get_token(ctx)
|
39
|
+
apiclient = context.get_apiclient(ctx, token)
|
40
|
+
add_list_resources_sdk(
|
41
|
+
ctx,
|
42
|
+
tmpl.get_rules(),
|
43
|
+
RuleAddInfo(apiclient),
|
44
|
+
handle_failure=False,
|
45
|
+
)
|
46
|
+
add_list_resources_sdk(
|
47
|
+
ctx, tmpl.get_trees(), RuleTreeAddInfo(apiclient), handle_failure=False
|
48
|
+
)
|
49
|
+
add_list_resources_sdk(
|
50
|
+
ctx, tmpl.get_labels(), LabelAddInfo(apiclient), handle_failure=False
|
51
|
+
)
|
52
|
+
|
53
|
+
add_list_resources_sdk(
|
54
|
+
ctx, tmpl.get_sets(), RulesetAddInfo(apiclient), handle_failure=False
|
55
|
+
)
|
56
|
+
|
57
|
+
return tmpl
|
58
|
+
|
59
|
+
|
60
|
+
def ruleset_labelled(ruleset, label):
|
61
|
+
for ruleset_label in ruleset.spec.labels or []:
|
62
|
+
if str(ruleset_label) == label:
|
63
|
+
return True
|
64
|
+
return False
|
65
|
+
|
66
|
+
|
67
|
+
def list_multifactor_policies(ctx, **kwargs):
|
68
|
+
org_id = get_org_from_input_or_ctx(ctx, **kwargs)
|
69
|
+
rules = list_rules(ctx, org_id=org_id)
|
70
|
+
trees = list_rule_trees(ctx, org_id=org_id)
|
71
|
+
sets = list_rulesets(ctx, org_id=org_id)
|
72
|
+
|
73
|
+
names = []
|
74
|
+
for ruleset in sets:
|
75
|
+
if ruleset_labelled(ruleset, MFA_LABEL):
|
76
|
+
names.append(str(ruleset.spec.name))
|
77
|
+
|
78
|
+
templates = []
|
79
|
+
for name in names:
|
80
|
+
tmpl = MultifactorTemplate.from_api(
|
81
|
+
name=name, rules=rules, trees=trees, sets=sets, org_id=org_id
|
82
|
+
)
|
83
|
+
if tmpl:
|
84
|
+
templates.append(tmpl)
|
85
|
+
|
86
|
+
return templates
|
87
|
+
|
88
|
+
|
89
|
+
def format_multifactor_policies(ctx, templates):
|
90
|
+
columns = [
|
91
|
+
column("name"),
|
92
|
+
column("org_id"),
|
93
|
+
column("duration"),
|
94
|
+
column("labels"),
|
95
|
+
]
|
96
|
+
|
97
|
+
return format_table(ctx, templates, columns)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import click
|
2
|
+
|
3
|
+
from . import policies
|
4
|
+
from ..output.table import output_entry
|
5
|
+
|
6
|
+
|
7
|
+
@click.command(name="set-multifactor-policy")
|
8
|
+
@click.option("--name", required=True)
|
9
|
+
@click.option("--label", multiple=True, type=str)
|
10
|
+
@click.option("--duration", required=True, type=int)
|
11
|
+
@click.option("--org-id", default=None)
|
12
|
+
@click.pass_context
|
13
|
+
def cli_command_set_multifactor_policy(ctx, **kwargs):
|
14
|
+
output_entry(ctx, policies.set_multifactor_policy(ctx, **kwargs).to_dict())
|
15
|
+
|
16
|
+
|
17
|
+
@click.command(name="list-multifactor-policies")
|
18
|
+
@click.option("--org-id", default=None)
|
19
|
+
@click.pass_context
|
20
|
+
def cli_command_list_multifactor_policies(ctx, **kwargs):
|
21
|
+
results = policies.list_multifactor_policies(ctx, **kwargs)
|
22
|
+
print(policies.format_multifactor_policies(ctx, results))
|
23
|
+
|
24
|
+
|
25
|
+
all_funcs = [func for func in dir() if "cli_command_" in func]
|
26
|
+
|
27
|
+
|
28
|
+
def add_commands(cli):
|
29
|
+
glob = globals()
|
30
|
+
for func in all_funcs:
|
31
|
+
cli.add_command(glob[func])
|
@@ -0,0 +1,194 @@
|
|
1
|
+
import regex
|
2
|
+
|
3
|
+
from abc import abstractmethod
|
4
|
+
from typing import Optional
|
5
|
+
|
6
|
+
from agilicus import (
|
7
|
+
RuleAction,
|
8
|
+
RuleCondition,
|
9
|
+
RuleConfig,
|
10
|
+
MaxMFAProofRuleCondition,
|
11
|
+
StandaloneObjectConditions,
|
12
|
+
StandaloneRule,
|
13
|
+
StandaloneRuleName,
|
14
|
+
StandaloneRuleScope,
|
15
|
+
StandaloneRuleSpec,
|
16
|
+
StandaloneRuleTree,
|
17
|
+
StandaloneRuleTreeSpec,
|
18
|
+
StandaloneRuleTreeRef,
|
19
|
+
StandaloneRuleTreeRuleRef,
|
20
|
+
StandaloneRuleTreeNode,
|
21
|
+
StandaloneRuleset,
|
22
|
+
StandaloneRulesetLabelName,
|
23
|
+
StandaloneRulesetLabelSpec,
|
24
|
+
StandaloneRulesetLabel,
|
25
|
+
StandaloneRulesetSpec,
|
26
|
+
)
|
27
|
+
|
28
|
+
|
29
|
+
class PolicyTemplate:
|
30
|
+
@abstractmethod
|
31
|
+
def get_rules(self) -> list[StandaloneRule]:
|
32
|
+
pass
|
33
|
+
|
34
|
+
@abstractmethod
|
35
|
+
def get_trees(self) -> list[StandaloneRuleTree]:
|
36
|
+
pass
|
37
|
+
|
38
|
+
@abstractmethod
|
39
|
+
def get_sets(self) -> list[StandaloneRuleset]:
|
40
|
+
pass
|
41
|
+
|
42
|
+
@abstractmethod
|
43
|
+
def get_labels(self) -> list[StandaloneRulesetLabel]:
|
44
|
+
pass
|
45
|
+
|
46
|
+
|
47
|
+
def mfa_cond(max_seconds):
|
48
|
+
return MaxMFAProofRuleCondition(
|
49
|
+
condition_type="mfa_rule_condition", max_seconds=max_seconds
|
50
|
+
)
|
51
|
+
|
52
|
+
|
53
|
+
MFA_LABEL = "global-multifactor"
|
54
|
+
LABEL_REGEX = regex.compile(r"urn:agilicus:label:(?P<label>[a-zA-Z0-9\-\._:]+)")
|
55
|
+
|
56
|
+
|
57
|
+
def parse_label(scope):
|
58
|
+
match = LABEL_REGEX.match(str(scope))
|
59
|
+
if not match:
|
60
|
+
return None
|
61
|
+
return match.group("label")
|
62
|
+
|
63
|
+
|
64
|
+
def parse_labels(scopes):
|
65
|
+
result = []
|
66
|
+
for scope in scopes:
|
67
|
+
label = parse_label(scope)
|
68
|
+
if not label:
|
69
|
+
continue
|
70
|
+
result.append(label)
|
71
|
+
return result
|
72
|
+
|
73
|
+
|
74
|
+
class MultifactorTemplate(PolicyTemplate):
|
75
|
+
name_regex = regex.compile(r"agilicus-mfa-tmpl-(?P<name>[a-zA-Z0-9\-\._]+)")
|
76
|
+
|
77
|
+
def __init__(self, name, duration, org_id, labels: Optional[list[str]] = None):
|
78
|
+
self.name = name
|
79
|
+
self.duration = duration
|
80
|
+
self.labels = labels or []
|
81
|
+
self.org_id = org_id
|
82
|
+
|
83
|
+
def to_dict(self):
|
84
|
+
return {
|
85
|
+
"name": self.name,
|
86
|
+
"duration": self.duration,
|
87
|
+
"labels": self.labels,
|
88
|
+
"org_id": self.org_id,
|
89
|
+
}
|
90
|
+
|
91
|
+
@classmethod
|
92
|
+
def build_name(cls, name):
|
93
|
+
return f"agilicus-mfa-tmpl-{name}"
|
94
|
+
|
95
|
+
def get_name(self):
|
96
|
+
return self.build_name(self.name)
|
97
|
+
|
98
|
+
@classmethod
|
99
|
+
def parse_name(cls, name):
|
100
|
+
match = cls.name_regex.match(name)
|
101
|
+
if not match:
|
102
|
+
return None
|
103
|
+
return match.group("name")
|
104
|
+
|
105
|
+
def get_rules(self) -> list[StandaloneRule]:
|
106
|
+
cond = mfa_cond(self.duration)
|
107
|
+
action = RuleAction(action="mfa")
|
108
|
+
extended_condition = RuleCondition(negated=True, condition=cond)
|
109
|
+
spec = StandaloneRuleSpec(
|
110
|
+
rule=RuleConfig(
|
111
|
+
name=self.get_name(),
|
112
|
+
extended_condition=extended_condition,
|
113
|
+
actions=[action],
|
114
|
+
),
|
115
|
+
org_id=self.org_id,
|
116
|
+
)
|
117
|
+
|
118
|
+
rule = StandaloneRule(spec=spec)
|
119
|
+
return [rule]
|
120
|
+
|
121
|
+
def get_trees(self) -> list[StandaloneRuleTree]:
|
122
|
+
spec = StandaloneRuleTreeSpec(
|
123
|
+
tree=StandaloneRuleTreeNode(
|
124
|
+
rules=[
|
125
|
+
StandaloneRuleTreeRuleRef(
|
126
|
+
rule_name=StandaloneRuleName(self.get_name()),
|
127
|
+
)
|
128
|
+
],
|
129
|
+
children=[],
|
130
|
+
),
|
131
|
+
name=StandaloneRuleName(self.get_name()),
|
132
|
+
org_id=self.org_id,
|
133
|
+
object_conditions=StandaloneObjectConditions(),
|
134
|
+
# object_conditions=StandaloneObjectConditions(
|
135
|
+
# scopes=[StandaloneRuleScope("urn:agilicus:scope:any_resource_user")]
|
136
|
+
# )
|
137
|
+
)
|
138
|
+
|
139
|
+
return [StandaloneRuleTree(spec=spec)]
|
140
|
+
|
141
|
+
def get_sets(self) -> list[StandaloneRuleset]:
|
142
|
+
spec = StandaloneRulesetSpec(
|
143
|
+
rule_trees=[
|
144
|
+
StandaloneRuleTreeRef(
|
145
|
+
rule_tree_name=StandaloneRuleName(self.get_name()),
|
146
|
+
priority=0,
|
147
|
+
)
|
148
|
+
],
|
149
|
+
labels=[StandaloneRulesetLabelName(MFA_LABEL)],
|
150
|
+
name=StandaloneRuleName(self.get_name()),
|
151
|
+
org_id=self.org_id,
|
152
|
+
)
|
153
|
+
scopes = [
|
154
|
+
StandaloneRuleScope(f"urn:agilicus:label:{label}") for label in self.labels
|
155
|
+
]
|
156
|
+
if scopes:
|
157
|
+
object_conditions = StandaloneObjectConditions(scopes=scopes)
|
158
|
+
spec.object_conditions = object_conditions
|
159
|
+
|
160
|
+
return [StandaloneRuleset(spec=spec)]
|
161
|
+
|
162
|
+
def get_labels(self) -> list[StandaloneRulesetLabel]:
|
163
|
+
spec = StandaloneRulesetLabelSpec(
|
164
|
+
name=StandaloneRulesetLabelName(MFA_LABEL),
|
165
|
+
org_id=self.org_id,
|
166
|
+
)
|
167
|
+
|
168
|
+
return [
|
169
|
+
StandaloneRulesetLabel(spec=spec),
|
170
|
+
]
|
171
|
+
|
172
|
+
@classmethod
|
173
|
+
def from_api(cls, name, rules, org_id, trees, sets):
|
174
|
+
found_sets = list(filter(lambda s: str(s.spec.name) == name, sets))
|
175
|
+
found_trees = list(filter(lambda s: str(s.spec.name) == name, trees))
|
176
|
+
found_rules = list(filter(lambda s: str(s.spec.rule.name) == name, rules))
|
177
|
+
|
178
|
+
if len(found_sets) == 0 or len(found_rules) == 0 or len(found_trees) == 0:
|
179
|
+
return None
|
180
|
+
|
181
|
+
# There should be only one, given that names are unique.
|
182
|
+
ruleset = found_sets[0]
|
183
|
+
labels = []
|
184
|
+
if ruleset.spec.object_conditions:
|
185
|
+
labels = parse_labels(ruleset.spec.object_conditions.scopes)
|
186
|
+
rule = found_rules[0]
|
187
|
+
try:
|
188
|
+
duration = rule.spec.rule.extended_condition.condition.max_seconds
|
189
|
+
except Exception:
|
190
|
+
return None
|
191
|
+
|
192
|
+
return MultifactorTemplate(
|
193
|
+
name=cls.parse_name(name), duration=duration, labels=labels, org_id=org_id
|
194
|
+
)
|
agilicus/rules/rules.py
CHANGED
@@ -18,7 +18,7 @@ from ..output.table import (
|
|
18
18
|
column,
|
19
19
|
)
|
20
20
|
|
21
|
-
from agilicus import create_or_update
|
21
|
+
from agilicus import create_or_update, find_guid
|
22
22
|
|
23
23
|
ACTIONS = ["allow", "deny", "redirect", "log", "none", "revocation_check", "mfa"]
|
24
24
|
|
@@ -116,29 +116,80 @@ def _obj_from_dict(klass, obj_dict, org_id):
|
|
116
116
|
return model_from_dict(klass, obj_dict)
|
117
117
|
|
118
118
|
|
119
|
+
class AddInfo:
|
120
|
+
def __init__(self):
|
121
|
+
super().__init__()
|
122
|
+
self.name_getter = name_in_spec
|
123
|
+
self.guid_finder = find_guid
|
124
|
+
|
125
|
+
|
119
126
|
def name_in_spec(obj):
|
120
127
|
return obj.spec.name
|
121
128
|
|
122
129
|
|
123
|
-
|
124
|
-
|
125
|
-
)
|
130
|
+
class RuleAddInfo(AddInfo):
|
131
|
+
def __init__(self, apiclient):
|
132
|
+
super().__init__()
|
133
|
+
self.create_fn = lambda obj: apiclient.rules_api.create_standalone_rule(obj)
|
134
|
+
self.replace_fn = lambda guid, obj: apiclient.rules_api.replace_standalone_rule(
|
135
|
+
guid, standalone_rule=obj
|
136
|
+
)
|
137
|
+
self.name_getter = lambda obj: obj.spec.rule.name
|
138
|
+
|
139
|
+
|
140
|
+
class RuleTreeAddInfo(AddInfo):
|
141
|
+
def __init__(self, apiclient):
|
142
|
+
super().__init__()
|
143
|
+
self.create_fn = lambda obj: apiclient.rules_api.create_standalone_rule_tree(obj)
|
144
|
+
self.replace_fn = (
|
145
|
+
lambda guid, obj: apiclient.rules_api.replace_standalone_rule_tree(
|
146
|
+
guid, standalone_rule_tree=obj
|
147
|
+
)
|
148
|
+
)
|
149
|
+
|
150
|
+
|
151
|
+
class RulesetAddInfo(AddInfo):
|
152
|
+
def __init__(self, apiclient):
|
153
|
+
super().__init__()
|
154
|
+
self.create_fn = lambda obj: apiclient.rules_api.create_standalone_ruleset(obj)
|
155
|
+
self.replace_fn = (
|
156
|
+
lambda guid, obj: apiclient.rules_api.replace_standalone_ruleset(
|
157
|
+
guid, standalone_ruleset=obj
|
158
|
+
)
|
159
|
+
)
|
160
|
+
|
161
|
+
|
162
|
+
def add_list_of_resouces(ctx, as_dicts, klass, add_info, **kwargs):
|
126
163
|
org_id = get_org_from_input_or_ctx(ctx, **kwargs)
|
127
164
|
objs = [_obj_from_dict(klass, obj, org_id) for obj in as_dicts]
|
165
|
+
|
166
|
+
return add_list_resources_sdk(ctx, objs, add_info)
|
167
|
+
|
168
|
+
|
169
|
+
def add_list_resources_sdk(ctx, objs, add_info, handle_failure=True):
|
128
170
|
results = []
|
129
171
|
for obj in objs:
|
130
172
|
try:
|
131
|
-
result, _ = create_or_update(
|
173
|
+
result, _ = create_or_update(
|
174
|
+
obj,
|
175
|
+
add_info.create_fn,
|
176
|
+
add_info.replace_fn,
|
177
|
+
to_dict=False,
|
178
|
+
guid_finder=add_info.guid_finder,
|
179
|
+
)
|
132
180
|
results.append(
|
133
181
|
AddResult(
|
134
|
-
result_name=name_getter(result),
|
135
|
-
result_id=result
|
182
|
+
result_name=add_info.name_getter(result),
|
183
|
+
result_id=add_info.guid_finder(result),
|
136
184
|
)
|
137
185
|
)
|
138
186
|
except Exception as exc:
|
187
|
+
if not handle_failure:
|
188
|
+
raise
|
189
|
+
|
139
190
|
results.append(
|
140
191
|
AddResult(
|
141
|
-
result_name=name_getter(obj),
|
192
|
+
result_name=add_info.name_getter(obj),
|
142
193
|
exc=str(exc),
|
143
194
|
)
|
144
195
|
)
|
@@ -155,11 +206,7 @@ def add_rules(ctx, rules, **kwargs):
|
|
155
206
|
ctx,
|
156
207
|
rules,
|
157
208
|
agilicus.StandaloneRule,
|
158
|
-
|
159
|
-
lambda guid, obj: apiclient.rules_api.replace_standalone_rule(
|
160
|
-
guid, standalone_rule=obj
|
161
|
-
),
|
162
|
-
name_getter=lambda obj: obj.spec.rule.name,
|
209
|
+
RuleAddInfo(apiclient),
|
163
210
|
)
|
164
211
|
|
165
212
|
|
@@ -296,10 +343,7 @@ def add_trees(ctx, trees, **kwargs):
|
|
296
343
|
ctx,
|
297
344
|
trees,
|
298
345
|
agilicus.StandaloneRuleTree,
|
299
|
-
|
300
|
-
lambda guid, obj: apiclient.rules_api.replace_standalone_rule_tree(
|
301
|
-
guid, standalone_rule_tree=obj
|
302
|
-
),
|
346
|
+
RuleTreeAddInfo(apiclient),
|
303
347
|
)
|
304
348
|
|
305
349
|
|
@@ -426,10 +470,7 @@ def add_rulesets(ctx, rulesets, **kwargs):
|
|
426
470
|
ctx,
|
427
471
|
rulesets,
|
428
472
|
agilicus.StandaloneRuleset,
|
429
|
-
|
430
|
-
lambda guid, obj: apiclient.rules_api.replace_standalone_ruleset(
|
431
|
-
guid, standalone_ruleset=obj
|
432
|
-
),
|
473
|
+
RulesetAddInfo(apiclient),
|
433
474
|
)
|
434
475
|
|
435
476
|
|
@@ -630,7 +671,7 @@ def list_bundles(ctx, **kwargs):
|
|
630
671
|
kwargs = strip_none(kwargs)
|
631
672
|
return apiclient.rules_api.list_standalone_ruleset_bundles(
|
632
673
|
**kwargs,
|
633
|
-
)
|
674
|
+
)
|
634
675
|
|
635
676
|
|
636
677
|
def get_bundle(ctx, bundle_id, **kwargs):
|
agilicus/rules/rules_main.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import click
|
2
2
|
import click_extension
|
3
3
|
|
4
|
+
from .. import context
|
4
5
|
from . import rules
|
5
6
|
from ..output.table import output_entry
|
6
7
|
|
@@ -268,10 +269,17 @@ def cli_command_delete_rulesets_bundle(ctx, bundle_id, **kwargs):
|
|
268
269
|
|
269
270
|
@click.command(name="list-standalone-ruleset-bundles")
|
270
271
|
@click.option("--org-id", default=None)
|
272
|
+
@click.option("--page-at-id", default=None)
|
273
|
+
@click.option("--get-rulesets", is_flag=True, default=None)
|
274
|
+
@click.option("--standalone-ruleset-bundles-etag", default=None)
|
275
|
+
@click.option("--limit", default=None, type=int)
|
271
276
|
@click.pass_context
|
272
277
|
def cli_command_list_rulesets_bundle(ctx, **kwargs):
|
273
278
|
results = rules.list_bundles(ctx, **kwargs)
|
274
|
-
|
279
|
+
if context.output_console(ctx):
|
280
|
+
print(rules.format_bundles(ctx, results.standalone_ruleset_bundles))
|
281
|
+
return
|
282
|
+
output_entry(ctx, results.to_dict())
|
275
283
|
|
276
284
|
|
277
285
|
@click.command(name="get-standalone-ruleset-bundle")
|
@@ -2,7 +2,7 @@ agilicus/.gitignore,sha256=TyHq6BCuVrFiqgUb1QAayLxWcBseKwEOoKJTQb_-iW8,5
|
|
2
2
|
agilicus/.openapi-generator/FILES,sha256=K8BDgVDJIh7xUpYphJsmb-ZM2ny3_oJKBn1oEEe70Qk,107380
|
3
3
|
agilicus/.openapi-generator/VERSION,sha256=LXsIFraL1muXBEww1sZWaewc9ji87Ih3gIa04Z37RYM,14
|
4
4
|
agilicus/.openapi-generator-ignore,sha256=pu2PTide7pJtJ-DFLzDy0cTYQJRlrB-8RRH3zGLeUds,1040
|
5
|
-
agilicus/__init__.py,sha256=
|
5
|
+
agilicus/__init__.py,sha256=S2_3WLG9tTuRxTPcP_0eNzBALnu9MMiZnFUEbv-dAqE,4978
|
6
6
|
agilicus/access.py,sha256=UEHHhE3cCaCjxXQDjhKxQAoUEMWandygN0d-yEIIf8A,5457
|
7
7
|
agilicus/admin.py,sha256=Gd4HfM7vQktFOuYOoOV_5uAZXEKWOgL_79Ndnlvxhyw,9340
|
8
8
|
agilicus/agilicus_api/__init__.py,sha256=jmFa7Pr4rMPhCT_QFsO408OQ2RrZZFgrrzWKyABULPI,60973
|
@@ -57,7 +57,7 @@ agilicus/agilicus_api/api/regions_api.py,sha256=4R1gOgDBn0V7hMJj5MygnZ-yRx7rm_gw
|
|
57
57
|
agilicus/agilicus_api/api/regions_api_mock.py,sha256=cBnoAURuccE36TePbYeOVgJzfJmoFu7EWpxvr6alryg,1596
|
58
58
|
agilicus/agilicus_api/api/resources_api.py,sha256=hfIe0qmk8pAIuU-in6U7MnHoQqEjRSppplGnU5KlWOA,44716
|
59
59
|
agilicus/agilicus_api/api/resources_api_mock.py,sha256=06pIiRJdLjnDWKVQrTnIamp5pF1X-G4VPz_PzdUG5N0,2070
|
60
|
-
agilicus/agilicus_api/api/rules_api.py,sha256=
|
60
|
+
agilicus/agilicus_api/api/rules_api.py,sha256=QZTsG-y2Y6dVnJ4aTO54wAuXWZ08CR3O16BcXJzXXtM,130910
|
61
61
|
agilicus/agilicus_api/api/rules_api_mock.py,sha256=BJcQzQC4A6ZcWh4lq3KqcTGvNO9X6qerWEH0z2i0vMs,7475
|
62
62
|
agilicus/agilicus_api/api/tokens_api.py,sha256=151rL7BLBz5mmdNIIAjiMCivDhpSLrN8Qp8oBhh0waw,173574
|
63
63
|
agilicus/agilicus_api/api/tokens_api_mock.py,sha256=S7kDLZpQ8wCVM0OMlFn8OGk4GcQxrDHThaT3DkUfY-4,9714
|
@@ -67,9 +67,9 @@ agilicus/agilicus_api/api/users_api.py,sha256=zLwPF_gsWfKZeSmDL3dnJOcp66DlQolvwq
|
|
67
67
|
agilicus/agilicus_api/api/users_api_mock.py,sha256=wA_xiqL3Pz3KjljKlsmf5NveLZS1FpbaKJHBp7QvarY,15411
|
68
68
|
agilicus/agilicus_api/api/whoami_api.py,sha256=Xnn2HjfIbO7FoNQZ_q3UbOTuC6YoPNw1IiSLqYDPu2g,7941
|
69
69
|
agilicus/agilicus_api/api/whoami_api_mock.py,sha256=rlvZoWnMCqORMZBg7SOv6d3xp52kELdh6wXcCaIZ93w,346
|
70
|
-
agilicus/agilicus_api/api_client.py,sha256=
|
70
|
+
agilicus/agilicus_api/api_client.py,sha256=ZhXs4O8uzqMg8bANYTiZIPy1IV4BYzDNupEYGLoB4NQ,38845
|
71
71
|
agilicus/agilicus_api/apis/__init__.py,sha256=m_hg6OJsEsMp6mZ1mn9OlaTflLjrU3Jc-jvYD9gi_PA,2092
|
72
|
-
agilicus/agilicus_api/configuration.py,sha256=
|
72
|
+
agilicus/agilicus_api/configuration.py,sha256=kbAOkGmULb3zsdgXMW0JVeQo0VQOX9ZIR_EL7xwLrFk,18447
|
73
73
|
agilicus/agilicus_api/docs/APIKey.md,sha256=4cKuz4_l9HcEDnUrLwYbEnn9C2WoDayrjfrY1Ixgaf4,1747
|
74
74
|
agilicus/agilicus_api/docs/APIKeyIntrospect.md,sha256=nJ-zkuFm3JMbWFDYYN_vYyQk1snGBtBvIxtCQxamhAU,1019
|
75
75
|
agilicus/agilicus_api/docs/APIKeyIntrospectAuthorizationInfo.md,sha256=7RApOOLjvWQs5sw2jb25g7i3Kta1BiEY-s8VRXfppH8,725
|
@@ -487,7 +487,7 @@ agilicus/agilicus_api/docs/ListServiceForwardersResponse.md,sha256=uGIZRJcW1WZAo
|
|
487
487
|
agilicus/agilicus_api/docs/ListSessionsResponse.md,sha256=lW7z2xBTrcWDg0se_DVGxEznjRaZZm76gL2GeQtJRDk,1433
|
488
488
|
agilicus/agilicus_api/docs/ListStandaloneRuleTreesResponse.md,sha256=GipviHaK1UZWwHG47yK6sadh0ekpa2sPK0Z2gF-MeLg,839
|
489
489
|
agilicus/agilicus_api/docs/ListStandaloneRulesResponse.md,sha256=aXZ1t1x8GfYbuBbo32fyyLvshtLt6rT7JBHzeX4Vfls,814
|
490
|
-
agilicus/agilicus_api/docs/ListStandaloneRulesetBundlesResponse.md,sha256=
|
490
|
+
agilicus/agilicus_api/docs/ListStandaloneRulesetBundlesResponse.md,sha256=3mUkELKJf7QRpOD7KUlISrVcBchF_XcL2KvRyZUZcmo,965
|
491
491
|
agilicus/agilicus_api/docs/ListStandaloneRulesetLabelsResponse.md,sha256=lRg1-qPUUp4S27iPd6BYcDg2fElg6lWjAk2hIlkackM,726
|
492
492
|
agilicus/agilicus_api/docs/ListStandaloneRulesetsResponse.md,sha256=1qC7omQdlz4v6wyrQvzS0ti-nm64_HEUaRBiT0haCZg,836
|
493
493
|
agilicus/agilicus_api/docs/ListTOTPEnrollmentResponse.md,sha256=gCMl-Wti-OhTn5lLyzMt6xoRx0I5TVryKEZ8-iIbZek,681
|
@@ -694,7 +694,7 @@ agilicus/agilicus_api/docs/RuleSetComponent.md,sha256=xk2mA069dsggG4uRSKRAYpv45-
|
|
694
694
|
agilicus/agilicus_api/docs/RuleSetNode.md,sha256=rEktF4HJeKwH52-TkKMwgkOAH1GsyLuRL-gcnfIrc3o,883
|
695
695
|
agilicus/agilicus_api/docs/RuleSpec.md,sha256=cmKB_ksUIuW6okLMS5g3tdGiJwrMtM4-8sxfJXgoOLM,968
|
696
696
|
agilicus/agilicus_api/docs/RuleV2.md,sha256=WKcttrVbzFUtZqqIrS0olNtVPMwytfk6ZxJkP-93cY8,943
|
697
|
-
agilicus/agilicus_api/docs/RulesApi.md,sha256=
|
697
|
+
agilicus/agilicus_api/docs/RulesApi.md,sha256=75PZo5R9JHEarjVes_WzZmRgsJA4b1-EjKEYLDSUVM4,136111
|
698
698
|
agilicus/agilicus_api/docs/RulesConfig.md,sha256=1InJwa3YSCzYVwLBObH-27ysP0I2J0qgeU86cPvv6W4,1952
|
699
699
|
agilicus/agilicus_api/docs/RuntimeStatus.md,sha256=TEypz-SIg1oy2YZcuYyMjzTW10OJi87-BBTyBQMuxyw,3687
|
700
700
|
agilicus/agilicus_api/docs/SSHResource.md,sha256=ZFTmdXWOfrXr71MEbS8_uoXql3vMr8qrEp6jS-OPXxI,990
|
@@ -1256,7 +1256,7 @@ agilicus/agilicus_api/model/list_sessions_response.py,sha256=5VAFqQYH9zmEWaMBpG7
|
|
1256
1256
|
agilicus/agilicus_api/model/list_ssh_resources_response.py,sha256=Xtb3u-yXDUA57O7QsRiJ67K_lKt8BnXbJcqTEhsXtGg,14637
|
1257
1257
|
agilicus/agilicus_api/model/list_standalone_rule_trees_response.py,sha256=xe6kiMhi6Z5SH8amrp9zsqwn7fmxBNOCDxVFR1-Lqxk,14912
|
1258
1258
|
agilicus/agilicus_api/model/list_standalone_rules_response.py,sha256=S_SPj7Gec-HZeC8o8dK3eRf85vfaTWDGqhJ5Ss8aUw4,14783
|
1259
|
-
agilicus/agilicus_api/model/list_standalone_ruleset_bundles_response.py,sha256=
|
1259
|
+
agilicus/agilicus_api/model/list_standalone_ruleset_bundles_response.py,sha256=0dCc1YMxPXRYKA0vw24JD2uY08-118vJvafOTE1jKIE,15738
|
1260
1260
|
agilicus/agilicus_api/model/list_standalone_ruleset_labels_response.py,sha256=z--SLdBXFPvMXZJfe0rMP3ZVoLB7Ti4TudrQLbtM-wU,14472
|
1261
1261
|
agilicus/agilicus_api/model/list_standalone_rulesets_response.py,sha256=IGcC4dpoEpCfpoSRf1L116VIguowbcAkfkvsBDiNSeo,14867
|
1262
1262
|
agilicus/agilicus_api/model/list_tokens_response.py,sha256=Q80Srg2aA5Pab8W7PZPkE84W4DR5pQUcLzuuHKpufi4,13918
|
@@ -2398,7 +2398,7 @@ agilicus/agilicus_api/test/test_x509_root_certificate.py,sha256=AqH9tZ825V2RHtNc
|
|
2398
2398
|
agilicus/agilicus_api/test/test_x509_root_certificate_spec.py,sha256=8PCPuXVkHrLCXqnaOJm64WGuSnpqIL0zj1AVQSBgf9U,2832
|
2399
2399
|
agilicus/agilicus_api/test/test_x509_root_certificate_status.py,sha256=s8Ups8bxho__nuXR86gwXAtBlAjrmZqA1-YkJwmmCEg,2846
|
2400
2400
|
agilicus/agilicus_api/test/test_xss_settings.py,sha256=kj4qWEH4k8kQWZ4Zb-S6mEvK1e18dN7kPowJ5uyqFE4,2746
|
2401
|
-
agilicus/agilicus_api_README.md,sha256=
|
2401
|
+
agilicus/agilicus_api_README.md,sha256=JLOX2uGzj0NMTZqeVI8iegBhWTZuoa7mtjUxv8MdED8,154557
|
2402
2402
|
agilicus/aliases.ini,sha256=MxqiVo2f2xdUDVF1YDkNW36AIqN8hrYjlTVfraEUZXY,455
|
2403
2403
|
agilicus/amq.py,sha256=yxi-YTbJPVl10s78Hlr1dmrQR63iaSIoROGVILzFPmE,1775
|
2404
2404
|
agilicus/apps.py,sha256=8k_tGraPUVKJURksZwKR8eNGW-4CSPv54FYcApQ3Ly8,50857
|
@@ -2447,7 +2447,7 @@ agilicus/labels/labels_main.py,sha256=i3HA1ZuMG6N28mwmlhAMt4N95RNpm4eDS3EVRChjRu
|
|
2447
2447
|
agilicus/launchers.py,sha256=XRW8cO_S7HHs-Cc6_baol9AOOsuGlMto7bLcsKYk6qA,11199
|
2448
2448
|
agilicus/logs.py,sha256=tS8c_sdre1Dncrl59GVGQ0L3d2jtwlVjvIMl3SHJraY,766
|
2449
2449
|
agilicus/lookups.py,sha256=MNmNsKpP7Fq_poLAnL9xo_iptFilKM9ziGLyIe8VKaw,669
|
2450
|
-
agilicus/main.py,sha256=
|
2450
|
+
agilicus/main.py,sha256=WbKlV5agX3-aJnOHgOVaRGKenCDtIteYk02HWJv7ddA,263713
|
2451
2451
|
agilicus/messages.py,sha256=Ydm-VhAsK23UnYdstv_HsOybBODfui5ubKc7F8R_dsw,5187
|
2452
2452
|
agilicus/metrics.py,sha256=v4rwpvqDzeNG5GKNoZ7t34X5qUgly5IW2s-kXlS2vQM,2315
|
2453
2453
|
agilicus/orgs.py,sha256=rwTuumHWz0_QPqWNdDPPdAJRGTTNUxVw7bBkxU5a8n8,12874
|
@@ -2461,6 +2461,9 @@ agilicus/output/tests/column_builder_test.py,sha256=fKP4V5sqXtmEIr-Q0gWVSFdBqCUt
|
|
2461
2461
|
agilicus/pagination/pagination.py,sha256=hC7eLHxXKe4Iv7LdOZK3Dh8R_fKQIr9PPiWKJVyP4Nk,1672
|
2462
2462
|
agilicus/patches.py,sha256=qTqLOgCAcFZPcPOkgfqMnK9bnqTXMvj_0ERsjRFcZug,1384
|
2463
2463
|
agilicus/permissions.py,sha256=uB65yuDFICp1N10m0cdUjgizx9MQzAbLbAsBSTw1Rcc,2117
|
2464
|
+
agilicus/policy/policies.py,sha256=-Sf7I4Qs2jGk6qxLuuKrR5a7hnTJ8I8kuTM4Z7guKZ0,2570
|
2465
|
+
agilicus/policy/policy_main.py,sha256=eY0mc445ct5Nv4Jinee4oWersIpj2TncS1TG-b5ZjRo,931
|
2466
|
+
agilicus/policy/templates.py,sha256=EUvAhOhSjDuLAe2UKIFEzBp5pNpOT5y1r7uyV_GG6uI,5638
|
2464
2467
|
agilicus/products/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2465
2468
|
agilicus/products/products.py,sha256=he27jN3MUyXBdTdV2HRyvUYb0zD3W1TGsuC7NHLKngQ,5365
|
2466
2469
|
agilicus/products/products_main.py,sha256=saa2-e5oeHW6D5AWPcld99KwgQ9nBY3hoW8Jz_5nfMQ,3421
|
@@ -2468,8 +2471,8 @@ agilicus/regions.py,sha256=21SzUJ9_hC8DiWLSLJ-vtSb1tWLhlcPXH9JhmXD_ypU,3343
|
|
2468
2471
|
agilicus/resource_helpers.py,sha256=fyfqAxjfnIth1KlHNALlLtYYXIZzlWEJmSZNLdj2JV0,380
|
2469
2472
|
agilicus/resources.py,sha256=nlH4cezzfaiq4M7BK7iwXFUYF3kG9_Su6sFEEXX6I2M,10163
|
2470
2473
|
agilicus/response.py,sha256=tI2-dAJwhBuuDplSsouuMmCmKHSwR_Mx71af8tgsuYo,468
|
2471
|
-
agilicus/rules/rules.py,sha256=
|
2472
|
-
agilicus/rules/rules_main.py,sha256=
|
2474
|
+
agilicus/rules/rules.py,sha256=ALHJr_tX2iGDKGKUMTteAp0iUQExqNGAhz3hcypxaF0,21019
|
2475
|
+
agilicus/rules/rules_main.py,sha256=hHyeY0WzFT2l1AQlA1C1PJQLuaEAgRhSbIUALHIyaa8,10750
|
2473
2476
|
agilicus/scopes.py,sha256=OgPUksJSOSaJ3XcHPP8WJQ3e_p8B9wVmRXr-oZDfZP0,1344
|
2474
2477
|
agilicus/service_configuration.py,sha256=WlsvTKA_bkle1PthJK0S96lpPK7GNr-BWWp8a_-MgtM,490
|
2475
2478
|
agilicus/service_token.py,sha256=YDVFeBe9Yv0qYvfUenwnpGHuj2x1J06YUe5A_C8L6L4,7162
|
@@ -2484,8 +2487,8 @@ agilicus/trusted_certs/trusted_certs_main.py,sha256=6dHHWXvNIcUa_nA9ptigL4Vibe4n
|
|
2484
2487
|
agilicus/users.py,sha256=cBqZwqNz_9lcEJuFL5YTUFpbN56kL0-maBlM29KWWrQ,38728
|
2485
2488
|
agilicus/version.py,sha256=G9OFdL1v_4dLDfk6I6taDNypM5bbO-JHAwilsu9LYgg,23
|
2486
2489
|
agilicus/whoami.py,sha256=kqghtWMgZOd2rhKmfguDwCTm6A3gNS8Kj-S2IBxBtl0,206
|
2487
|
-
agilicus-1.
|
2488
|
-
agilicus-1.
|
2489
|
-
agilicus-1.
|
2490
|
-
agilicus-1.
|
2491
|
-
agilicus-1.
|
2490
|
+
agilicus-1.246.0.dist-info/LICENSE.txt,sha256=Zq4tqiCroC2CVrBB_PWjapRdvpae23nljdiaSkOzUho,1061
|
2491
|
+
agilicus-1.246.0.dist-info/METADATA,sha256=tTBFD6BkRJPQ23J8nAiRnf_bQAP2mVOBgtv9eYBS9PA,3822
|
2492
|
+
agilicus-1.246.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
|
2493
|
+
agilicus-1.246.0.dist-info/entry_points.txt,sha256=a66hGozzLkHu0IewFzIMbSAhMTNTddUaA2T3_16Gb_s,51
|
2494
|
+
agilicus-1.246.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|