acex-devkit 2.1.1__tar.gz → 2.2.1__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.
Files changed (52) hide show
  1. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/PKG-INFO +1 -1
  2. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/pyproject.toml +1 -1
  3. acex_devkit-2.2.1/src/acex_devkit/models/credential.py +104 -0
  4. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/telemetry_agent.py +50 -0
  5. acex_devkit-2.1.1/src/acex_devkit/models/credential.py +0 -51
  6. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/README.md +0 -0
  7. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/__init__.py +0 -0
  8. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/configdiffer/__init__.py +0 -0
  9. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/configdiffer/command.py +0 -0
  10. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/configdiffer/configdiffer.py +0 -0
  11. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/configdiffer/diff.py +0 -0
  12. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/configdiffer/old_configdiffer.py +0 -0
  13. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/configdiffer/old_diff.py +0 -0
  14. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/drivers/__init__.py +0 -0
  15. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/drivers/base.py +0 -0
  16. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/drivers/base_driver.py +0 -0
  17. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/exceptions/__init__.py +0 -0
  18. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/__init__.py +0 -0
  19. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/acl_model.py +0 -0
  20. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/agent_manifest.py +0 -0
  21. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/ai_ops.py +0 -0
  22. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/asset.py +0 -0
  23. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/assignment.py +0 -0
  24. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/attribute_value.py +0 -0
  25. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/augment.py +0 -0
  26. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/auth_config.py +0 -0
  27. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/base.py +0 -0
  28. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/capability.py +0 -0
  29. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/collection_agent.py +0 -0
  30. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/compliance.py +0 -0
  31. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/composed_configuration.py +0 -0
  32. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/config_components.py +0 -0
  33. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/config_snapshot.py +0 -0
  34. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/contact.py +0 -0
  35. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/container_entry.py +0 -0
  36. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/external_value.py +0 -0
  37. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/lldp_neighbor.py +0 -0
  38. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/lldp_topology.py +0 -0
  39. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/logging.py +0 -0
  40. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/logical_node.py +0 -0
  41. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/management_connection.py +0 -0
  42. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/ned.py +0 -0
  43. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/node_response.py +0 -0
  44. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/pagination.py +0 -0
  45. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/reference.py +0 -0
  46. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/region.py +0 -0
  47. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/site.py +0 -0
  48. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/spanning_tree.py +0 -0
  49. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/normalizer/__init__.py +0 -0
  50. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/normalizer/base.py +0 -0
  51. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/normalizer/engine.py +0 -0
  52. {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/types/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: acex-devkit
3
- Version: 2.1.1
3
+ Version: 2.2.1
4
4
  Summary: ACE-X DevKit - Development kit for building ACE-X drivers and plugins
5
5
  License: AGPL-3.0
6
6
  Keywords: automation,devkit,sdk,drivers,plugins
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "acex-devkit"
3
- version = "2.1.1"
3
+ version = "2.2.1"
4
4
  description = "ACE-X DevKit - Development kit for building ACE-X drivers and plugins"
5
5
  authors = ["Johan Lahti <johan.lahti@acebit.se>"]
6
6
  readme = "README.md"
@@ -0,0 +1,104 @@
1
+ from enum import StrEnum
2
+
3
+ from pydantic import BaseModel, model_validator
4
+
5
+ from acex_devkit.models.base import PersistedResponse
6
+
7
+
8
+ class SnmpAuthProtocol(StrEnum):
9
+ """SNMPv3 authentication protocols, in Telegraf's vocabulary."""
10
+
11
+ MD5 = "MD5"
12
+ SHA = "SHA"
13
+ SHA224 = "SHA224"
14
+ SHA256 = "SHA256"
15
+ SHA384 = "SHA384"
16
+ SHA512 = "SHA512"
17
+
18
+
19
+ class SnmpPrivProtocol(StrEnum):
20
+ """SNMPv3 privacy protocols, in Telegraf's vocabulary."""
21
+
22
+ DES = "DES"
23
+ AES = "AES"
24
+ AES192 = "AES192"
25
+ AES192C = "AES192C"
26
+ AES256 = "AES256"
27
+ AES256C = "AES256C"
28
+
29
+
30
+ # Per-credential-type enum constraints on field values, keyed by field name.
31
+ CREDENTIAL_FIELD_ENUMS: dict[str, dict[str, type[StrEnum]]] = {
32
+ "snmpv3": {
33
+ "auth_protocol": SnmpAuthProtocol,
34
+ "priv_protocol": SnmpPrivProtocol,
35
+ },
36
+ }
37
+
38
+
39
+ def _validate_field_enums(credential_type: str, fields: dict[str, str]) -> None:
40
+ constraints = CREDENTIAL_FIELD_ENUMS.get(credential_type, {})
41
+ for field_name, enum_cls in constraints.items():
42
+ value = fields.get(field_name)
43
+ if value is None or value == "":
44
+ continue
45
+ try:
46
+ enum_cls(value)
47
+ except ValueError:
48
+ valid = ", ".join(e.value for e in enum_cls)
49
+ raise ValueError(
50
+ f"Invalid {field_name} '{value}' for credential type '{credential_type}'. Valid: {valid}"
51
+ ) from None
52
+
53
+
54
+ class CredentialFieldBase(BaseModel):
55
+ field_name: str
56
+ sensitive: bool = True
57
+
58
+
59
+ class CredentialBase(BaseModel):
60
+ name: str
61
+ credential_type: str
62
+ source: str = "local"
63
+ vault_path: str | None = None
64
+
65
+
66
+ class CredentialFieldResponse(CredentialFieldBase):
67
+ field_value: str | None = None
68
+
69
+
70
+ class CredentialResponse(PersistedResponse, CredentialBase):
71
+ fields: list[CredentialFieldResponse] = []
72
+
73
+
74
+ class CredentialCreate(CredentialBase):
75
+ fields: dict[str, str]
76
+
77
+ @model_validator(mode="after")
78
+ def _check_field_values(self):
79
+ _validate_field_enums(self.credential_type, self.fields)
80
+ return self
81
+
82
+
83
+ class CredentialUpdate(BaseModel):
84
+ name: str | None = None
85
+ source: str | None = None
86
+ vault_path: str | None = None
87
+ fields: dict[str, str] | None = None
88
+
89
+
90
+ class CredentialSecret(BaseModel):
91
+ id: int
92
+ credential_type: str
93
+ fields: dict[str, str] = {}
94
+
95
+
96
+ class NodeCredentialCreate(BaseModel):
97
+ credential_id: int
98
+
99
+
100
+ class NodeCredentialResponse(PersistedResponse):
101
+ node_id: int
102
+ credential_id: int
103
+ credential_name: str | None = None
104
+ credential_type: str | None = None
@@ -12,6 +12,18 @@ class InfluxDBVersion(StrEnum):
12
12
  v3 = "v3"
13
13
 
14
14
 
15
+ class SnmpVersion(StrEnum):
16
+ v2c = "2c"
17
+ v3 = "3"
18
+ both = "both"
19
+
20
+
21
+ class SnmpSecLevel(StrEnum):
22
+ no_auth_no_priv = "noAuthNoPriv"
23
+ auth_no_priv = "authNoPriv"
24
+ auth_priv = "authPriv"
25
+
26
+
15
27
  class OutputDestinationBase(BaseModel):
16
28
  influxdb_version: InfluxDBVersion = InfluxDBVersion.v2
17
29
  url: str = "http://localhost:8086"
@@ -62,6 +74,18 @@ class TelemetryAgentMatchRuleCreate(TelemetryAgentMatchRuleBase):
62
74
  class TelemetryAgentBase(BaseModel):
63
75
  name: str
64
76
  description: str | None = None
77
+ snmp_version: SnmpVersion = SnmpVersion.v2c
78
+ snmp_trap_port: int = 162
79
+ syslog_port: int = 514
80
+ snmpv3_sec_level: SnmpSecLevel | None = None
81
+ # Inline security name — only used with noAuthNoPriv (no credential needed).
82
+ # With authNoPriv/authPriv the username comes from the mapped credential.
83
+ snmpv3_sec_name: str | None = None
84
+ # References to Credentials holding trap receiver secrets.
85
+ # snmpv2c_credential_id → credential of type "snmp_community" (field: community)
86
+ # snmpv3_credential_id → credential of type "snmpv3" (fields: username/auth_*/priv_*)
87
+ snmpv2c_credential_id: int | None = None
88
+ snmpv3_credential_id: int | None = None
65
89
 
66
90
 
67
91
  class TelemetryAgentCreate(TelemetryAgentBase):
@@ -72,6 +96,13 @@ class TelemetryAgentUpdate(BaseModel):
72
96
  name: str | None = None
73
97
  description: str | None = None
74
98
  capabilities: list[TelemetryCapability] | None = None
99
+ snmp_version: SnmpVersion | None = None
100
+ snmp_trap_port: int | None = None
101
+ syslog_port: int | None = None
102
+ snmpv3_sec_level: SnmpSecLevel | None = None
103
+ snmpv3_sec_name: str | None = None
104
+ snmpv2c_credential_id: int | None = None
105
+ snmpv3_credential_id: int | None = None
75
106
 
76
107
 
77
108
  class TelemetryAgentAck(BaseModel):
@@ -88,3 +119,22 @@ class TelemetryAgentResponse(PersistedResponse, TelemetryAgentBase):
88
119
  rules: list[TelemetryAgentMatchRuleResponse] = []
89
120
  resolved_nodes: list[int] = []
90
121
  outputs: list[OutputDestinationResponse] = []
122
+
123
+
124
+ __all__ = [
125
+ "InfluxDBVersion",
126
+ "OutputDestinationBase",
127
+ "OutputDestinationCreate",
128
+ "OutputDestinationResponse",
129
+ "OutputDestinationUpdate",
130
+ "SnmpSecLevel",
131
+ "SnmpVersion",
132
+ "TelemetryAgentAck",
133
+ "TelemetryAgentBase",
134
+ "TelemetryAgentCreate",
135
+ "TelemetryAgentMatchRuleBase",
136
+ "TelemetryAgentMatchRuleCreate",
137
+ "TelemetryAgentMatchRuleResponse",
138
+ "TelemetryAgentResponse",
139
+ "TelemetryAgentUpdate",
140
+ ]
@@ -1,51 +0,0 @@
1
- from pydantic import BaseModel
2
-
3
- from acex_devkit.models.base import PersistedResponse
4
-
5
-
6
- class CredentialFieldBase(BaseModel):
7
- field_name: str
8
- sensitive: bool = True
9
-
10
-
11
- class CredentialBase(BaseModel):
12
- name: str
13
- credential_type: str
14
- source: str = "local"
15
- vault_path: str | None = None
16
-
17
-
18
- class CredentialFieldResponse(CredentialFieldBase):
19
- field_value: str | None = None
20
-
21
-
22
- class CredentialResponse(PersistedResponse, CredentialBase):
23
- fields: list[CredentialFieldResponse] = []
24
-
25
-
26
- class CredentialCreate(CredentialBase):
27
- fields: dict[str, str]
28
-
29
-
30
- class CredentialUpdate(BaseModel):
31
- name: str | None = None
32
- source: str | None = None
33
- vault_path: str | None = None
34
- fields: dict[str, str] | None = None
35
-
36
-
37
- class CredentialSecret(BaseModel):
38
- id: int
39
- credential_type: str
40
- fields: dict[str, str] = {}
41
-
42
-
43
- class NodeCredentialCreate(BaseModel):
44
- credential_id: int
45
-
46
-
47
- class NodeCredentialResponse(PersistedResponse):
48
- node_id: int
49
- credential_id: int
50
- credential_name: str | None = None
51
- credential_type: str | None = None
File without changes