Skip to content

Commit ab10946

Browse files
author
Marek Safarik
committed
Better file structure, clean up, new option for makefile
Signed-off-by: Marek Safarik <[email protected]>
1 parent 4991e48 commit ab10946

File tree

5 files changed

+78
-110
lines changed

5 files changed

+78
-110
lines changed

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ help:
1414
@echo " make logs - View logs"
1515
@echo " make ps - List containers"
1616
@echo " make clean - Remove all"
17+
@echo " make mcp - Build MCP server"
1718

1819
.env:
1920
@if [ ! -f .env ]; then \
@@ -40,3 +41,6 @@ ps:
4041
clean:
4142
podman-compose -f compose.yml down -v
4243
podman system prune -f
44+
45+
mcp:
46+
cd backend && go build -o server *.go

backend/helpers.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"log"
7+
)
8+
9+
// fetchAllAgentUUIDs retrieves list of all registered agent UUIDs from registrar
10+
func fetchAllAgentUUIDs() ([]string, error) {
11+
resp, err := keylimeRegistrarClient.Get("agents")
12+
if err != nil {
13+
log.Printf("Error fetching agents: %v", err)
14+
return nil, err
15+
}
16+
defer resp.Body.Close()
17+
18+
var agents keylimeAgentListResponse
19+
err = json.NewDecoder(resp.Body).Decode(&agents)
20+
if err != nil {
21+
log.Printf("Error decoding agents: %v", err)
22+
return nil, err
23+
}
24+
25+
return agents.Results.UUIDs, nil
26+
}
27+
28+
// fetchAgentDetails retrieves detailed status information for a specific agent
29+
func fetchAgentDetails(agentUUID string) (keylimeAgentStatusResponse, error) {
30+
resp, err := keylimeVerifierClient.Get(fmt.Sprintf("agents/%s", agentUUID))
31+
if err != nil {
32+
log.Printf("Error fetching agent status: %v", err)
33+
return keylimeAgentStatusResponse{}, err
34+
}
35+
defer resp.Body.Close()
36+
37+
var agentStatus keylimeAgentStatusResponse
38+
err = json.NewDecoder(resp.Body).Decode(&agentStatus)
39+
if err != nil {
40+
log.Printf("Error decoding agent status: %v", err)
41+
return keylimeAgentStatusResponse{}, err
42+
}
43+
44+
return agentStatus, nil
45+
}
46+
47+
// mapAgentToOutput converts API response to standardized output format
48+
func mapAgentToOutput(agentUUID string, agentStatus keylimeAgentStatusResponse) getAgentStatusOutput {
49+
return getAgentStatusOutput{
50+
AgentUUID: agentUUID,
51+
OperationalState: agentStatus.Results.OperationalState,
52+
OperationalStateDescription: stateToString(agentStatus.Results.OperationalState),
53+
AttestationCount: agentStatus.Results.AttestationCount,
54+
LastReceivedQuote: agentStatus.Results.LastReceivedQuote,
55+
LastSuccessfulAttestation: agentStatus.Results.LastSuccessfulAttestation,
56+
SeverityLevel: agentStatus.Results.SeverityLevel,
57+
LastEventID: agentStatus.Results.LastEventID,
58+
HashAlgorithm: agentStatus.Results.HashAlg,
59+
EncryptionAlgorithm: agentStatus.Results.EncAlg,
60+
SigningAlgorithm: agentStatus.Results.SignAlg,
61+
VerifierID: agentStatus.Results.VerifierID,
62+
VerifierAddress: fmt.Sprintf("%s:%d", agentStatus.Results.VerifierIP, agentStatus.Results.VerifierPort),
63+
HasMeasuredBoot: agentStatus.Results.HasMbRefstate != 0,
64+
HasRuntimePolicy: agentStatus.Results.HasRuntimePolicy != 0,
65+
}
66+
}

backend/server

-4.82 KB
Binary file not shown.

backend/tools.go

Lines changed: 8 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@ package main
22

