Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
73a5ef4
Added skeleton for Software Management. Interaction with Fleet
andrii-flamingo Sep 7, 2026
8953fb0
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 7, 2026
70780b6
Removed redundant javadocs
andrii-flamingo Sep 7, 2026
4ce94f3
Merge remote-tracking branch 'origin/feature/software-management-api'…
andrii-flamingo Sep 7, 2026
6435f56
Removed redundant javadocs
andrii-flamingo Sep 7, 2026
4854b20
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 7, 2026
db40031
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 7, 2026
0ecf66b
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 8, 2026
87a4757
Merge remote-tracking branch 'origin/feature/software-management-api'…
andrii-flamingo Sep 8, 2026
1be49a4
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 8, 2026
81812ea
Updated API for Software. Added API for Vulnerabilities.
andrii-flamingo Sep 8, 2026
9b1ad0d
Merge remote-tracking branch 'origin/feature/software-management-api'…
andrii-flamingo Sep 8, 2026
4d884e9
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 8, 2026
8e2d88f
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 8, 2026
0685e67
Merge branch 'main' into feature/software-management-api
michaelassraf Sep 8, 2026
ecf4b23
Merge branch 'main' into feature/software-management-api
michaelassraf Sep 9, 2026
505224f
Merge branch 'main' into feature/software-management-api
michaelassraf Sep 9, 2026
d667e21
Updated API for Vulnerabilities
andrii-flamingo Sep 9, 2026
3476333
Merge remote-tracking branch 'origin/feature/software-management-api'…
andrii-flamingo Sep 9, 2026
4f1df9a
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 10, 2026
4d3cbe9
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 10, 2026
d08d9e1
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 10, 2026
37c579b
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 11, 2026
3ed461c
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 11, 2026
c5fe675
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 12, 2026
7760af5
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 14, 2026
3660e3e
Added Software Schedule Run using assign devices by Criteria
andrii-flamingo Sep 14, 2026
6466e64
Fixed API for Vulnerabilities
andrii-flamingo Sep 14, 2026
8d8f974
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 14, 2026
1414249
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 14, 2026
e7fd34f
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 15, 2026
40b00e4
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 17, 2026
096e5af
Added Bundle level
andrii-flamingo Sep 17, 2026
771ee1e
Added MachinePlatformResolverTest
andrii-flamingo Sep 17, 2026
6078df9
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 17, 2026
dc0e0c6
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 17, 2026
642ba27
Changed logic for schedule and run now
andrii-flamingo Sep 17, 2026
ca78598
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 17, 2026
1677a2d
Added API for Actions
andrii-flamingo Sep 17, 2026
ffeb4ff
Merge remote-tracking branch 'origin/feature/software-management-api'…
andrii-flamingo Sep 17, 2026
03978ad
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 18, 2026
8b47068
Added Action Executions
andrii-flamingo Sep 18, 2026
eb27ba0
Merge remote-tracking branch 'origin/feature/software-management-api'…
andrii-flamingo Sep 18, 2026
22e688d
Added filters to SoftwareActionDataFetcher
andrii-flamingo Sep 18, 2026
af4b7a5
Added SoftwareAction
andrii-flamingo Sep 18, 2026
b4e631d
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 18, 2026
b40e84d
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 18, 2026
43c868a
Aligned bundle API
andrii-flamingo Sep 19, 2026
1816a91
Merge remote-tracking branch 'origin/feature/software-management-api'…
andrii-flamingo Sep 19, 2026
3516106
Updated Vulnerability logic
andrii-flamingo Sep 19, 2026
221b9d5
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 19, 2026
40c7aa3
Updated bundle logic
andrii-flamingo Sep 19, 2026
ce3b33c
Merge remote-tracking branch 'origin/feature/software-management-api'…
andrii-flamingo Sep 19, 2026
95d6de1
Save SoftwareActionResult once bundle is submitted
andrii-flamingo Sep 19, 2026
04f6a8a
Added validation
andrii-flamingo Sep 19, 2026
b303fc8
Refactored logic integration with Fleet
andrii-flamingo Sep 20, 2026
3e3045c
Added FleetDeviceCountEnricher
andrii-flamingo Sep 20, 2026
b90de5d
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 20, 2026
61aa1a5
Removed dead methods
andrii-flamingo Sep 21, 2026
c936b6c
Merge remote-tracking branch 'origin/feature/software-management-api'…
andrii-flamingo Sep 21, 2026
5e7fc41
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 21, 2026
206444e
Changed publishedAt to discoveredAt
andrii-flamingo Sep 21, 2026
31d0e48
Merge remote-tracking branch 'origin/feature/software-management-api'…
andrii-flamingo Sep 21, 2026
f858c92
Renamed methods in IntegratedTool
andrii-flamingo Sep 21, 2026
74d031e
Removed redundant comments
andrii-flamingo Sep 21, 2026
1da7bfc
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 21, 2026
3ad6b2a
Removed redundant comments
andrii-flamingo Sep 21, 2026
8ed41e5
Merge remote-tracking branch 'origin/feature/software-management-api'…
andrii-flamingo Sep 21, 2026
7cc9eb7
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 21, 2026
1e65d8d
Added softwareAction-execution aggregation
andrii-flamingo Sep 21, 2026
097715f
Merge remote-tracking branch 'origin/feature/software-management-api'…
andrii-flamingo Sep 21, 2026
51de17d
Merge branch 'main' into feature/software-management-api
andrii-flamingo Sep 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,6 @@
import lombok.Builder;
import lombok.Data;

