Files
AirlockTools/models/agent.py
T
2025-11-06 11:04:59 -05:00

72 lines
2.2 KiB
Python

# Copyright (C) 2025 James Brotosky, Brandon Wickline
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
from dataclasses import dataclass, field
from typing import ClassVar, List, Optional
from models.policy import Policy
@dataclass
class Agent:
agentid: str
clientversion: str
domain: str
freespace: int
groupid: str # Changed to str to match UUID-style IDs
hostname: str
ip: str
localip: str
lastcheckin: str
os: str
policyversion: str
status: int # raw status code
username: str
groupname: Optional[str] = field(default=None)
status_text: Optional[str] = field(default=None)
# Class-level status map
status_map: ClassVar[dict] = {0: "Offline", 1: "Online", 2: "Hidden", 3: "Safemode"}
def enrich_with_policies(self, policies: List[Policy]):
"""Enrich the agent with groupname and human-readable status."""
self.status_text = self.status_map.get(self.status, "Unknown")
for policy in policies:
if policy.groupid == self.groupid:
self.groupname = policy.name
break
if not self.groupname:
self.groupname = "Unknown"
"""
from models.agent import Agent
from modesls.policy
# Step 1: Load data from API
policies = [Policy(**row['data']) for _, row in api.policy_find_all().iterrows()]
agents = [Agent(**row['data']) for _, row in api.agent_find_all().iterrows()]
# Step 2: Create groupid → groupname map
groupid_to_name = {policy.groupid: policy.name for policy in policies}
# Step 3: Enrich agents
for agent in agents:
agent.enrich_with_policies(groupid_to_name)
"""