2023-12-12 22:21:44 +00:00
import { startCase } from "lodash" ;
2021-04-27 20:55:33 +00:00
import PropTypes from "prop-types" ;
2024-07-16 17:16:57 +00:00
import { IconNames } from "components/icons" ;
2025-02-06 16:47:09 +00:00
import { HOST_APPLE_PLATFORMS , Platform } from "./platform" ;
2023-12-12 21:03:33 +00:00
import vulnerabilityInterface from "./vulnerability" ;
2024-12-19 17:09:38 +00:00
import { ILabelSoftwareTitle } from "./label" ;
2025-10-28 16:44:17 +00:00
import { IMdmCommandResult } from "./mdm" ;
2021-04-27 20:55:33 +00:00
export default PropTypes . shape ( {
type : PropTypes . string ,
name : PropTypes.string ,
version : PropTypes.string ,
2021-07-15 17:01:52 +00:00
source : PropTypes.string ,
2021-04-27 20:55:33 +00:00
id : PropTypes.number ,
2021-07-15 17:01:52 +00:00
vulnerabilities : PropTypes.arrayOf ( vulnerabilityInterface ) ,
2021-04-27 20:55:33 +00:00
} ) ;
2021-07-15 17:01:52 +00:00
2022-11-18 16:25:39 +00:00
export interface ISoftwareResponse {
counts_updated_at : string ;
software : ISoftware [ ] ;
}
export interface ISoftwareCountResponse {
count : number ;
}
export interface IGetSoftwareByIdResponse {
software : ISoftware ;
}
2023-12-12 21:03:33 +00:00
// TODO: old software interface. replaced with ISoftwareVersion
// check to see if we still need this.
2021-07-15 17:01:52 +00:00
export interface ISoftware {
id : number ;
2021-09-29 04:04:58 +00:00
name : string ; // e.g., "Figma.app"
2025-11-13 17:06:14 +00:00
/** Custom name set per team by admin */
2025-11-07 14:59:30 +00:00
display_name? : string ; // e.g. "Figma for Desktop"
2021-09-29 04:04:58 +00:00
version : string ; // e.g., "2.1.11"
2023-03-23 16:32:32 +00:00
bundle_identifier? : string | null ; // e.g., "com.figma.Desktop"
2025-10-07 18:08:25 +00:00
application_id? : string | null ; // e.g., "us.zoom.videomeetings" for Android apps
source : string ; // "apps" | "ipados_apps" | "ios_apps" | "programs" | "rpm_packages" | "deb_packages" | "android_apps" | ?
2021-09-29 04:04:58 +00:00
generated_cpe : string ;
2023-12-12 21:03:33 +00:00
vulnerabilities : ISoftwareVulnerability [ ] | null ;
2023-03-23 16:32:32 +00:00
hosts_count? : number ;
2021-09-29 04:04:58 +00:00
last_opened_at? : string | null ; // e.g., "2021-08-18T15:11:35Z”
2023-05-18 13:35:58 +00:00
installed_paths? : string [ ] ;
2025-10-07 21:05:22 +00:00
extension_for? : string ;
2024-08-26 20:59:17 +00:00
vendor? : string ;
2025-09-05 22:31:03 +00:00
icon_url : string | null ; // Only available on team view if an admin uploaded an icon to a team's software
2021-07-15 17:01:52 +00:00
}
2022-04-07 19:12:38 +00:00
2025-09-05 22:31:03 +00:00
export type IVulnerabilitySoftware = Omit <
ISoftware ,
"vulnerabilities" | "icon_url"
> & {
2024-02-08 16:56:32 +00:00
resolved_in_version : string ;
} ;
2024-02-07 02:39:49 +00:00
2023-12-12 21:03:33 +00:00
export interface ISoftwareTitleVersion {
id : number ;
version : string ;
vulnerabilities : string [ ] | null ; // TODO: does this return null or is it omitted?
hosts_count? : number ;
}
2025-01-14 00:45:16 +00:00
export interface ISoftwareInstallPolicy {
2024-11-20 11:41:40 +00:00
id : number ;
name : string ;
}
2025-05-02 16:11:48 +00:00
export type SoftwareCategory =
| "Browsers"
| "Communication"
| "Developer tools"
| "Productivity" ;
2025-05-13 17:41:44 +00:00
export interface ISoftwarePackageStatus {
installed : number ;
pending_install : number ;
failed_install : number ;
pending_uninstall : number ;
failed_uninstall : number ;
}
export interface ISoftwareAppStoreAppStatus {
installed : number ;
pending : number ;
failed : number ;
}
2024-05-09 13:06:58 +00:00
export interface ISoftwarePackage {
name : string ;
2025-11-13 17:06:14 +00:00
/ * * N o t i n c l u d e d i n S o f t w a r e T i t l e s o f t w a r e . s o f t w a r e _ p a c k a g e r e s p o n s e , h o i s t e d u p o n e l e v e l
* Custom name set per team by admin
* /
2025-11-07 14:59:30 +00:00
display_name? : string ;
2025-05-21 15:31:39 +00:00
title_id : number ;
url : string ;
2024-05-09 13:06:58 +00:00
version : string ;
uploaded_at : string ;
install_script : string ;
2024-12-19 21:31:36 +00:00
uninstall_script : string ;
2024-05-09 13:06:58 +00:00
pre_install_query? : string ;
post_install_script? : string ;
2024-12-27 19:19:31 +00:00
automatic_install? : boolean ; // POST only
Update UI for software self-service features (#19244)
Issues https://github.com/fleetdm/fleet/issues/17587,
https://github.com/fleetdm/fleet/issues/18836,
https://github.com/fleetdm/fleet/issues/18837,
https://github.com/fleetdm/fleet/pull/18339, and
https://github.com/fleetdm/fleet/pull/18340
# TODOS
- Integrate backend
- Unit/integration tests
- Various todos noted in comments
- Cleanup styles and organization of components (de-duplicating and
consolidating where possible)
- Activity feed updates (if any)
# Checklist for submitter
If some of the following don't apply, delete the relevant line.
<!-- Note that API documentation changes are now addressed by the
product design team. -->
- [ ] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://fleetdm.com/docs/contributing/committing-changes#changes-files)
for more information.
- [ ] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements)
- [ ] Added support on fleet's osquery simulator `cmd/osquery-perf` for
new osquery data ingestion features.
- [ ] Added/updated tests
- [ ] If database migrations are included, checked table schema to
confirm autoupdate
- For database migrations:
- [ ] Checked schema for all modified table for columns that will
auto-update timestamps during migration.
- [ ] Confirmed that updating the timestamps is acceptable, and will not
cause unwanted side effects.
- [ ] Ensured the correct collation is explicitly set for character
columns (`COLLATE utf8mb4_unicode_ci`).
- [ ] Manual QA for all new/changed functionality
- For Orbit and Fleet Desktop changes:
- [ ] Manual QA must be performed in the three main OSs, macOS, Windows
and Linux.
- [ ] Auto-update manual QA, from released version of component to new
version (see [tools/tuf/test](../tools/tuf/test/README.md)).
---------
Co-authored-by: Gabriel Hernandez <ghernandez345@gmail.com>
2024-05-31 10:09:53 +00:00
self_service : boolean ;
2024-07-18 16:04:15 +00:00
icon_url : string | null ;
2025-05-13 17:41:44 +00:00
status : ISoftwarePackageStatus ;
2025-01-14 00:45:16 +00:00
automatic_install_policies? : ISoftwareInstallPolicy [ ] | null ;
2024-10-23 14:57:02 +00:00
install_during_setup? : boolean ;
2024-12-19 17:09:38 +00:00
labels_include_any : ILabelSoftwareTitle [ ] | null ;
labels_exclude_any : ILabelSoftwareTitle [ ] | null ;
2025-12-15 14:26:33 +00:00
categories? : SoftwareCategory [ ] | null ;
2025-05-13 17:41:44 +00:00
fleet_maintained_app_id? : number | null ;
2025-05-15 16:20:22 +00:00
hash_sha256? : string | null ;
2024-05-09 13:06:58 +00:00
}
2024-07-18 09:20:17 +00:00
export interface IAppStoreApp {
name : string ;
2025-11-13 17:06:14 +00:00
/ * * N o t i n c l u d e d i n S o f t w a r e T i t l e s o f t w a r e . a p p _ s t o r e _ a p p r e s p o n s e , h o i s t e d u p o n e l e v e l
* Custom name set per team by admin
* /
2025-11-07 14:59:30 +00:00
display_name? : string ;
2025-08-26 15:02:30 +00:00
app_store_id : string ; // API returns this as a string
2024-07-18 09:20:17 +00:00
latest_version : string ;
2025-02-24 21:01:55 +00:00
created_at : string ;
2024-07-18 09:20:17 +00:00
icon_url : string ;
2024-08-20 14:51:36 +00:00
self_service : boolean ;
2025-11-14 18:24:41 +00:00
platform : typeof HOST_APPLE_PLATFORMS [ number ] | "android" ;
2025-05-13 17:41:44 +00:00
status : ISoftwareAppStoreAppStatus ;
2024-10-23 14:57:02 +00:00
install_during_setup? : boolean ;
2025-01-14 00:45:16 +00:00
automatic_install_policies? : ISoftwareInstallPolicy [ ] | null ;
2025-02-24 21:01:55 +00:00
automatic_install? : boolean ;
2025-06-06 19:40:52 +00:00
last_install? : IAppLastInstall | null ;
2025-01-14 00:45:16 +00:00
last_uninstall ? : {
script_execution_id : string ;
uninstalled_at : string ;
} | null ;
version? : string ;
2025-02-03 22:10:22 +00:00
labels_include_any : ILabelSoftwareTitle [ ] | null ;
labels_exclude_any : ILabelSoftwareTitle [ ] | null ;
2025-12-15 14:26:33 +00:00
categories? : SoftwareCategory [ ] | null ;
configuration? : string ;
2024-07-18 09:20:17 +00:00
}
2025-12-15 14:26:33 +00:00
/ * *
* package : includes FMA , custom packages , and are defined under software_package
* app - store : includes VPP , Google Play Store apps and are defined under app_store_app
* /
export type InstallerType = "package" | "app-store" ;
export const isSoftwarePackage = (
data : ISoftwarePackage | IAppStoreApp
) : data is ISoftwarePackage = >
( data as ISoftwarePackage ) . install_script !== undefined ;
2024-07-18 09:20:17 +00:00
export interface ISoftwareTitle {
2023-12-12 21:03:33 +00:00
id : number ;
name : string ;
2025-11-13 17:06:14 +00:00
/** Custom name set per team by admin */
2025-11-07 14:59:30 +00:00
display_name? : string ;
2025-09-05 22:31:03 +00:00
icon_url : string | null ;
2023-12-12 21:03:33 +00:00
versions_count : number ;
2024-10-08 19:19:32 +00:00
source : SoftwareSource ;
2025-10-07 21:05:22 +00:00
extension_for? : SoftwareExtensionFor ;
2023-12-12 21:03:33 +00:00
hosts_count : number ;
2024-02-16 21:50:25 +00:00
versions : ISoftwareTitleVersion [ ] | null ;
2024-07-18 16:04:15 +00:00
software_package : ISoftwarePackage | null ;
app_store_app : IAppStoreApp | null ;
2025-10-07 21:05:22 +00:00
/** @deprecated Use extension_for instead */
browser? : string ;
Update UI for software self-service features (#19244)
Issues https://github.com/fleetdm/fleet/issues/17587,
https://github.com/fleetdm/fleet/issues/18836,
https://github.com/fleetdm/fleet/issues/18837,
https://github.com/fleetdm/fleet/pull/18339, and
https://github.com/fleetdm/fleet/pull/18340
# TODOS
- Integrate backend
- Unit/integration tests
- Various todos noted in comments
- Cleanup styles and organization of components (de-duplicating and
consolidating where possible)
- Activity feed updates (if any)
# Checklist for submitter
If some of the following don't apply, delete the relevant line.
<!-- Note that API documentation changes are now addressed by the
product design team. -->
- [ ] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://fleetdm.com/docs/contributing/committing-changes#changes-files)
for more information.
- [ ] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements)
- [ ] Added support on fleet's osquery simulator `cmd/osquery-perf` for
new osquery data ingestion features.
- [ ] Added/updated tests
- [ ] If database migrations are included, checked table schema to
confirm autoupdate
- For database migrations:
- [ ] Checked schema for all modified table for columns that will
auto-update timestamps during migration.
- [ ] Confirmed that updating the timestamps is acceptable, and will not
cause unwanted side effects.
- [ ] Ensured the correct collation is explicitly set for character
columns (`COLLATE utf8mb4_unicode_ci`).
- [ ] Manual QA for all new/changed functionality
- For Orbit and Fleet Desktop changes:
- [ ] Manual QA must be performed in the three main OSs, macOS, Windows
and Linux.
- [ ] Auto-update manual QA, from released version of component to new
version (see [tools/tuf/test](../tools/tuf/test/README.md)).
---------
Co-authored-by: Gabriel Hernandez <ghernandez345@gmail.com>
2024-05-31 10:09:53 +00:00
}
2024-07-18 09:20:17 +00:00
export interface ISoftwareTitleDetails {
id : number ;
name : string ;
2025-11-13 17:06:14 +00:00
/** Custom name set per team by admin */
2025-11-07 14:59:30 +00:00
display_name? : string ;
2025-09-05 22:31:03 +00:00
icon_url : string | null ;
Update UI for software self-service features (#19244)
Issues https://github.com/fleetdm/fleet/issues/17587,
https://github.com/fleetdm/fleet/issues/18836,
https://github.com/fleetdm/fleet/issues/18837,
https://github.com/fleetdm/fleet/pull/18339, and
https://github.com/fleetdm/fleet/pull/18340
# TODOS
- Integrate backend
- Unit/integration tests
- Various todos noted in comments
- Cleanup styles and organization of components (de-duplicating and
consolidating where possible)
- Activity feed updates (if any)
# Checklist for submitter
If some of the following don't apply, delete the relevant line.
<!-- Note that API documentation changes are now addressed by the
product design team. -->
- [ ] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://fleetdm.com/docs/contributing/committing-changes#changes-files)
for more information.
- [ ] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements)
- [ ] Added support on fleet's osquery simulator `cmd/osquery-perf` for
new osquery data ingestion features.
- [ ] Added/updated tests
- [ ] If database migrations are included, checked table schema to
confirm autoupdate
- For database migrations:
- [ ] Checked schema for all modified table for columns that will
auto-update timestamps during migration.
- [ ] Confirmed that updating the timestamps is acceptable, and will not
cause unwanted side effects.
- [ ] Ensured the correct collation is explicitly set for character
columns (`COLLATE utf8mb4_unicode_ci`).
- [ ] Manual QA for all new/changed functionality
- For Orbit and Fleet Desktop changes:
- [ ] Manual QA must be performed in the three main OSs, macOS, Windows
and Linux.
- [ ] Auto-update manual QA, from released version of component to new
version (see [tools/tuf/test](../tools/tuf/test/README.md)).
---------
Co-authored-by: Gabriel Hernandez <ghernandez345@gmail.com>
2024-05-31 10:09:53 +00:00
software_package : ISoftwarePackage | null ;
2024-07-18 09:20:17 +00:00
app_store_app : IAppStoreApp | null ;
2024-10-08 19:19:32 +00:00
source : SoftwareSource ;
2025-10-07 21:05:22 +00:00
extension_for? : SoftwareExtensionFor ;
2024-07-18 09:20:17 +00:00
hosts_count : number ;
versions : ISoftwareTitleVersion [ ] | null ;
2024-11-05 15:54:02 +00:00
counts_updated_at? : string ;
2024-07-18 09:20:17 +00:00
bundle_identifier? : string ;
versions_count? : number ;
2025-10-07 21:05:22 +00:00
/** @deprecated Use extension_for instead */
browser? : string ;
2023-12-12 21:03:33 +00:00
}
export interface ISoftwareVulnerability {
cve : string ;
details_link : string ;
cvss_score? : number | null ;
epss_probability? : number | null ;
cisa_known_exploit? : boolean | null ;
cve_published? : string | null ;
cve_description? : string | null ;
resolved_in_version? : string | null ;
2024-02-08 13:54:00 +00:00
created_at? : string | null ;
2023-12-12 21:03:33 +00:00
}
export interface ISoftwareVersion {
id : number ;
name : string ; // e.g., "Figma.app"
2025-11-13 17:06:14 +00:00
/** Custom name set per team by admin */
2025-11-07 14:59:30 +00:00
display_name? : string ; // e.g. "Figma for Desktop"
2023-12-12 21:03:33 +00:00
version : string ; // e.g., "2.1.11"
bundle_identifier? : string ; // e.g., "com.figma.Desktop"
2024-10-08 19:19:32 +00:00
source : SoftwareSource ;
2025-10-07 21:05:22 +00:00
extension_for : SoftwareExtensionFor ;
2023-12-12 21:03:33 +00:00
release : string ; // TODO: on software/verions/:id?
vendor : string ;
arch : string ; // e.g., "x86_64" // TODO: on software/verions/:id?
generated_cpe : string ;
vulnerabilities : ISoftwareVulnerability [ ] | null ;
hosts_count? : number ;
2025-10-07 21:05:22 +00:00
/** @deprecated Use extension_for instead */
browser? : string ;
2023-12-12 21:03:33 +00:00
}
2024-10-08 19:19:32 +00:00
export const SOURCE_TYPE_CONVERSION = {
2022-04-07 19:12:38 +00:00
apt_sources : "Package (APT)" ,
deb_packages : "Package (deb)" ,
portage_packages : "Package (Portage)" ,
rpm_packages : "Package (RPM)" ,
yum_sources : "Package (YUM)" ,
2025-10-24 18:54:57 +00:00
npm_packages : "Package (npm)" ,
2025-09-23 14:28:32 +00:00
pacman_packages : "Package (pacman)" ,
2023-12-04 19:26:26 +00:00
atom_packages : "Package (Atom)" , // Atom packages were removed from software inventory. Mapping is maintained for backwards compatibility. (2023-12-04)
2022-04-07 19:12:38 +00:00
python_packages : "Package (Python)" ,
2025-05-02 14:17:09 +00:00
tgz_packages : "Package (tar)" ,
2022-04-07 19:12:38 +00:00
apps : "Application (macOS)" ,
2024-07-30 17:14:25 +00:00
ios_apps : "Application (iOS)" ,
ipados_apps : "Application (iPadOS)" ,
2025-10-07 18:08:25 +00:00
android_apps : "Application (Android)" ,
2025-10-07 21:05:22 +00:00
chrome_extensions : "Browser plugin" , // chrome_extensions can include any chrome-based browser (e.g., edge), so we rely instead on the `extension_for` field computed by Fleet server and fallback to this value if it is not present.
2022-04-07 19:12:38 +00:00
firefox_addons : "Browser plugin (Firefox)" ,
safari_extensions : "Browser plugin (Safari)" ,
homebrew_packages : "Package (Homebrew)" ,
programs : "Program (Windows)" ,
ie_extensions : "Browser plugin (IE)" ,
chocolatey_packages : "Package (Chocolatey)" ,
pkg_packages : "Package (pkg)" ,
2025-10-07 21:05:22 +00:00
vscode_extensions : "IDE extension" , // vscode_extensions can include any vscode-based editor (e.g., Cursor, Trae, Windsurf), so we rely instead on the `extension_for` field computed by Fleet server and fallback to this value if it is not present.
2025-10-15 13:41:43 +00:00
sh_packages : "Payload-free (Linux)" ,
ps1_packages : "Payload-free (Windows)" ,
2025-10-14 15:01:45 +00:00
jetbrains_plugins : "IDE extension" , // jetbrains_plugins can include any JetBrains IDE (e.g., IntelliJ, PyCharm, WebStorm), so we rely instead on the `extension_for` field computed by Fleet server and fallback to this value if it is not present.
2022-06-08 19:01:38 +00:00
} as const ;
2022-04-07 19:12:38 +00:00
2024-10-08 19:19:32 +00:00
export type SoftwareSource = keyof typeof SOURCE_TYPE_CONVERSION ;
2025-01-14 00:45:16 +00:00
/** Map installable software source to platform */
export const INSTALLABLE_SOURCE_PLATFORM_CONVERSION = {
apt_sources : "linux" ,
deb_packages : "linux" ,
portage_packages : "linux" ,
rpm_packages : "linux" ,
yum_sources : "linux" ,
2025-09-23 14:28:32 +00:00
pacman_packages : "linux" ,
2025-05-02 14:17:09 +00:00
tgz_packages : "linux" ,
2025-01-14 00:45:16 +00:00
npm_packages : null ,
atom_packages : null ,
python_packages : null ,
apps : "darwin" ,
ios_apps : "ios" ,
ipados_apps : "ipados" ,
2025-10-07 18:08:25 +00:00
android_apps : "android" , // 4.76 Currently hidden upstream as not installable
2025-01-14 00:45:16 +00:00
chrome_extensions : null ,
firefox_addons : null ,
safari_extensions : null ,
homebrew_packages : "darwin" ,
programs : "windows" ,
ie_extensions : null ,
chocolatey_packages : "windows" ,
pkg_packages : "darwin" ,
vscode_extensions : null ,
2025-10-15 13:41:43 +00:00
sh_packages : "linux" , // 4.76 Added support for Linux hosts only
ps1_packages : "windows" ,
2025-10-14 15:01:45 +00:00
jetbrains_plugins : null ,
2025-01-14 00:45:16 +00:00
} as const ;
2025-10-15 13:41:43 +00:00
export const SCRIPT_PACKAGE_SOURCES = [ "sh_packages" , "ps1_packages" ] ;
export const NO_VERSION_OR_HOST_DATA_SOURCES = [
"tgz_packages" ,
. . . SCRIPT_PACKAGE_SOURCES ,
] ;
2025-01-14 00:45:16 +00:00
export type InstallableSoftwareSource = keyof typeof INSTALLABLE_SOURCE_PLATFORM_CONVERSION ;
2025-10-07 21:05:22 +00:00
const EXTENSION_FOR_TYPE_CONVERSION = {
// chrome versions
2023-12-12 22:21:44 +00:00
chrome : "Chrome" ,
chromium : "Chromium" ,
opera : "Opera" ,
yandex : "Yandex" ,
brave : "Brave" ,
edge : "Edge" ,
edge_beta : "Edge Beta" ,
2025-10-07 21:05:22 +00:00
// vscode versions
vscode : "VSCode" ,
vscode_insiders : "VSCode Insiders" ,
vscodium : "VSCodium" ,
vscodium_insiders : "VSCodium Insiders" ,
trae : "Trae" ,
windsurf : "Windsurf" ,
cursor : "Cursor" ,
2025-10-14 15:01:45 +00:00
// jebtbrains versions
clion : "CLion" ,
datagrip : "DataGrip" ,
goland : "GoLand" ,
intellij_idea : "IntelliJ IDEA" ,
intellij_idea_community_edition : "IntelliJ IDEA Community Edition" ,
phpstorm : "PhpStorm" ,
pycharm : "PyCharm" ,
pycharm_community_edition : "PyCharm Community Edition" ,
resharper : "ReSharper" ,
rider : "Rider" ,
rubymine : "RubyMine" ,
rust_rov : "RustRover" ,
webstorm : "WebStorm" ,
2023-12-12 22:21:44 +00:00
} as const ;
2025-10-07 21:05:22 +00:00
export type SoftwareExtensionFor =
| keyof typeof EXTENSION_FOR_TYPE_CONVERSION
| "" ;
2024-10-08 19:19:32 +00:00
2023-12-12 22:21:44 +00:00
export const formatSoftwareType = ( {
source ,
2025-10-07 21:05:22 +00:00
extension_for ,
2023-12-12 22:21:44 +00:00
} : {
2024-10-08 19:19:32 +00:00
source : SoftwareSource ;
2025-10-07 21:05:22 +00:00
extension_for? : SoftwareExtensionFor ;
2023-12-12 22:21:44 +00:00
} ) = > {
2024-10-08 19:19:32 +00:00
let type : string = SOURCE_TYPE_CONVERSION [ source ] || "Unknown" ;
2025-10-07 21:05:22 +00:00
if ( extension_for ) {
type += ` ( ${
EXTENSION_FOR_TYPE_CONVERSION [ extension_for ] || startCase ( extension_for )
2023-12-12 22:21:44 +00:00
} ) ` ;
}
return type ;
2022-04-07 19:12:38 +00:00
} ;
2024-05-10 15:57:47 +00:00
/ * *
* This list comprises all possible states of software install operations .
* /
2024-09-12 15:51:59 +00:00
export const SOFTWARE_UNINSTALL_STATUSES = [
"uninstalled" ,
"pending_uninstall" ,
"failed_uninstall" ,
] as const ;
export type SoftwareUninstallStatus = typeof SOFTWARE_UNINSTALL_STATUSES [ number ] ;
2024-05-10 15:57:47 +00:00
export const SOFTWARE_INSTALL_STATUSES = [
"installed" ,
2024-09-04 21:46:48 +00:00
"pending_install" ,
2024-09-12 15:51:59 +00:00
"failed_install" ,
2025-10-15 13:41:43 +00:00
] as const ;
// Payload-free (script) software statuses
export const SOFTWARE_SCRIPT_STATUSES = [
"ran_script" ,
"pending_script" ,
"failed_script" ,
] as const ;
export type SoftwareInstallStatus = typeof SOFTWARE_INSTALL_STATUSES [ number ] ;
export const SOFTWARE_INSTALL_UNINSTALL_STATUSES = [
. . . SOFTWARE_INSTALL_STATUSES ,
2024-09-12 15:51:59 +00:00
. . . SOFTWARE_UNINSTALL_STATUSES ,
2025-10-15 13:41:43 +00:00
// Payload-free (script) software statuses use API's SOFTWARE_INSTALL_STATUSES
2024-05-10 15:57:47 +00:00
] as const ;
2024-05-09 20:45:53 +00:00
/ *
2025-10-15 13:41:43 +00:00
* SoftwareInstallUninstallStatus represents the possible states of software install operations .
2024-05-09 20:45:53 +00:00
* /
2025-10-15 13:41:43 +00:00
export type SoftwareInstallUninstallStatus = typeof SOFTWARE_INSTALL_UNINSTALL_STATUSES [ number ] ;
/** Include payload-free statuses */
export const ENAHNCED_SOFTWARE_INSTALL_UNINSTALL_STATUSES = [
. . . SOFTWARE_INSTALL_STATUSES ,
. . . SOFTWARE_UNINSTALL_STATUSES ,
. . . SOFTWARE_SCRIPT_STATUSES , // Payload-free (script) software
] as const ;
2024-05-10 15:57:47 +00:00
2025-10-15 13:41:43 +00:00
/ *
* EnhancedSoftwareInstallUninstallStatus represents the possible states of software install operations including payload - free used in the UI .
* /
export type EnhancedSoftwareInstallUninstallStatus = typeof ENAHNCED_SOFTWARE_INSTALL_UNINSTALL_STATUSES [ number ] ;
export const isValidSoftwareInstallUninstallStatus = (
2024-09-12 15:51:59 +00:00
s : string | undefined | null
2025-10-15 13:41:43 +00:00
) : s is EnhancedSoftwareInstallUninstallStatus = >
! ! s &&
ENAHNCED_SOFTWARE_INSTALL_UNINSTALL_STATUSES . includes (
s as EnhancedSoftwareInstallUninstallStatus
) ;
2024-05-09 20:45:53 +00:00
2024-09-16 21:24:09 +00:00
export const SOFTWARE_AGGREGATE_STATUSES = [
"installed" ,
"pending" ,
"failed" ,
] as const ;
export type SoftwareAggregateStatus = typeof SOFTWARE_AGGREGATE_STATUSES [ number ] ;
export const isValidSoftwareAggregateStatus = (
s : string | undefined | null
) : s is SoftwareAggregateStatus = >
! ! s && SOFTWARE_AGGREGATE_STATUSES . includes ( s as SoftwareAggregateStatus ) ;
2024-09-12 15:51:59 +00:00
export const isSoftwareUninstallStatus = (
s : string | undefined | null
) : s is SoftwareUninstallStatus = >
! ! s && SOFTWARE_UNINSTALL_STATUSES . includes ( s as SoftwareUninstallStatus ) ;
// not a typeguard, as above 2 functions are
export const isPendingStatus = ( s : string | undefined | null ) = >
[ "pending_install" , "pending_uninstall" ] . includes ( s || "" ) ;
UI: Make consistent and update the Install and Uninstall detail modals for VPP and non-VPP apps across the Fleet UI (#31420)
# #30860
## Summary
* **New Features**
* Introduced dedicated modals for viewing install and uninstall details
for both VPP and non-VPP software, providing clearer and more consistent
information.
* Added support for displaying detailed install information for VPP host
software and improved handling of install status actions.
* Added an Inventory Versions modal to display detailed version history
for installed software on a host.
* **Improvements**
* Standardized and improved the design and behavior of install/uninstall
detail modals across the app.
* Refined callbacks and state management for launching modals from host
and self-service software tables.
* **Bug Fixes**
* Addressed issues with property naming and callback signatures in
install status handling.
* Addressed inconsistencies in displaying software details and status
across different components.
* **Refactor**
* Streamlined component props, callback signatures, and data models for
improved maintainability.
* Updated test cases and interfaces to align with the new modal and
callback structure.
* Removed legacy software details modal and related code, streamlining
the user interface.
* **Style**
* Updated modal and table styles for improved readability and
consistency.
## *Important note: Host software library modals for VPP apps currently
show only installed versions due to [an API bug that is being
addressed](https://github.com/fleetdm/fleet/issues/31459)
## Install details modal in various locations and states :
### Activity feeds (global, host details), non-VPP:

### Device user page self-service, non-VPP (with Retry functionality):

### Host software library, non-VPP:

### Activity feeds (global, host details), VPP apps:

### Device user page self-service, VPP apps (with Retry functionality):

### Uninstall modal samples - TODO
- [x] Changes file added for user-visible changes in `changes/`
## Testing
- [x] Added/updated automated tests
- [x] QA'd all new/changed functionality manually
---------
Co-authored-by: Jacob Shandling <jacob@fleetdm.com>
Co-authored-by: RachelElysia <rachel@fleetdm.com>
2025-08-01 19:45:09 +00:00
export const resolveUninstallStatus = (
activityStatus? : string
) : SoftwareUninstallStatus = > {
let resolvedStatus = activityStatus ;
if ( resolvedStatus === "pending" ) {
resolvedStatus = "pending_uninstall" ;
}
if ( resolvedStatus === "failed" ) {
resolvedStatus = "failed_uninstall" ;
}
if ( ! isSoftwareUninstallStatus ( resolvedStatus ) ) {
console . warn (
` Unexpected uninstall status " ${ activityStatus } " for activity. Defaulting to "pending_uninstall". `
) ;
resolvedStatus = "pending_uninstall" ;
}
return resolvedStatus as SoftwareUninstallStatus ;
} ;
2024-05-09 20:45:53 +00:00
/ * *
* ISoftwareInstallResult is the shape of a software install result object
* returned by the Fleet API .
* /
export interface ISoftwareInstallResult {
2024-09-12 15:51:59 +00:00
host_display_name? : string ;
2024-05-09 20:45:53 +00:00
install_uuid : string ;
software_title : string ;
software_title_id : number ;
software_package : string ;
host_id : number ;
2025-10-15 13:41:43 +00:00
status : SoftwareInstallUninstallStatus ;
2024-05-09 20:45:53 +00:00
detail : string ;
output : string ;
pre_install_query_output : string ;
post_install_script_output : string ;
2024-09-12 15:51:59 +00:00
created_at : string ;
updated_at : string | null ;
self_service : boolean ;
2024-05-09 20:45:53 +00:00
}
2025-10-15 13:41:43 +00:00
// Script results are only install results, never uninstall
export type ISoftwareScriptResult = Omit < ISoftwareInstallResult , " status " > & {
status : SoftwareInstallStatus ;
} ;
2024-05-09 20:45:53 +00:00
export interface ISoftwareInstallResults {
results : ISoftwareInstallResult ;
}
2024-05-09 21:44:50 +00:00
2025-10-28 16:44:17 +00:00
/** For Software .ipa installs, we use the install results API to return MDM command results */
export interface ISoftwareIpaInstallResults {
results : IMdmCommandResult ;
}
2024-05-09 21:44:50 +00:00
// ISoftwareInstallerType defines the supported installer types for
// software uploaded by the IT admin.
2024-10-01 16:02:13 +00:00
export type ISoftwareInstallerType = "pkg" | "msi" | "deb" | "rpm" | "exe" ;
2024-05-09 21:44:50 +00:00
export interface ISoftwareLastInstall {
install_uuid : string ;
installed_at : string ;
}
2024-07-24 19:32:59 +00:00
export interface IAppLastInstall {
command_uuid : string ;
installed_at : string ;
}
2025-05-23 13:09:06 +00:00
interface SignatureInformation {
installed_path : string ;
team_identifier : string ;
hash_sha256 : string | null ;
}
2025-06-06 19:40:52 +00:00
export interface ISoftwareLastUninstall {
2025-06-30 17:26:01 +00:00
script_execution_id : string ;
uninstalled_at : string ;
2025-06-06 19:40:52 +00:00
}
2025-05-23 13:09:06 +00:00
2024-05-09 21:44:50 +00:00
export interface ISoftwareInstallVersion {
version : string ;
2025-05-23 13:09:06 +00:00
bundle_identifier : string ;
2024-05-09 21:44:50 +00:00
last_opened_at : string | null ;
2024-05-10 15:18:24 +00:00
vulnerabilities : string [ ] | null ;
2024-05-09 21:44:50 +00:00
installed_paths : string [ ] ;
2025-05-29 11:24:25 +00:00
signature_information? : SignatureInformation [ ] ;
2024-05-09 21:44:50 +00:00
}
2024-07-19 16:10:28 +00:00
export interface IHostSoftwarePackage {
name : string ;
self_service : boolean ;
2025-05-08 13:16:51 +00:00
icon_url : string | null ;
2024-07-19 16:10:28 +00:00
version : string ;
2024-07-24 19:32:59 +00:00
last_install : ISoftwareLastInstall | null ;
2025-06-06 19:40:52 +00:00
last_uninstall : ISoftwareLastUninstall | null ;
2025-12-15 14:26:33 +00:00
categories? : SoftwareCategory [ ] | null ;
2025-06-23 15:09:20 +00:00
automatic_install_policies? : ISoftwareInstallPolicy [ ] | null ;
2025-10-28 16:44:17 +00:00
platform? : Platform ;
2024-07-19 16:10:28 +00:00
}
export interface IHostAppStoreApp {
app_store_id : string ;
2025-11-14 18:24:41 +00:00
platform : Platform ;
2024-07-19 16:10:28 +00:00
self_service : boolean ;
icon_url : string ;
version : string ;
2024-07-24 19:32:59 +00:00
last_install : IAppLastInstall | null ;
2025-12-15 14:26:33 +00:00
categories? : SoftwareCategory [ ] | null ;
2025-06-23 15:09:20 +00:00
automatic_install_policies? : ISoftwareInstallPolicy [ ] | null ;
2024-07-19 16:10:28 +00:00
}
2024-05-09 21:44:50 +00:00
export interface IHostSoftware {
id : number ;
2025-11-13 17:06:14 +00:00
name : string ; // e.g., "mock software.app"
/** Custom name set per team by admin */
display_name? : string ; // e.g. "Mock Software"
2025-09-05 22:31:03 +00:00
icon_url : string | null ;
2024-07-19 16:10:28 +00:00
software_package : IHostSoftwarePackage | null ;
app_store_app : IHostAppStoreApp | null ;
2024-10-08 19:19:32 +00:00
source : SoftwareSource ;
2025-10-07 21:05:22 +00:00
extension_for? : SoftwareExtensionFor ;
2024-05-10 15:18:24 +00:00
bundle_identifier? : string ;
2025-10-15 13:41:43 +00:00
status : Exclude < SoftwareInstallUninstallStatus , " uninstalled " > | null ;
2024-05-09 21:44:50 +00:00
installed_versions : ISoftwareInstallVersion [ ] | null ;
}
Update UI for software self-service features (#19244)
Issues https://github.com/fleetdm/fleet/issues/17587,
https://github.com/fleetdm/fleet/issues/18836,
https://github.com/fleetdm/fleet/issues/18837,
https://github.com/fleetdm/fleet/pull/18339, and
https://github.com/fleetdm/fleet/pull/18340
# TODOS
- Integrate backend
- Unit/integration tests
- Various todos noted in comments
- Cleanup styles and organization of components (de-duplicating and
consolidating where possible)
- Activity feed updates (if any)
# Checklist for submitter
If some of the following don't apply, delete the relevant line.
<!-- Note that API documentation changes are now addressed by the
product design team. -->
- [ ] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://fleetdm.com/docs/contributing/committing-changes#changes-files)
for more information.
- [ ] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements)
- [ ] Added support on fleet's osquery simulator `cmd/osquery-perf` for
new osquery data ingestion features.
- [ ] Added/updated tests
- [ ] If database migrations are included, checked table schema to
confirm autoupdate
- For database migrations:
- [ ] Checked schema for all modified table for columns that will
auto-update timestamps during migration.
- [ ] Confirmed that updating the timestamps is acceptable, and will not
cause unwanted side effects.
- [ ] Ensured the correct collation is explicitly set for character
columns (`COLLATE utf8mb4_unicode_ci`).
- [ ] Manual QA for all new/changed functionality
- For Orbit and Fleet Desktop changes:
- [ ] Manual QA must be performed in the three main OSs, macOS, Windows
and Linux.
- [ ] Auto-update manual QA, from released version of component to new
version (see [tools/tuf/test](../tools/tuf/test/README.md)).
---------
Co-authored-by: Gabriel Hernandez <ghernandez345@gmail.com>
2024-05-31 10:09:53 +00:00
2025-08-07 21:35:41 +00:00
/ * *
* Comprehensive list of possible UI software statuses for host > software > library / self - service .
*
* These are more detailed than the raw API ` .status ` and are determined by :
* - Whether the host is online or offline
* - If the fleet - installed version is newer than any in installed_versions
* - Special handling for tarballs ( tgz_packages )
* - Cases where the software inventory has not yet updated to reflect a recent change
* ( i . e . , last_install date vs host software ' s updated_at date )
* /
2025-11-11 15:37:18 +00:00
// Error UI statuses
export const HOST_SOFTWARE_UI_ERROR_STATUSES = [
"failed_install" , // Install attempt failed
"failed_install_update_available" , // Install/update failed; newer installer version available
"failed_uninstall" , // Uninstall attempt failed
"failed_uninstall_update_available" , // Uninstall/update failed; newer installer version available
"failed_script" , // Script package failed to run
] as const ;
export type HostSoftwareUiErrorStatus = typeof HOST_SOFTWARE_UI_ERROR_STATUSES [ number ] ;
export const isSoftwareErrorStatus = (
status : IHostSoftwareUiStatus
) : status is HostSoftwareUiErrorStatus = >
HOST_SOFTWARE_UI_ERROR_STATUSES . includes ( status as HostSoftwareUiErrorStatus ) ;
// Pending UI statuses for OFFLINE hosts
export const HOST_SOFTWARE_UI_PENDING_STATUSES = [
"pending_install" , // Install scheduled (no newer installer version)
"pending_uninstall" , // Uninstall scheduled
"pending_update" , // Update scheduled (no newer installer version)
"pending_script" , // Fleet-initiated script run scheduled
] as const ;
export type HostSoftwareUiPendingStatus = typeof HOST_SOFTWARE_UI_PENDING_STATUSES [ number ] ;
export const isSoftwarePendingStatus = (
status : IHostSoftwareUiStatus
) : status is HostSoftwareUiPendingStatus = >
HOST_SOFTWARE_UI_PENDING_STATUSES . includes (
status as HostSoftwareUiPendingStatus
) ;
// In-progress UI statuses for ONLINE hosts
export const HOST_SOFTWARE_UI_IN_PROGRESS_STATUSES = [
"installing" , // Fleet-initiated install in progress
"updating" , // Update (install) in progress with newer fleet installer
"uninstalling" , // Fleet-initiated uninstall in progress
"running_script" , // Fleet-initiated script run in progress
] as const ;
export type HostSoftwareUiInProgressStatus = typeof HOST_SOFTWARE_UI_IN_PROGRESS_STATUSES [ number ] ;
export const isSoftwareInProgressStatus = (
status : IHostSoftwareUiStatus
) : status is HostSoftwareUiInProgressStatus = >
HOST_SOFTWARE_UI_IN_PROGRESS_STATUSES . includes (
status as HostSoftwareUiInProgressStatus
) ;
// Success/steady-state UI statuses
export const HOST_SOFTWARE_UI_SUCCESS_STATUSES = [
"installed" , // Present in inventory; no newer fleet installer version (tarballs: successful install only)
"uninstalled" , // Not present in inventory (tarballs: successful uninstall or never installed)
"recently_updated" , // Update applied (installer newer than inventory), but inventory not yet refreshed
"recently_installed" , // Install applied (installer NOT newer than inventory), but inventory not yet refreshed
"recently_uninstalled" , // Uninstall applied, but inventory not yet refreshed
"ran_script" , // Script package ran successfully
"never_ran_script" , // Script package never ran before
] as const ;
export type HostSoftwareUiSuccessStatus = typeof HOST_SOFTWARE_UI_SUCCESS_STATUSES [ number ] ;
export const isSoftwareSuccessStatus = (
status : IHostSoftwareUiStatus
) : status is HostSoftwareUiSuccessStatus = >
HOST_SOFTWARE_UI_SUCCESS_STATUSES . includes (
status as HostSoftwareUiSuccessStatus
) ;
// Update-available UI status
export const HOST_SOFTWARE_UI_UPDATE_AVAILABLE_STATUSES = [
"update_available" , // In inventory, but newer fleet installer version is available
] as const ;
export type HostSoftwareUiUpdateAvailableStatus = typeof HOST_SOFTWARE_UI_UPDATE_AVAILABLE_STATUSES [ number ] ;
export const isSoftwareUpdateAvailableStatus = (
status : IHostSoftwareUiStatus
) : status is HostSoftwareUiUpdateAvailableStatus = >
HOST_SOFTWARE_UI_UPDATE_AVAILABLE_STATUSES . includes (
status as HostSoftwareUiUpdateAvailableStatus
) ;
// Master UI status type, combining all:
2025-07-24 19:04:48 +00:00
export type IHostSoftwareUiStatus =
2025-11-11 15:37:18 +00:00
| HostSoftwareUiErrorStatus
| HostSoftwareUiPendingStatus
| HostSoftwareUiSuccessStatus
| HostSoftwareUiInProgressStatus
| HostSoftwareUiUpdateAvailableStatus ;
2025-07-24 19:04:48 +00:00
/ * *
* Extends IHostSoftware with a computed ` ui_status ` field .
*
* The ` ui_status ` categorizes software installation state for the UI by
* combining the ` status ` , ` installed_versions ` info , and other factors
* like host online state ( via getUiStatus helper function ) , enabling
* more detailed and status labels needed for the status and actions columns .
* /
export interface IHostSoftwareWithUiStatus extends IHostSoftware {
ui_status : IHostSoftwareUiStatus ;
}
UI: Make consistent and update the Install and Uninstall detail modals for VPP and non-VPP apps across the Fleet UI (#31420)
# #30860
## Summary
* **New Features**
* Introduced dedicated modals for viewing install and uninstall details
for both VPP and non-VPP software, providing clearer and more consistent
information.
* Added support for displaying detailed install information for VPP host
software and improved handling of install status actions.
* Added an Inventory Versions modal to display detailed version history
for installed software on a host.
* **Improvements**
* Standardized and improved the design and behavior of install/uninstall
detail modals across the app.
* Refined callbacks and state management for launching modals from host
and self-service software tables.
* **Bug Fixes**
* Addressed issues with property naming and callback signatures in
install status handling.
* Addressed inconsistencies in displaying software details and status
across different components.
* **Refactor**
* Streamlined component props, callback signatures, and data models for
improved maintainability.
* Updated test cases and interfaces to align with the new modal and
callback structure.
* Removed legacy software details modal and related code, streamlining
the user interface.
* **Style**
* Updated modal and table styles for improved readability and
consistency.
## *Important note: Host software library modals for VPP apps currently
show only installed versions due to [an API bug that is being
addressed](https://github.com/fleetdm/fleet/issues/31459)
## Install details modal in various locations and states :
### Activity feeds (global, host details), non-VPP:

### Device user page self-service, non-VPP (with Retry functionality):

### Host software library, non-VPP:

### Activity feeds (global, host details), VPP apps:

### Device user page self-service, VPP apps (with Retry functionality):

### Uninstall modal samples - TODO
- [x] Changes file added for user-visible changes in `changes/`
## Testing
- [x] Added/updated automated tests
- [x] QA'd all new/changed functionality manually
---------
Co-authored-by: Jacob Shandling <jacob@fleetdm.com>
Co-authored-by: RachelElysia <rachel@fleetdm.com>
2025-08-01 19:45:09 +00:00
/ * *
* Allows unified data model for rendering of host VPP software installs and uninstalls
* Optional as pending may not have a commandUuid
* /
export type IVPPHostSoftware = IHostSoftware & {
commandUuid? : string ;
} ;
export type IHostSoftwareUninstall = IHostSoftwareWithUiStatus & {
scriptExecutionId : string ;
} ;
2024-07-19 16:10:28 +00:00
export type IDeviceSoftware = IHostSoftware ;
2025-07-24 19:04:48 +00:00
export type IDeviceSoftwareWithUiStatus = IHostSoftwareWithUiStatus ;
2024-07-19 16:10:28 +00:00
2024-09-12 15:51:59 +00:00
const INSTALL_STATUS_PREDICATES : Record <
2025-10-15 13:41:43 +00:00
EnhancedSoftwareInstallUninstallStatus | "pending" ,
2024-09-12 15:51:59 +00:00
string
> = {
pending : "pending" ,
2024-07-16 17:16:57 +00:00
installed : "installed" ,
2024-09-12 15:51:59 +00:00
uninstalled : "uninstalled" ,
2024-09-04 21:46:48 +00:00
pending_install : "told Fleet to install" ,
2024-09-12 15:51:59 +00:00
failed_install : "failed to install" ,
2024-09-05 19:20:36 +00:00
pending_uninstall : "told Fleet to uninstall" ,
failed_uninstall : "failed to uninstall" ,
2025-10-15 13:41:43 +00:00
ran_script : "ran" , // Payload-free (script) software
failed_script : "failed to run" , // Payload-free (script) software
pending_script : "told Fleet to run" , // Payload-free (script) software
2024-07-16 17:16:57 +00:00
} as const ;
2025-10-15 13:41:43 +00:00
export const getInstallUninstallStatusPredicate = (
status : string | undefined ,
isScriptPackage = false
) = > {
2024-07-16 17:16:57 +00:00
if ( ! status ) {
return INSTALL_STATUS_PREDICATES . pending ;
}
2025-10-15 13:41:43 +00:00
// If it is a script package, map install statuses to script-specific predicates
if ( isScriptPackage ) {
switch ( status . toLowerCase ( ) ) {
case "installed" :
return INSTALL_STATUS_PREDICATES . ran_script ;
case "pending_install" :
return INSTALL_STATUS_PREDICATES . pending_script ;
case "failed_install" :
return INSTALL_STATUS_PREDICATES . failed_script ;
default :
break ;
}
}
// For all other cases, return the matching predicate or default to pending
2024-07-16 17:16:57 +00:00
return (
2025-10-15 13:41:43 +00:00
INSTALL_STATUS_PREDICATES [
status . toLowerCase ( ) as keyof typeof INSTALL_STATUS_PREDICATES
] || INSTALL_STATUS_PREDICATES . pending
2024-07-16 17:16:57 +00:00
) ;
} ;
2024-09-16 21:24:09 +00:00
export const aggregateInstallStatusCounts = (
packageStatuses : ISoftwarePackage [ "status" ]
) = > ( {
installed : packageStatuses.installed ,
pending : packageStatuses.pending_install + packageStatuses . pending_uninstall ,
failed : packageStatuses.failed_install + packageStatuses . failed_uninstall ,
} ) ;
2024-09-12 15:51:59 +00:00
export const INSTALL_STATUS_ICONS : Record <
2025-10-15 13:41:43 +00:00
EnhancedSoftwareInstallUninstallStatus | "pending" | "failed" ,
2024-09-12 15:51:59 +00:00
IconNames
> = {
2024-07-16 17:16:57 +00:00
pending : "pending-outline" ,
2024-09-04 21:46:48 +00:00
pending_install : "pending-outline" ,
2024-07-16 17:16:57 +00:00
installed : "success-outline" ,
2024-09-12 15:51:59 +00:00
uninstalled : "success-outline" ,
2024-07-16 17:16:57 +00:00
failed : "error-outline" ,
2024-09-04 21:46:48 +00:00
failed_install : "error-outline" ,
2024-09-05 19:20:36 +00:00
pending_uninstall : "pending-outline" ,
failed_uninstall : "error-outline" ,
2025-10-15 13:41:43 +00:00
ran_script : "success-outline" , // Payload-free (script) software
failed_script : "error-outline" , // Payload-free (script) software
pending_script : "pending-outline" , // Payload-free (script) software
2024-07-16 17:16:57 +00:00
} as const ;
2024-07-22 21:07:31 +00:00
2024-07-24 19:32:59 +00:00
type IHostSoftwarePackageWithLastInstall = IHostSoftwarePackage & {
2024-07-22 21:07:31 +00:00
last_install : ISoftwareLastInstall ;
} ;
2024-07-24 19:32:59 +00:00
export const hasHostSoftwarePackageLastInstall = (
software : IHostSoftware
) : software is IHostSoftware & {
software_package : IHostSoftwarePackageWithLastInstall ;
} = > {
return ! ! software . software_package ? . last_install ;
} ;
type IHostAppWithLastInstall = IHostAppStoreApp & {
last_install : IAppLastInstall ;
} ;
export const hasHostSoftwareAppLastInstall = (
2024-07-22 21:07:31 +00:00
software : IHostSoftware
2024-07-24 19:32:59 +00:00
) : software is IHostSoftware & {
app_store_app : IHostAppWithLastInstall ;
} = > {
return ! ! software . app_store_app ? . last_install ;
2024-07-22 21:07:31 +00:00
} ;
2024-08-08 16:46:38 +00:00
export const isIpadOrIphoneSoftwareSource = ( source : string ) = >
[ "ios_apps" , "ipados_apps" ] . includes ( source ) ;
2024-09-20 14:47:01 +00:00
2025-10-07 18:08:25 +00:00
export const isAndroidSoftwareSource = ( source : string ) = >
source === "android_apps" ;
2024-09-20 14:47:01 +00:00
export interface IFleetMaintainedApp {
id : number ;
name : string ;
version : string ;
2025-03-21 13:33:06 +00:00
platform : FleetMaintainedAppPlatform ;
software_title_id? : number ; // null unless the team already has the software added (as a Fleet-maintained app, App Store (app), or custom package)
2024-09-20 14:47:01 +00:00
}
2025-03-21 13:33:06 +00:00
export type FleetMaintainedAppPlatform = Extract <
Platform ,
"darwin" | "windows"
> ;
export interface ICombinedFMA {
name : string ;
macos : Omit < IFleetMaintainedApp , " name " > | null ;
windows : Omit < IFleetMaintainedApp , " name " > | null ;
}
2024-09-20 14:47:01 +00:00
export interface IFleetMaintainedAppDetails {
id : number ;
name : string ;
version : string ;
2025-03-21 13:33:06 +00:00
platform : FleetMaintainedAppPlatform ;
pre_install_script : string ;
2024-09-20 14:47:01 +00:00
install_script : string ;
2025-03-21 13:33:06 +00:00
post_install_script : string ;
2024-09-20 14:47:01 +00:00
uninstall_script : string ;
2025-01-27 21:23:08 +00:00
url : string ;
2025-05-08 13:22:55 +00:00
slug : string ;
2025-03-21 13:33:06 +00:00
software_title_id? : number ; // null unless the team already has the software added (as a Fleet-maintained app, App Store (app), or custom package)
2025-12-15 14:26:33 +00:00
categories : SoftwareCategory [ ] | null ;
2024-09-20 14:47:01 +00:00
}
2025-10-17 21:01:03 +00:00
export const ROLLING_ARCH_LINUX_NAMES = [
"Arch Linux" ,
"Arch Linux ARM" ,
"Manjaro Linux" ,
"Manjaro Linux ARM" ,
"Manjaro ARM Linux" ,
] ;
export const ROLLING_ARCH_LINUX_VERSIONS = ROLLING_ARCH_LINUX_NAMES . map (
( name ) = > ` ${ name } rolling `
) ;