diff --git a/ee/maintained-apps/inputs/winget/aomei-backupper-standard.json b/ee/maintained-apps/inputs/winget/aomei-backupper-standard.json new file mode 100644 index 00000000000..a39bbce2829 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/aomei-backupper-standard.json @@ -0,0 +1,13 @@ +{ + "name": "AOMEI Backupper Standard", + "slug": "aomei-backupper-standard/windows", + "package_identifier": "AOMEI.Backupper.Standard", + "unique_identifier": "AOMEI Backupper", + "program_publisher": "AOMEI International Network Limited.", + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_install.ps1", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_uninstall.ps1", + "installer_arch": "x86", + "installer_type": "exe", + "installer_scope": "machine", + "default_categories": ["Utilities"] +} diff --git a/ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_install.ps1 new file mode 100644 index 00000000000..91e83ede1c5 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_install.ps1 @@ -0,0 +1,25 @@ +# Learn more about .exe install scripts: +# http://fleetdm.com/learn-more-about/exe-install-scripts + +$exeFilePath = "${env:INSTALLER_PATH}" + +try { + +# AOMEI Backupper Standard uses Inno Setup +$processOptions = @{ + FilePath = "$exeFilePath" + ArgumentList = "/VERYSILENT /SUPPRESSMSGBOXES /NORESTART" + PassThru = $true + Wait = $true +} + +$process = Start-Process @processOptions +$exitCode = $process.ExitCode + +Write-Host "Install exit code: $exitCode" +Exit $exitCode + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_uninstall.ps1 new file mode 100644 index 00000000000..6a4040e072e --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_uninstall.ps1 @@ -0,0 +1,37 @@ +# The ARP DisplayName is "AOMEI Backupper" (no "Standard" suffix since ~v7.4). +# Match name and publisher exactly so add-ons sharing the name prefix aren't hit. +$softwareName = "AOMEI Backupper" +$softwarePublisher = "AOMEI International Network Limited." +$uninstallArgs = "/VERYSILENT /SUPPRESSMSGBOXES /NORESTART" + +$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' +$exitCode = 0 + +try { + [array]$uninstallKeys = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue | + ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } + + $foundUninstaller = $false + foreach ($key in $uninstallKeys) { + if ($key.DisplayName -eq $softwareName -and $key.Publisher -eq $softwarePublisher) { + $foundUninstaller = $true + $uninstallCommand = if ($key.QuietUninstallString) { $key.QuietUninstallString } else { $key.UninstallString } + if ($uninstallCommand -match '^\s*"([^"]+)"\s*(.*)$') { + $uninstallCommand = $Matches[1]; if ($Matches[2]) { $uninstallArgs = "$($Matches[2]) $uninstallArgs".Trim() } + } elseif ($uninstallCommand -match '(?i)^\s*(.+?\.exe)\s*(.*)$') { + $uninstallCommand = $Matches[1]; if ($Matches[2]) { $uninstallArgs = "$($Matches[2]) $uninstallArgs".Trim() } + } elseif ($uninstallCommand -match '^\s*(\S+)\s*(.*)$') { + $uninstallCommand = $Matches[1]; if ($Matches[2]) { $uninstallArgs = "$($Matches[2]) $uninstallArgs".Trim() } + } + Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs" + $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true } + if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs } + $process = Start-Process @processOptions + $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break + } + } + if (-not $foundUninstaller) { Write-Host "Uninstall entry not found for '$softwareName'."; Exit 0 } +} catch { Write-Host "Error: $_"; Exit 1 } + +Exit $exitCode diff --git a/ee/maintained-apps/outputs/aomei-backupper-standard/windows.json b/ee/maintained-apps/outputs/aomei-backupper-standard/windows.json new file mode 100644 index 00000000000..53467f27166 --- /dev/null +++ b/ee/maintained-apps/outputs/aomei-backupper-standard/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "8.4.0.0", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'AOMEI Backupper' AND publisher = 'AOMEI International Network Limited.';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'AOMEI Backupper' AND publisher = 'AOMEI International Network Limited.' AND version_compare(version, '8.4.0.0') < 0);" + }, + "installer_url": "https://www2.aomeisoftware.com/download/adb/AOMEIBackupperStd.exe", + "install_script_ref": "03d967ed", + "uninstall_script_ref": "e92f2668", + "sha256": "a9b347b8e43a5ef626adad9eda2e5713df7ca86da11438ada7c0a90453a724d2", + "default_categories": [ + "Utilities" + ] + } + ], + "refs": { + "03d967ed": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n# AOMEI Backupper Standard uses Inno Setup\n$processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/VERYSILENT /SUPPRESSMSGBOXES /NORESTART\"\n PassThru = $true\n Wait = $true\n}\n\n$process = Start-Process @processOptions\n$exitCode = $process.ExitCode\n\nWrite-Host \"Install exit code: $exitCode\"\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "e92f2668": "# The ARP DisplayName is \"AOMEI Backupper\" (no \"Standard\" suffix since ~v7.4).\n# Match name and publisher exactly so add-ons sharing the name prefix aren't hit.\n$softwareName = \"AOMEI Backupper\"\n$softwarePublisher = \"AOMEI International Network Limited.\"\n$uninstallArgs = \"/VERYSILENT /SUPPRESSMSGBOXES /NORESTART\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$exitCode = 0\n\ntry {\n [array]$uninstallKeys = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n $foundUninstaller = $false\n foreach ($key in $uninstallKeys) {\n if ($key.DisplayName -eq $softwareName -and $key.Publisher -eq $softwarePublisher) {\n $foundUninstaller = $true\n $uninstallCommand = if ($key.QuietUninstallString) { $key.QuietUninstallString } else { $key.UninstallString }\n if ($uninstallCommand -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $uninstallCommand = $Matches[1]; if ($Matches[2]) { $uninstallArgs = \"$($Matches[2]) $uninstallArgs\".Trim() }\n } elseif ($uninstallCommand -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $uninstallCommand = $Matches[1]; if ($Matches[2]) { $uninstallArgs = \"$($Matches[2]) $uninstallArgs\".Trim() }\n } elseif ($uninstallCommand -match '^\\s*(\\S+)\\s*(.*)$') {\n $uninstallCommand = $Matches[1]; if ($Matches[2]) { $uninstallArgs = \"$($Matches[2]) $uninstallArgs\".Trim() }\n }\n Write-Host \"Uninstall command: $uninstallCommand\"; Write-Host \"Uninstall args: $uninstallArgs\"\n $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }\n if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode; Write-Host \"Uninstall exit code: $exitCode\"; break\n }\n }\n if (-not $foundUninstaller) { Write-Host \"Uninstall entry not found for '$softwareName'.\"; Exit 0 }\n} catch { Write-Host \"Error: $_\"; Exit 1 }\n\nExit $exitCode\n" + } +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 796fd985033..8010b986aa5 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -687,6 +687,13 @@ "unique_identifier": "com.anytype.anytype", "description": "Anytype is a local-first and end-to-end encrypted notes app." }, + { + "name": "AOMEI Backupper Standard", + "slug": "aomei-backupper-standard/windows", + "platform": "windows", + "unique_identifier": "AOMEI Backupper", + "description": "AOMEI Backupper Standard is a backup, sync, and disaster recovery tool for Windows." + }, { "name": "Apidog", "slug": "apidog/darwin", diff --git a/frontend/pages/SoftwarePage/components/icons/AomeiBackupperStandard.tsx b/frontend/pages/SoftwarePage/components/icons/AomeiBackupperStandard.tsx new file mode 100644 index 00000000000..a49783b3071 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AomeiBackupperStandard.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AomeiBackupperStandard = (props: SVGProps) => ( + + + +); +export default AomeiBackupperStandard; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index 55e599078dd..3b86070d906 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -71,6 +71,7 @@ import Anyburn from "./Anyburn"; import AnyDesk from "./AnyDesk"; import Anydo from "./Anydo"; import Anytype from "./Anytype"; +import AomeiBackupperStandard from "./AomeiBackupperStandard"; import Apidog from "./Apidog"; import Apparency from "./Apparency"; import AppCleaner from "./AppCleaner"; @@ -1211,6 +1212,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { anyburn: Anyburn, anydesk: AnyDesk, anytype: Anytype, + "aomei backupper standard": AomeiBackupperStandard, apidog: Apidog, "app fair": AppFair, apparency: Apparency, diff --git a/website/assets/images/app-icon-aomei-backupper-standard-60x60@2x.png b/website/assets/images/app-icon-aomei-backupper-standard-60x60@2x.png new file mode 100644 index 00000000000..e69a680409b Binary files /dev/null and b/website/assets/images/app-icon-aomei-backupper-standard-60x60@2x.png differ