33
import (
44
"context"
5-
"encoding/json"
6-
"fmt"
7-
"log"
85

96
"github.com/modelcontextprotocol/go-sdk/mcp"
107
)
@@ -14,113 +11,46 @@ func getAllAgents(ctx context.Context, req *mcp.CallToolRequest, _ getAllAgentsI
1411
getAllAgentsOutput,
1512
error,
1613
) {
17-
resp, err := keylimeRegistrarClient.Get("agents")
14+
uuids, err := fetchAllAgentUUIDs()
1815
if err != nil {
19-
log.Printf("Error fetching agents: %v", err)
2016
return nil, getAllAgentsOutput{}, err
2117
}
22-
defer resp.Body.Close()
2318

24-
var agents keylimeAgentListResponse
25-
err = json.NewDecoder(resp.Body).Decode(&agents)
26-
if err != nil {
27-
log.Printf("Error decoding agents: %v", err)
28-
return nil, getAllAgentsOutput{}, err
29-
}
30-
31-
return nil, getAllAgentsOutput{Agents: agents.Results.UUIDs}, nil
19+
return nil, getAllAgentsOutput{Agents: uuids}, nil
3220
}
3321

3422
func getAgentStatus(ctx context.Context, req *mcp.CallToolRequest, input getAgentStatusInput) (
3523
*mcp.CallToolResult,
3624
getAgentStatusOutput,
3725
error,
3826
) {
39-
resp, err := keylimeVerifierClient.Get(fmt.Sprintf("agents/%s", input.AgentUUID))
27+
agentStatus, err := fetchAgentDetails(input.AgentUUID)
4028
if err != nil {
41-
log.Printf("Error fetching agent status: %v", err)
4229
return nil, getAgentStatusOutput{}, err
4330
}
44-
defer resp.Body.Close()
4531

46-
var agentStatus keylimeAgentStatusResponse
47-
err = json.NewDecoder(resp.Body).Decode(&agentStatus)
48-
if err != nil {
49-
log.Printf("Error decoding agent status: %v", err)
50-
return nil, getAgentStatusOutput{}, err
51-
}
52-
53-
return nil, getAgentStatusOutput{
54-
AgentUUID: input.AgentUUID,
55-
OperationalState: agentStatus.Results.OperationalState,
56-
OperationalStateDescription: stateToString(agentStatus.Results.OperationalState),
57-
IP: agentStatus.Results.IP,
58-
Port: agentStatus.Results.Port,
59-
AttestationCount: agentStatus.Results.AttestationCount,
60-
LastReceivedQuote: agentStatus.Results.LastReceivedQuote,
61-
LastSuccessfulAttestation: agentStatus.Results.LastSuccessfulAttestation,
62-
SeverityLevel: agentStatus.Results.SeverityLevel,
63-
LastEventID: agentStatus.Results.LastEventID,
64-
}, nil
32+
return nil, mapAgentToOutput(input.AgentUUID, agentStatus), nil
6533
}
6634

