coreason-manifest 0.3.0__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/PKG-INFO +21 -18
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/README.md +18 -17
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/pyproject.toml +4 -2
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/engine.py +56 -15
- coreason_manifest-0.4.0/src/coreason_manifest/server.py +123 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/LICENSE +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/NOTICE +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/__init__.py +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/errors.py +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/integrity.py +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/loader.py +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/main.py +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/models.py +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/policies/compliance.rego +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/policies/tbom.json +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/policy.py +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/schemas/__init__.py +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/schemas/agent.schema.json +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/utils/__init__.py +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/utils/logger.py +0 -0
- {coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/validator.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coreason_manifest
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: This package is the definitive source of truth. If it isn't in the manifest, it doesn't exist. If it violates the manifest, it doesn't run.
|
|
5
5
|
License: # The Prosperity Public License 3.0.0
|
|
6
6
|
|
|
@@ -69,11 +69,13 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
69
69
|
Classifier: Operating System :: OS Independent
|
|
70
70
|
Requires-Dist: aiofiles (>=23.2.1,<24.0.0)
|
|
71
71
|
Requires-Dist: anyio (>=4.3.0,<5.0.0)
|
|
72
|
+
Requires-Dist: fastapi (>=0.111.0,<0.112.0)
|
|
72
73
|
Requires-Dist: httpx (>=0.27.0,<0.28.0)
|
|
73
74
|
Requires-Dist: jsonschema (>=4.25.1,<5.0.0)
|
|
74
75
|
Requires-Dist: loguru (>=0.7.2,<0.8.0)
|
|
75
76
|
Requires-Dist: pydantic (>=2.12.5,<3.0.0)
|
|
76
77
|
Requires-Dist: pyyaml (>=6.0.3,<7.0.0)
|
|
78
|
+
Requires-Dist: uvicorn (>=0.30.1,<0.31.0)
|
|
77
79
|
Project-URL: Documentation, https://github.com/CoReason-AI/coreason_manifest
|
|
78
80
|
Project-URL: Homepage, https://github.com/CoReason-AI/coreason_manifest
|
|
79
81
|
Project-URL: Repository, https://github.com/CoReason-AI/coreason_manifest
|
|
@@ -99,6 +101,7 @@ The definitive source of truth for CoReason-AI Asset definitions. "The Blueprint
|
|
|
99
101
|
* **Integrity Verification:** Calculates and verifies SHA256 hashes of the agent's source code to prevent tampering.
|
|
100
102
|
* **Dependency Pinning:** Enforces strict version pinning for all library dependencies.
|
|
101
103
|
* **Trusted Bill of Materials (TBOM):** Validates libraries against an approved list.
|
|
104
|
+
* **Compliance Microservice:** Can be run as a standalone API server (Service C) for centralized validation.
|
|
102
105
|
|
|
103
106
|
## Installation
|
|
104
107
|
|
|
@@ -108,30 +111,30 @@ pip install coreason-manifest
|
|
|
108
111
|
|
|
109
112
|
## Usage
|
|
110
113
|
|
|
111
|
-
|
|
114
|
+
`coreason-manifest` supports two modes: **Library (CLI)** and **Server (Microservice)**.
|
|
115
|
+
|
|
116
|
+
### 1. Library Usage
|
|
117
|
+
|
|
118
|
+
Use the python library to validate local agent files and verify source integrity.
|
|
112
119
|
|
|
113
120
|
```python
|
|
114
|
-
from coreason_manifest import ManifestEngine, ManifestConfig
|
|
121
|
+
from coreason_manifest import ManifestEngine, ManifestConfig
|
|
115
122
|
|
|
116
|
-
#
|
|
117
|
-
config = ManifestConfig(policy_path="./policies/
|
|
123
|
+
# Initialize and Validate
|
|
124
|
+
config = ManifestConfig(policy_path="./policies/compliance.rego")
|
|
118
125
|
engine = ManifestEngine(config)
|
|
126
|
+
agent_def = engine.load_and_validate("agent.yaml", "./src")
|
|
127
|
+
```
|
|
119
128
|
|
|
120
|
-
|
|
121
|
-
try:
|
|
122
|
-
# This runs Schema Validation, Policy Enforcement, and Integrity Checks
|
|
123
|
-
agent_def = engine.load_and_validate(
|
|
124
|
-
manifest_path="./agents/payer_war_game/agent.yaml",
|
|
125
|
-
source_dir="./agents/payer_war_game/src"
|
|
126
|
-
)
|
|
127
|
-
print(f"Agent {agent_def.metadata.name} is compliant and ready to run.")
|
|
129
|
+
### 2. Server Mode
|
|
128
130
|
|
|
129
|
-
|
|
130
|
-
print(f"Compliance Failure: {e.violations}")
|
|
131
|
+
Run the package as a FastAPI server to provide a centralized compliance API.
|
|
131
132
|
|
|
132
|
-
|
|
133
|
-
|
|
133
|
+
```bash
|
|
134
|
+
uvicorn coreason_manifest.server:app --host 0.0.0.0 --port 8000
|
|
134
135
|
```
|
|
135
136
|
|
|
136
|
-
For
|
|
137
|
+
For full details, see the [Usage Documentation](docs/usage.md).
|
|
138
|
+
|
|
139
|
+
For detailed requirements and architecture, please refer to the [Product Requirements](docs/product_requirements.md) or [Requirements](docs/requirements.md).
|
|
137
140
|
|
|
@@ -18,6 +18,7 @@ The definitive source of truth for CoReason-AI Asset definitions. "The Blueprint
|
|
|
18
18
|
* **Integrity Verification:** Calculates and verifies SHA256 hashes of the agent's source code to prevent tampering.
|
|
19
19
|
* **Dependency Pinning:** Enforces strict version pinning for all library dependencies.
|
|
20
20
|
* **Trusted Bill of Materials (TBOM):** Validates libraries against an approved list.
|
|
21
|
+
* **Compliance Microservice:** Can be run as a standalone API server (Service C) for centralized validation.
|
|
21
22
|
|
|
22
23
|
## Installation
|
|
23
24
|
|
|
@@ -27,29 +28,29 @@ pip install coreason-manifest
|
|
|
27
28
|
|
|
28
29
|
## Usage
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
`coreason-manifest` supports two modes: **Library (CLI)** and **Server (Microservice)**.
|
|
32
|
+
|
|
33
|
+
### 1. Library Usage
|
|
34
|
+
|
|
35
|
+
Use the python library to validate local agent files and verify source integrity.
|
|
31
36
|
|
|
32
37
|
```python
|
|
33
|
-
from coreason_manifest import ManifestEngine, ManifestConfig
|
|
38
|
+
from coreason_manifest import ManifestEngine, ManifestConfig
|
|
34
39
|
|
|
35
|
-
#
|
|
36
|
-
config = ManifestConfig(policy_path="./policies/
|
|
40
|
+
# Initialize and Validate
|
|
41
|
+
config = ManifestConfig(policy_path="./policies/compliance.rego")
|
|
37
42
|
engine = ManifestEngine(config)
|
|
43
|
+
agent_def = engine.load_and_validate("agent.yaml", "./src")
|
|
44
|
+
```
|
|
38
45
|
|
|
39
|
-
|
|
40
|
-
try:
|
|
41
|
-
# This runs Schema Validation, Policy Enforcement, and Integrity Checks
|
|
42
|
-
agent_def = engine.load_and_validate(
|
|
43
|
-
manifest_path="./agents/payer_war_game/agent.yaml",
|
|
44
|
-
source_dir="./agents/payer_war_game/src"
|
|
45
|
-
)
|
|
46
|
-
print(f"Agent {agent_def.metadata.name} is compliant and ready to run.")
|
|
46
|
+
### 2. Server Mode
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
print(f"Compliance Failure: {e.violations}")
|
|
48
|
+
Run the package as a FastAPI server to provide a centralized compliance API.
|
|
50
49
|
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
```bash
|
|
51
|
+
uvicorn coreason_manifest.server:app --host 0.0.0.0 --port 8000
|
|
53
52
|
```
|
|
54
53
|
|
|
55
|
-
For
|
|
54
|
+
For full details, see the [Usage Documentation](docs/usage.md).
|
|
55
|
+
|
|
56
|
+
For detailed requirements and architecture, please refer to the [Product Requirements](docs/product_requirements.md) or [Requirements](docs/requirements.md).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "coreason_manifest"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.4.0"
|
|
4
4
|
description = "This package is the definitive source of truth. If it isn't in the manifest, it doesn't exist. If it violates the manifest, it doesn't run."
|
|
5
5
|
authors = ["Gowtham A Rao <gowtham.rao@coreason.ai>"]
|
|
6
6
|
license = "Prosperity-3.0"
|
|
@@ -16,6 +16,8 @@ pyyaml = "^6.0.3"
|
|
|
16
16
|
anyio = "^4.3.0"
|
|
17
17
|
httpx = "^0.27.0"
|
|
18
18
|
aiofiles = "^23.2.1"
|
|
19
|
+
fastapi = "^0.111.0"
|
|
20
|
+
uvicorn = "^0.30.1"
|
|
19
21
|
|
|
20
22
|
[tool.poetry.group.dev.dependencies]
|
|
21
23
|
pytest = "^8.2.2"
|
|
@@ -35,7 +37,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
35
37
|
|
|
36
38
|
[project]
|
|
37
39
|
name = "coreason_manifest"
|
|
38
|
-
version = "0.
|
|
40
|
+
version = "0.4.0"
|
|
39
41
|
description = "This package is the definitive source of truth. If it isn't in the manifest, it doesn't exist. If it violates the manifest, it doesn't run."
|
|
40
42
|
readme = "README.md"
|
|
41
43
|
requires-python = ">=3.11"
|
|
@@ -80,29 +80,30 @@ class ManifestEngineAsync:
|
|
|
80
80
|
# Clean up resources if necessary.
|
|
81
81
|
pass
|
|
82
82
|
|
|
83
|
-
async def
|
|
84
|
-
"""
|
|
83
|
+
async def validate_manifest_dict(self, raw_data: dict[str, Any]) -> AgentDefinition:
|
|
84
|
+
"""Validates an Agent Manifest dictionary in memory.
|
|
85
|
+
|
|
86
|
+
Performs:
|
|
87
|
+
1. Normalization (stripping version prefixes)
|
|
88
|
+
2. Schema Validation
|
|
89
|
+
3. Model Conversion
|
|
90
|
+
4. Policy Enforcement
|
|
91
|
+
|
|
92
|
+
Does NOT perform Integrity Check (hashing).
|
|
85
93
|
|
|
86
94
|
Args:
|
|
87
|
-
|
|
88
|
-
source_dir: Path to the source code directory.
|
|
95
|
+
raw_data: The raw dictionary of the manifest.
|
|
89
96
|
|
|
90
97
|
Returns:
|
|
91
|
-
AgentDefinition: The fully validated
|
|
98
|
+
AgentDefinition: The fully validated agent definition.
|
|
92
99
|
|
|
93
100
|
Raises:
|
|
94
101
|
ManifestSyntaxError: If structure or schema is invalid.
|
|
95
102
|
PolicyViolationError: If business rules are violated.
|
|
96
|
-
IntegrityCompromisedError: If source code hash does not match.
|
|
97
|
-
FileNotFoundError: If files are missing.
|
|
98
103
|
"""
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
logger.info(f"Validating Agent Manifest: {manifest_path}")
|
|
103
|
-
|
|
104
|
-
# 1. Load Raw YAML (I/O)
|
|
105
|
-
raw_data = await ManifestLoader.load_raw_from_file_async(manifest_path)
|
|
104
|
+
# 1. Normalization (ensure version string is clean before schema/model validation)
|
|
105
|
+
# We access the static method on ManifestLoader.
|
|
106
|
+
ManifestLoader._normalize_data(raw_data)
|
|
106
107
|
|
|
107
108
|
# 2. Schema Validation
|
|
108
109
|
logger.debug("Running Schema Validation...")
|
|
@@ -128,13 +129,42 @@ class ManifestEngineAsync:
|
|
|
128
129
|
logger.info(f"Policy Check: Fail - {duration_ms:.2f}ms")
|
|
129
130
|
raise
|
|
130
131
|
|
|
132
|
+
return cast(AgentDefinition, agent_def)
|
|
133
|
+
|
|
134
|
+
async def load_and_validate(self, manifest_path: Union[str, Path], source_dir: Union[str, Path]) -> AgentDefinition:
|
|
135
|
+
"""Loads, validates, and verifies an Agent Manifest asynchronously.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
manifest_path: Path to the agent.yaml file.
|
|
139
|
+
source_dir: Path to the source code directory.
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
AgentDefinition: The fully validated and verified agent definition.
|
|
143
|
+
|
|
144
|
+
Raises:
|
|
145
|
+
ManifestSyntaxError: If structure or schema is invalid.
|
|
146
|
+
PolicyViolationError: If business rules are violated.
|
|
147
|
+
IntegrityCompromisedError: If source code hash does not match.
|
|
148
|
+
FileNotFoundError: If files are missing.
|
|
149
|
+
"""
|
|
150
|
+
manifest_path = Path(manifest_path)
|
|
151
|
+
source_dir = Path(source_dir)
|
|
152
|
+
|
|
153
|
+
logger.info(f"Validating Agent Manifest: {manifest_path}")
|
|
154
|
+
|
|
155
|
+
# 1. Load Raw YAML (I/O)
|
|
156
|
+
raw_data = await ManifestLoader.load_raw_from_file_async(manifest_path)
|
|
157
|
+
|
|
158
|
+
# 2. Validate Manifest Dict (Schema, Model, Policy)
|
|
159
|
+
agent_def = await self.validate_manifest_dict(raw_data)
|
|
160
|
+
|
|
131
161
|
# 5. Integrity Check (Heavy I/O and CPU)
|
|
132
162
|
logger.debug("Verifying Integrity...")
|
|
133
163
|
# IntegrityChecker.verify is synchronous and does heavy IO, so we wrap it.
|
|
134
164
|
await anyio.to_thread.run_sync(IntegrityChecker.verify, agent_def, source_dir, manifest_path)
|
|
135
165
|
|
|
136
166
|
logger.info("Agent validation successful.")
|
|
137
|
-
return
|
|
167
|
+
return agent_def
|
|
138
168
|
|
|
139
169
|
|
|
140
170
|
class ManifestEngine:
|
|
@@ -179,3 +209,14 @@ class ManifestEngine:
|
|
|
179
209
|
AgentDefinition: The fully validated and verified agent definition.
|
|
180
210
|
"""
|
|
181
211
|
return cast(AgentDefinition, anyio.run(self._async.load_and_validate, manifest_path, source_dir))
|
|
212
|
+
|
|
213
|
+
def validate_manifest_dict(self, raw_data: dict[str, Any]) -> AgentDefinition:
|
|
214
|
+
"""Validates an Agent Manifest dictionary synchronously.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
raw_data: The raw dictionary of the manifest.
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
AgentDefinition: The fully validated agent definition.
|
|
221
|
+
"""
|
|
222
|
+
return cast(AgentDefinition, anyio.run(self._async.validate_manifest_dict, raw_data))
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
from contextlib import asynccontextmanager
|
|
2
|
+
from importlib import resources
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import AsyncIterator, List, Optional, Union
|
|
5
|
+
|
|
6
|
+
from fastapi import FastAPI, HTTPException, Request, status
|
|
7
|
+
from fastapi.responses import JSONResponse
|
|
8
|
+
from pydantic import BaseModel, Field
|
|
9
|
+
|
|
10
|
+
from coreason_manifest.engine import ManifestConfig, ManifestEngineAsync
|
|
11
|
+
from coreason_manifest.errors import ManifestSyntaxError, PolicyViolationError
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# Response Model
|
|
15
|
+
class ValidationResponse(BaseModel):
|
|
16
|
+
valid: bool
|
|
17
|
+
agent_id: Optional[str] = None
|
|
18
|
+
version: Optional[str] = None
|
|
19
|
+
policy_violations: List[str] = Field(default_factory=list)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@asynccontextmanager
|
|
23
|
+
async def lifespan(app: FastAPI) -> AsyncIterator[None]:
|
|
24
|
+
# Locate policies
|
|
25
|
+
policy_path: Optional[Path] = None
|
|
26
|
+
tbom_path: Optional[Path] = None
|
|
27
|
+
|
|
28
|
+
# 1. Check local directory (Docker runtime with COPY or relative dev path)
|
|
29
|
+
# In Docker we will COPY to /app/policies/ or ./policies/ relative to WORKDIR
|
|
30
|
+
# We'll check common locations.
|
|
31
|
+
possible_dirs = [
|
|
32
|
+
Path("policies"),
|
|
33
|
+
Path("/app/policies"),
|
|
34
|
+
Path("src/coreason_manifest/policies"), # Dev from root
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
for d in possible_dirs:
|
|
38
|
+
if (d / "compliance.rego").exists():
|
|
39
|
+
policy_path = d / "compliance.rego"
|
|
40
|
+
if (d / "tbom.json").exists():
|
|
41
|
+
tbom_path = d / "tbom.json"
|
|
42
|
+
break
|
|
43
|
+
|
|
44
|
+
# 2. Fallback to package resources
|
|
45
|
+
resource_context = None
|
|
46
|
+
if not policy_path:
|
|
47
|
+
try:
|
|
48
|
+
# Check if it exists as a resource
|
|
49
|
+
ref = resources.files("coreason_manifest.policies").joinpath("compliance.rego")
|
|
50
|
+
if ref.is_file():
|
|
51
|
+
resource_context = resources.as_file(ref)
|
|
52
|
+
policy_path = resource_context.__enter__()
|
|
53
|
+
# Check for TBOM in same dir if possible, or ignore for fallback
|
|
54
|
+
except Exception:
|
|
55
|
+
pass
|
|
56
|
+
|
|
57
|
+
# If still not found, fail.
|
|
58
|
+
if not policy_path:
|
|
59
|
+
raise RuntimeError("Could not locate compliance.rego policy file.")
|
|
60
|
+
|
|
61
|
+
config = ManifestConfig(
|
|
62
|
+
policy_path=policy_path,
|
|
63
|
+
tbom_path=tbom_path,
|
|
64
|
+
opa_path="opa", # Assumes OPA is in PATH (installed via Dockerfile)
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
engine = ManifestEngineAsync(config)
|
|
68
|
+
|
|
69
|
+
try:
|
|
70
|
+
async with engine:
|
|
71
|
+
app.state.engine = engine
|
|
72
|
+
yield
|
|
73
|
+
finally:
|
|
74
|
+
if resource_context:
|
|
75
|
+
resource_context.__exit__(None, None, None)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
app = FastAPI(lifespan=lifespan)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@app.post("/validate", response_model=ValidationResponse) # type: ignore[misc]
|
|
82
|
+
async def validate_manifest(request: Request) -> Union[ValidationResponse, JSONResponse]:
|
|
83
|
+
engine: ManifestEngineAsync = app.state.engine
|
|
84
|
+
|
|
85
|
+
try:
|
|
86
|
+
raw_body = await request.json()
|
|
87
|
+
except Exception:
|
|
88
|
+
raise HTTPException(status_code=400, detail="Invalid JSON body") from None
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
agent_def = await engine.validate_manifest_dict(raw_body)
|
|
92
|
+
return ValidationResponse(
|
|
93
|
+
valid=True,
|
|
94
|
+
agent_id=str(agent_def.metadata.id),
|
|
95
|
+
version=agent_def.metadata.version,
|
|
96
|
+
policy_violations=[],
|
|
97
|
+
)
|
|
98
|
+
except ManifestSyntaxError as e:
|
|
99
|
+
# Return 422 with the error
|
|
100
|
+
resp = ValidationResponse(valid=False, policy_violations=[f"Syntax Error: {str(e)}"])
|
|
101
|
+
return JSONResponse(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, content=resp.model_dump())
|
|
102
|
+
except PolicyViolationError as e:
|
|
103
|
+
resp = ValidationResponse(valid=False, policy_violations=e.violations)
|
|
104
|
+
return JSONResponse(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, content=resp.model_dump())
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@app.get("/health") # type: ignore[misc]
|
|
108
|
+
async def health_check() -> dict[str, str]:
|
|
109
|
+
engine: ManifestEngineAsync = app.state.engine
|
|
110
|
+
policy_version = "unknown"
|
|
111
|
+
try:
|
|
112
|
+
import hashlib
|
|
113
|
+
|
|
114
|
+
# policy_path is guaranteed to exist by lifespan check
|
|
115
|
+
policy_path = Path(engine.config.policy_path)
|
|
116
|
+
if policy_path.exists():
|
|
117
|
+
with open(policy_path, "rb") as f:
|
|
118
|
+
digest = hashlib.sha256(f.read()).hexdigest()[:8]
|
|
119
|
+
policy_version = digest
|
|
120
|
+
except Exception:
|
|
121
|
+
pass
|
|
122
|
+
|
|
123
|
+
return {"status": "active", "policy_version": policy_version}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/policies/compliance.rego
RENAMED
|
File without changes
|
{coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/policies/tbom.json
RENAMED
|
File without changes
|
|
File without changes
|
{coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/schemas/__init__.py
RENAMED
|
File without changes
|
{coreason_manifest-0.3.0 → coreason_manifest-0.4.0}/src/coreason_manifest/schemas/agent.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|