Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 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
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
@@ -0,0 +1,24 @@
package com.openframe.api.dto.rmm.software;

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

import java.util.List;

@Data
public class CreateSoftwareBundleInput {

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

@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;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.openframe.api.dto.rmm.software;

import com.openframe.data.document.rmm.software.SoftwareAction;
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 SoftwareBundleStatus status;
private List<String> machineIds;
private List<SoftwareBundlePackage> packages;
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,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
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.openframe.api.dto.rmm.software;

import com.openframe.data.document.rmm.schedule.ScheduleDeviceCriteria;
import com.openframe.data.document.rmm.schedule.ScheduleDeviceSelectionMode;
import com.openframe.data.document.rmm.schedule.ScheduleOfflineBehavior;
import com.openframe.data.document.rmm.schedule.ScheduleScriptTrigger;
Expand All @@ -23,6 +24,7 @@ public class SoftwareScheduleResponse {
private SoftwareAction action;
private List<SoftwareSchedulePackage> packages;
private ScheduleDeviceSelectionMode selectionMode;
private ScheduleDeviceCriteria deviceCriteria;
private ScheduleScriptTrigger trigger;
private ScheduleTimeReference timeReference;
private ScheduleOfflineBehavior offlineBehavior;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.openframe.api.dto.rmm.software;

public enum SoftwareSource {
WINGET,
CHOCOLATEY,
BREW,
UNMANAGED
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.openframe.api.dto.rmm.software;

public enum SoftwareVersionStatus {
UP_TO_DATE,
OUTDATED,
UNKNOWN
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.openframe.api.dto.rmm.software;

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

import java.time.Instant;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SoftwareVulnerabilityResponse {
private String cveId;
private SoftwareCveSeverity severity;
private Double cvssScore;
private String affectedVersion;
private Instant publishedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
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 SoftwareVulnerabilitySummaryResponse {
private SoftwareCveSeverity highestSeverity;
private int cveCount;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.openframe.api.dto.rmm.software;

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Pattern;
import lombok.Data;

import java.util.List;

@Data
public class UpdateSoftwareBundleInput {

@NotBlank(message = "id must not be blank")
private String id;

@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;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.openframe.api.dto.rmm.vulnerability;

import com.openframe.api.dto.rmm.software.SoftwareSource;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

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

private String id;

private String name;

private SoftwareSource source;

private String version;

private Integer devicesCount;

private String resolvedInVersion;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.openframe.api.dto.rmm.vulnerability;

import com.openframe.api.dto.rmm.software.SoftwareCveSeverity;
import lombok.Data;

@Data
public class VulnerabilityFilterInput {

private SoftwareCveSeverity minSeverity;

private Boolean exploited;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.openframe.api.dto.rmm.vulnerability;

import com.openframe.api.dto.rmm.software.SoftwareCveSeverity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

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

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

private String cveId;

private SoftwareCveSeverity severity;

private Double cvssScore;

private Double epssProbability;

private Boolean cisaKnownExploit;

private Instant publishedAt;

private String detailsLink;

private Integer devicesCount;

private String description;

private String resolvedInVersion;

private List<AffectedSoftwareResponse> affectedSoftware;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.openframe.api.dto.shared;

import java.util.List;

public record PageResult<T>(List<T> items, boolean hasNext, boolean hasPrevious, int filteredCount, int page) {

public static <T> PageResult<T> empty(int page) {
return new PageResult<>(List.of(), false, false, 0, page);
}
}
Loading
Loading