6735
func getFailedAgents(ctx context.Context, req *mcp.CallToolRequest, input getFailedAgentsInput) (
6836
*mcp.CallToolResult,
6937
getFailedAgentsOutput,
7038
error,
7139
) {
72-
resp, err := keylimeRegistrarClient.Get("agents")
40+
uuids, err := fetchAllAgentUUIDs()
7341
if err != nil {
74-
log.Printf("Error fetching agents: %v", err)
75-
return nil, getFailedAgentsOutput{}, err
76-
}
77-
defer resp.Body.Close()
78-
79-
var agents keylimeAgentListResponse
80-
err = json.NewDecoder(resp.Body).Decode(&agents)
81-
if err != nil {
82-
log.Printf("Error decoding agents: %v", err)
8342
return nil, getFailedAgentsOutput{}, err
8443
}
8544

8645
var failedAgents getFailedAgentsOutput
87-
for _, agentUUID := range agents.Results.UUIDs {
88-
agentResp, err := keylimeVerifierClient.Get(fmt.Sprintf("agents/%s", agentUUID))
89-
if err != nil {
90-
log.Printf("Error fetching agent status: %v", err)
91-
return nil, getFailedAgentsOutput{}, err
92-
}
93-
94-
var agentStatus keylimeAgentStatusResponse
95-
err = json.NewDecoder(agentResp.Body).Decode(&agentStatus)
96-
agentResp.Body.Close() // Close immediately after use
97-
46+
for _, agentUUID := range uuids {
47+
agentStatus, err := fetchAgentDetails(agentUUID)
9848
if err != nil {
99-
log.Printf("Error decoding agent status: %v", err)
10049
return nil, getFailedAgentsOutput{}, err
10150
}
10251

103-
// Check if agent is in failed state
10452
if agentStatus.Results.OperationalState == StateFailed {
105-
failedAgents.FailedAgents = append(failedAgents.FailedAgents, getAgentStatusOutput{
106-
AgentUUID: agentUUID,
107-
OperationalState: agentStatus.Results.OperationalState,
108-
OperationalStateDescription: stateToString(agentStatus.Results.OperationalState),
109-
IP: agentStatus.Results.IP,
110-
Port: agentStatus.Results.Port,
111-
AttestationCount: agentStatus.Results.AttestationCount,
112-
LastReceivedQuote: agentStatus.Results.LastReceivedQuote,
113-
LastSuccessfulAttestation: agentStatus.Results.LastSuccessfulAttestation,
114-
SeverityLevel: agentStatus.Results.SeverityLevel,
115-
LastEventID: agentStatus.Results.LastEventID,
116-
HashAlgorithm: agentStatus.Results.HashAlg,
117-
EncryptionAlgorithm: agentStatus.Results.EncAlg,
118-
SigningAlgorithm: agentStatus.Results.SignAlg,
119-
VerifierID: agentStatus.Results.VerifierID,
120-
VerifierAddress: fmt.Sprintf("%s:%d", agentStatus.Results.VerifierIP, agentStatus.Results.VerifierPort),
121-
HasMeasuredBoot: agentStatus.Results.HasMbRefstate != 0,
122-
HasRuntimePolicy: agentStatus.Results.HasRuntimePolicy != 0,
123-
})
53+
failedAgents.FailedAgents = append(failedAgents.FailedAgents, mapAgentToOutput(agentUUID, agentStatus))
12454
}
12555
}
12656

backend/types.go

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -109,36 +109,6 @@ type keylimeAgentStatusResponse struct {
109109

110110
type getFailedAgentsInput struct{}
111111

112-
type verifierAgentStatusResponse struct {
113-
Code int `json:"code"`
114-
Status string `json:"status"`
115-
Results struct {
116-
OperationalState int `json:"operational_state"`
117-
V string `json:"v"`
118-
IP string `json:"ip"`
119-
Port int `json:"port"`
120-
TPMPolicy string `json:"tpm_policy"`
121-
VTPMPolicy string `json:"vtpm_policy"`
122-
MetaData string `json:"meta_data"`
123-
HasMbRefstate int `json:"has_mb_refstate"`
124-
HasRuntimePolicy int `json:"has_runtime_policy"`
125-
AcceptTPMHashAlgs []string `json:"accept_tpm_hash_algs"`
126-
AcceptTPMEncryptionAlgs []string `json:"accept_tpm_encryption_algs"`
127-
AcceptTPMSigningAlgs []string `json:"accept_tpm_signing_algs"`
128-
HashAlg string `json:"hash_alg"`
129-
EncAlg string `json:"enc_alg"`
130-
SignAlg string `json:"sign_alg"`
131-
VerifierID string `json:"verifier_id"`
132-
VerifierIP string `json:"verifier_ip"`
133-
VerifierPort int `json:"verifier_port"`
134-
SeverityLevel int `json:"severity_level"`
135-
LastEventID string `json:"last_event_id"`
136-
AttestationCount int `json:"attestation_count"`
137-
LastReceivedQuote int `json:"last_received_quote"`
138-
LastSuccessfulAttestation int `json:"last_successful_attestation"`
139-
} `json:"results"`
140-
}
141-
142112
type getFailedAgentsOutput struct {
143113
FailedAgents []getAgentStatusOutput `json:"failed_agents"`
144114
}
@@ -151,8 +121,6 @@ type getAgentStatusOutput struct {
151121
AgentUUID string `json:"agent_uuid"`
152122
OperationalState int `json:"operational_state"`
153123
OperationalStateDescription string `json:"operational_state_description"`
154-
IP string `json:"ip"`
155-
Port int `json:"port"`
156124
AttestationCount int `json:"attestation_count"`
157125
LastReceivedQuote *int `json:"last_received_quote,omitempty"`
158126
LastSuccessfulAttestation *int `json:"last_successful_attestation,omitempty"`

0 commit comments

Comments
 (0)