/**
* Result of a fire-and-forget RMM dispatch over core NATS — running a command,
* cancelling an in-flight execution, or running a saved script. Carries the
* server-minted {@code executionId} the dashboard uses to correlate the agent's
* asynchronous result.
*
* <p>Shared by all dispatch mutations ({@code runCommand}, {@code cancelExecution},
* {@code runScript}): they are structurally identical, so a single type avoids
* three duplicate one-field DTOs.
*/
@Data
@Builder
public class DispatchResponse {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,6 @@
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* One option for a scripts-list filter dropdown: the raw {@code value} to filter by,
* a human {@code label} to show, and the {@code count} of matching scripts. Mirrors
* {@code DeviceFilterOption}.
*/
@Data
@Builder
@NoArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.openframe.api.dto.rmm.software;

import com.openframe.data.document.rmm.software.SoftwareAction;
import com.openframe.data.document.rmm.software.SoftwareBundleMode;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;

import java.time.Instant;
import java.util.List;

@Data
public class CreateSoftwareBundleInput {

@NotNull(message = "action must not be null")
private SoftwareAction action;

@NotNull(message = "mode must not be null")
private SoftwareBundleMode mode;

@NotEmpty(message = "machineIds must not be empty")
private List<@Pattern(regexp = "^[A-Za-z0-9_-]+$",
message = "each machineId must be a single subject-safe token (A-Za-z0-9_-)") String> machineIds;

@Valid
private List<SoftwarePackageInput> packages;

private Instant startAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.openframe.api.dto.rmm.software;

import com.openframe.data.document.rmm.software.SoftwareActionStatus;
import lombok.Data;

import java.util.List;

@Data
public class SoftwareActionDeviceFilterInput {

private List<SoftwareActionStatus> statuses;
private List<String> organizationIds;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.openframe.api.dto.rmm.software;

import com.openframe.data.document.rmm.software.SoftwareActionStatus;
import lombok.Builder;
import lombok.Data;

import java.time.Instant;

@Data
@Builder
public class SoftwareActionDeviceResponse {

private String machineId;
private String hostname;
private String organizationId;
private String organizationName;
private SoftwareActionStatus status;

private Integer exitCode;
private String stdout;
private Boolean stdoutTruncated;
private String stderr;
private Boolean stderrTruncated;
private String error;

private Instant dispatchedAt;
private Instant finishedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.openframe.api.dto.rmm.software;

import com.openframe.data.document.packagesearch.PackageManagerType;
import com.openframe.data.document.rmm.software.SoftwareAction;
import com.openframe.data.document.rmm.software.SoftwareActionStatus;
import lombok.Data;

import java.util.List;

@Data
public class SoftwareActionFilterInput {

private List<SoftwareActionStatus> statuses;
private List<SoftwareAction> actions;
private List<PackageManagerType> engines;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.openframe.api.dto.rmm.software;

import com.openframe.api.dto.rmm.script.ScriptFilterOption;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SoftwareActionFilters {

private List<ScriptFilterOption> statuses;
private List<ScriptFilterOption> actions;
private List<ScriptFilterOption> engines;
private Integer filteredCount;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.openframe.api.dto.rmm.software;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

public record SoftwareActionId(String executionId, String bundleId, String scheduleId) {

private static final String SEP = ":"; // absent in UUIDs / Mongo ObjectIds, and not regex-special

public String encode() {
String raw = nullToEmpty(executionId) + SEP + nullToEmpty(bundleId) + SEP + nullToEmpty(scheduleId);
return Base64.getUrlEncoder().withoutPadding().encodeToString(raw.getBytes(StandardCharsets.UTF_8));
}

public static SoftwareActionId of(String executionId, String bundleId, String scheduleId) {
return new SoftwareActionId(executionId, bundleId, scheduleId);
}

public static SoftwareActionId decode(String actionId) {
if (actionId == null || actionId.isBlank()) {
return new SoftwareActionId(null, null, null);
}
try {
String raw = new String(Base64.getUrlDecoder().decode(actionId), StandardCharsets.UTF_8);
String[] parts = raw.split(SEP, -1);
if (parts.length == 3) {
return new SoftwareActionId(emptyToNull(parts[0]), emptyToNull(parts[1]), emptyToNull(parts[2]));
}
} catch (IllegalArgumentException ignored) {
}
return new SoftwareActionId(actionId, null, null);
}

private static String nullToEmpty(String s) {
return s == null ? "" : s;
}

private static String emptyToNull(String s) {
return s == null || s.isEmpty() ? null : s;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.openframe.api.dto.rmm.software;

import com.openframe.data.document.packagesearch.PackageManagerType;
import com.openframe.data.document.rmm.software.SoftwareAction;
import com.openframe.data.document.rmm.software.SoftwareActionStatus;
import lombok.Builder;
import lombok.Data;

import java.time.Instant;

@Data
@Builder
public class SoftwareActionResponse {

private String id;
private String executionId;

private String software;
private SoftwareAction action;
private PackageManagerType engine;
private SoftwareActionStatus status;

private int totalMachineCount;
private int respondedMachineCount;

private Instant scheduledAt;
private Instant dispatchedAt;
private Instant finishedAt;
private String initiatedBy;

private String bundleId;
private String scheduleId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.openframe.api.dto.rmm.software;

import com.openframe.data.document.rmm.software.SoftwareAction;
import com.openframe.data.document.rmm.software.SoftwareBundleMode;
import com.openframe.data.document.rmm.software.SoftwareBundlePackage;
import com.openframe.data.document.rmm.software.SoftwareBundleStatus;
import lombok.Builder;
import lombok.Data;

import java.time.Instant;
import java.util.List;

@Data
@Builder
public class SoftwareBundleResponse {

private String id;
private SoftwareAction action;
private SoftwareBundleMode mode;
private SoftwareBundleStatus status;
private List<String> machineIds;
private List<SoftwareBundlePackage> packages;
private Instant startAt;
private String scheduleId;
private String createdBy;
private Instant createdAt;
private Instant updatedAt;
private Instant completedAt;
private List<String> executionIds;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.openframe.api.dto.rmm.software;

import com.openframe.data.document.rmm.schedule.ScheduleOfflineBehavior;
import com.openframe.data.document.rmm.schedule.ScheduleTimeReference;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

import java.time.Instant;

@Data
public class SoftwareBundleScheduleInput {

private String name;
private String description;
private ScheduleTimeReference timeReference;
private ScheduleOfflineBehavior offlineBehavior;
private Long reconnectWindowSeconds;

@NotNull(message = "startAt is required")
private Instant startAt;

private Long repeat;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.openframe.api.dto.rmm.software;

public enum SoftwareCveSeverity {
CRITICAL,
HIGH,
MEDIUM,
LOW,
NONE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.openframe.api.dto.rmm.software;

import lombok.Data;

import java.util.List;

@Data
public class SoftwareFilterInput {

private List<SoftwareSource> sources;

private List<SoftwareVersionStatus> versionStatuses;

private SoftwareCveSeverity minSeverity;

private List<String> deviceTagIds;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.openframe.api.dto.rmm.software;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class SoftwareFilterOption {

private String value;
private String label;
private int count;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.openframe.api.dto.rmm.software;

import lombok.Builder;
import lombok.Data;

import java.util.List;

@Data
@Builder
public class SoftwareFilters {

private List<SoftwareFilterOption> sources;
private List<SoftwareFilterOption> versionStatuses;
private List<SoftwareFilterOption> severities;

public static SoftwareFilters empty() {
return SoftwareFilters.builder()
.sources(List.of())
.versionStatuses(List.of())
.severities(List.of())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.openframe.api.dto.rmm.software;

import com.openframe.data.document.device.Machine;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class SoftwareOnDeviceResponse {

private Machine device;
private String softwareVersion;
private SoftwareOnDeviceStatus status;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.openframe.api.dto.rmm.software;

public enum SoftwareOnDeviceStatus {
UP_TO_DATE,
OUTDATED,
SCHEDULED_UPDATE,
UNINSTALLING,
SCHEDULED_UNINSTALL
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ public class SoftwarePackageInput {
@NotBlank
private String packageName;

/** Brew-only sub-type (CASK/FORMULA). Required for brew (enforced by its handler), ignored by managers that do not distinguish. */
private BrewPackageType brewPackageType;
private String version;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.openframe.api.dto.rmm.software;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SoftwareResponse {
private String id;
private String name;
private String publisher;
private SoftwareSource source;
private String currentVersion;
private String latestVersion;
private SoftwareVersionStatus versionStatus;
private Integer olderVersionsCount;
private Integer devicesCount;
private SoftwareVulnerabilitySummaryResponse vulnerabilitySummary;
private Boolean cpeMatched;
}
Loading
Loading