Upgrade to a New Version
How you upgrade Access Analyzer depends on how you installed it.
| Install | How it upgrades |
|---|---|
| Connected (the default) | The upgrade downloads the new release's offline media from Netwrix, verifies it, and loads it into the cluster. Start it from the Settings page, let the version poller start it, or run dspm-installer upgrade --download on the host. |
| Air-gapped | You download the new media on a connected machine, copy it to the server, and run dspm-installer upgrade --bundle-dir. |
Registry (a connected install made before media installs, or with DSPM_MEDIA_INSTALL=false) | ArgoCD pulls new releases from the Netwrix registry. You tell it which version to run with dspmctl. Convert a registry install to downloaded media to upgrade the same way as any connected install. |
Pick the tab that matches your install.
The installer installs dspmctl at /usr/local/bin/dspmctl. It's a small shell wrapper that runs kubectl exec into the dspmctl pod in the argocd namespace. That pod signs in to ArgoCD and runs argocd commands for you. You don't need the argocd command-line interface (CLI) on the host.
Run dspmctl and dspm-installer with sudo. Only root can read the default kubeconfig at /etc/rancher/k3s/k3s.yaml, so without sudo, kubectl falls back to localhost:8080 and fails with "connection refused."
On RHEL and similar distributions, /usr/local/bin usually isn't on the PATH, so dspm-installer and dspmctl can fail with command not found. Run them by their full paths instead, for example sudo /usr/local/bin/dspm-installer or sudo /usr/local/bin/dspmctl.
Check Which Version Is Running
Start by checking which version is running:
sudo dspmctl version
Compare the output with the latest release Netwrix has announced. If they match, Access Analyzer is already up to date.
Choose an Upgrade Command
Find your situation in the table and run its command on the server. Every command in the table runs dspm-installer upgrade.
| You want to | Run |
|---|---|
| Upgrade a connected install to the newest stable release | sudo dspm-installer upgrade --download |
| Upgrade a connected install to a specific release | sudo dspm-installer upgrade --download --target-revision <version> |
| Upgrade a connected install from media you copied to the server | sudo dspm-installer upgrade --bundle-dir <path-to-archive> |
| Upgrade an air-gapped install | sudo dspm-installer upgrade --bundle-dir <path-to-archive> |
| Convert a registry install to downloaded media and upgrade it | sudo dspm-installer upgrade --download --migrate --target-revision <version> |
| Convert a registry install to downloaded media on the same release | sudo dspm-installer upgrade --download --migrate --target-revision <installed-version> |
| Connect an air-gapped install | sudo --preserve-env=LICENSE_KEY dspm-installer upgrade --connect |
| Connect an air-gapped install and upgrade it | Run upgrade --connect, then upgrade --download --target-revision <version> as a second command |
| Redeploy the installed release, or downgrade | Add --allow-downgrade to the upgrade command |
| Preview any of these without changing anything | Add --dry-run |
Without --target-revision, upgrade --download upgrades to the newest stable release. For converting and connecting, see Convert or connect an install.
These changes have no command:
- Connected to air-gapped.
--connectworks in one direction only, so returning to air-gapped takes a reinstall.upgrade --bundle-dirworks on a connected install, but the install stays connected: the version poller stays on and the license key stays saved. - Connect and upgrade in one run.
--connectdoesn't redeploy or change the release, so the upgrade is a second command. - Registry install straight to air-gapped media.
--migraterequires--download, so convert the registry install while it's online first. upgrade --downloadon an air-gapped install. The command refuses and exits with code16. Runupgrade --connectfirst.
Upgrade
- Connected upgrade
- Air-gapped upgrade
- Registry upgrade
All three ways to upgrade a connected install run the same upgrade. Only one upgrade can run at a time.
Upgrade from the Settings page
You need the Administrator role.
- Go to Settings > System.
- Select the version and click Update. The confirmation says the app downloads the release media and is briefly unavailable.
- Watch the progress through these phases: Checking prerequisites, Downloading media, Deploying, and Waiting for services.
- When the upgrade finishes, reload the page.
If the upgrade fails, the page shows the reason and what to do next.
| What you see | What it means |
|---|---|
| Check the license | Netwrix rejected the license. Nothing changed. |
| The upgrade couldn't start, No release available, or Download failed | Nothing changed. For a download failure, free some disk space and click Retry. |
| Retry or contact support | The installer couldn't load the media. Nothing changed. |
| The upgrade failed while applying, The new version didn't become healthy, or The new version failed to start | The cluster may have changed. Click Roll back to return to the previous version. |
| Contact support | The installer couldn't apply the new version. |
If another upgrade is already running, the page says so.
Upgrade automatically
The version poller checks for new releases every 12 hours. When a newer release matches the install's version constraint and Netwrix has published its media, the poller starts the same upgrade the Settings page starts.
If an upgrade fails partway through deploying, the poller doesn't retry it. Fix the cause, then run sudo dspm-installer upgrade --download on the host.
Upgrade from the host
Upgrade to the newest stable release:
sudo dspm-installer upgrade --download
Upgrade to a specific release:
sudo dspm-installer upgrade --download --target-revision 1.5.0
--download reads the license key from /etc/dspm/installer.yaml. On a host without a saved key, pass the key through the environment, as the install does:
read -rs LICENSE_KEY && export LICENSE_KEY
sudo --preserve-env=LICENSE_KEY dspm-installer upgrade --download
To upgrade a connected install from media you already copied to the server, pass the archive instead of --download:
sudo dspm-installer upgrade --bundle-dir /etc/dspm/media/dspm-airgap-media-v<version>-<arch>.tar.gz
The install stays connected afterwards. See Download the new release for how to get the archive.
If the cluster already runs the newest release, the command prints The cluster is already on the newest release (v<version>); nothing was changed. and exits 0. A scheduled run can use this to distinguish "nothing to do" from a failure.
Add --dry-run to check the preconditions and free space and print the upgrade plan without downloading anything.
What an upgrade does
- Checks the preconditions: the cluster runs from offline media, the root application's automated sync is on, the release is newer than the installed one, and the server has enough disk space. If any check fails, the upgrade exits with code
16and changes nothing. - Downloads and checks the media, or reuses media already on disk.
- Pauses automated sync, so ArgoCD doesn't act on a half-loaded release.
- Removes images older than the previous release from the in-cluster registry. The registry keeps the current release and the one before it.
- Loads the new charts and images into the cluster and points the root application at the new version.
- Turns automated sync back on and waits for every application to become healthy.
- Deletes the downloaded media.
If something interrupts the upgrade (Ctrl-C, a dropped SSH session, or a stopped pod), the upgrade turns automated sync back on before it exits. Run the same command again to finish the upgrade.
An air-gapped upgrade loads the new release into the cluster from the newer offline media archive. The upgrade reads only the cluster and the media, so it needs no network access. It upgrades the Access Analyzer services and ArgoCD. It doesn't upgrade the underlying k3s platform or the offline package manager. If the media targets a different version of either, the command prints a warning that names both versions and continues with the installed ones.
Before it changes anything, the command checks that the server runs from offline media, that the media carries a newer version than the one installed, and that automated sync is on for the netwrix app. If any check fails, it exits with code 16 and nothing in the cluster changes.
Download the new release
Download the new installer and the new media the same way you did for the install, with the new release's version number.
Download the latest dspm-installer binary along with the media, and run the upgrade with that binary. The upgrade command exists only in newer installers, and an installer from an older release can reject newer media. Confirm the version with dspm-installer --version after the download.
-
Read your license key into an environment variable.
read -rs LICENSE_KEY && export LICENSE_KEY -
Download the installer and the offline media archive for the new release.
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')VERSION='<release-version>' # the release you're upgrading to, for example 1.6.0TMP_FILE=$(mktemp)curl -Lf -o "$TMP_FILE" \"https://raw.pkg.keygen.sh/v1/accounts/netwrix/artifacts/dspm-installer-linux-$ARCH?auth=license:${LICENSE_KEY}&channel=stable"sudo install -m 0755 "$TMP_FILE" "/usr/local/bin/dspm-installer"rm -f "$TMP_FILE"dspm-installer --versionsudo mkdir -p /etc/dspm/mediasudo curl -Lf -o "/etc/dspm/media/dspm-airgap-media-v${VERSION}-${ARCH}.tar.gz" \"https://raw.pkg.keygen.sh/v1/accounts/netwrix/artifacts/dspm-airgap-media-v${VERSION}-${ARCH}.tar.gz?auth=license:${LICENSE_KEY}&channel=stable"Don't extract the archive, and keep its name as downloaded. If the server has no network access, run these commands on a connected machine with the same architecture, then copy
/usr/local/bin/dspm-installerand the archive to the server withscpor removable media. Keep thechannel=stableparameter on every download. Without it, the registry can return a pre-release build. -
Confirm the archive downloaded completely.
ls -lh "/etc/dspm/media/dspm-airgap-media-v${VERSION}-${ARCH}.tar.gz"The file should be about 3.5 GB. If it's much smaller, the download didn't finish. Repeat step 2.
Run the upgrade
-
Preview the upgrade.
--dry-runvalidates the media and the preconditions and prints the planned changes without touching the cluster.sudo dspm-installer upgrade --bundle-dir /etc/dspm/media/dspm-airgap-media-v<version>-<arch>.tar.gz --dry-runThe summary shows the installed version, the version in the media, and the k3s, offline package manager, and ArgoCD versions on each side. Fix anything it reports before you continue.
-
Run the upgrade.
sudo dspm-installer upgrade --bundle-dir /etc/dspm/media/dspm-airgap-media-v<version>-<arch>.tar.gzThe command loads the chart snapshot and container images into the cluster, applies the bundled ArgoCD manifest, and re-seeds the registry pull secret into every application namespace. It then re-pins the
netwrixapp to the new version and records the previous version in thedspm.netwrix.com/previous-target-revisionannotation. Finally, it waits for every application to become Synced and Healthy. The wait defaults to 30 minutes. Pass--timeoutwith a duration such as45mto change it.Exit code
0means the cluster runs the new release and every application is healthy. For any other code, see Upgrade exit codes.
--bundle-dir takes the archive directly. An extracted media directory also works. --allow-downgrade lifts the "newer version" check for an intentional redeploy of the same version or a downgrade. --kubeconfig and --argocd-namespace override the defaults if you installed with non-default values. See The upgrade command for every flag.
A host that later gains internet access can connect the air-gapped install to upgrade like a connected install.
A registry install pulls releases from the Netwrix registry. To upgrade it with downloaded media instead, convert it. Otherwise, follow these steps.
If the installed version doesn't match the latest release, check how you installed the app. The installer's default --target-revision is 1.*, a wildcard. If nobody pinned a specific version at install time, ArgoCD already tracks the newest stable 1.x tag and picks up new releases on its next sync. You don't need any dspmctl steps.
If you pinned a specific version at install time, or want to pin one now, follow these steps.
-
Point the umbrella app at the new version.
sudo dspmctl set-revision netwrix 1.1.2For the
netwrixapp, this command does three things. It turns off automated sync and self-heal, setstargetRevisionto1.1.2, and sets the Helm parameterconfig.spec.source.targetRevision=1.1.2so every child application (webapp, core-api, and so on) gets the same version. -
Trigger the sync.
set-revisiondisables auto-sync, so nothing deploys until you run this command.sudo dspmctl sync netwrixnoteIf you're upgrading from a version earlier than 1.1.7, the Apache Tika resources from the older release remain in the cluster after the sync and can keep the app showing as not healthy. Preview what the sync removes, confirm that the output lists only the Tika resources, and then run the sync with
--prune:sudo dspmctl sync netwrix --prune --dry-runsudo dspmctl sync netwrix --prune -
Turn auto-sync back on so later releases in the pinned range deploy without manual steps.
sudo dspmctl enable-auto netwrixenable-autochanges only the sync policy. It doesn't force a reconcile, and the ArgoCD controller polls roughly every 3 minutes. If you ran onlyenable-autoand nothing changed yet, runsync.
Roll Back an Upgrade
On a connected install, when an upgrade fails after it starts applying the new version, the Settings page offers Roll back. The button points the install back at the version the upgrade started from.
From the host, a rollback is a re-pin. The previous chart tag and images stay in the cluster, so you don't need the old media. The in-cluster registry keeps only the previous release's images, so a rollback works one release back. To roll back further, you need that release's media again.
For the precautions to take first and the full procedure, see Rolling back to a previous version. In short, read the previous version from the annotation, then run all three dspmctl commands. set-revision turns off automated sync so self-heal doesn't immediately re-sync the new version, sync applies it, and enable-auto turns automated sync back on. If you skip enable-auto, the netwrix app never syncs again, and the next dspm-installer upgrade refuses to run.
sudo kubectl -n argocd get application netwrix \
-o jsonpath='{.metadata.annotations.dspm\.netwrix\.com/previous-target-revision}'
sudo dspmctl set-revision netwrix v<previous>
sudo dspmctl sync netwrix
sudo dspmctl enable-auto netwrix
sudo dspm-installer wait-for-apps
A re-pin doesn't roll back database schema changes the new release made.
Upgrade Exit Codes
| Code | Meaning | What to do |
|---|---|---|
0 | The cluster runs the new release and every application is Synced and Healthy, or the cluster already runs the newest release. | Nothing. |
10 | Netwrix rejected the license key. | Check the key, then run the command again. |
15 | The command couldn't load or deploy the media, and the cluster is still on the previous release. With --migrate, the command also exits with this code when an agent node runs on a different CPU architecture from the server. | Fix the cause and run the command again. The deploy is idempotent. |
16 | A precondition failed, such as no cluster or root application, the install type doesn't match the command, the release isn't newer, automated sync is off, or the media volume lacks free space. Nothing changed. | Read the message. For automated sync, run sudo dspmctl enable-auto netwrix first. For a same-version redeploy, add --allow-downgrade. For free space, free space on the media volume or use --tmp-dir. |
17 | The command couldn't download, verify, or unpack the media. Nothing changed. | Run the command again. It resumes the download. |
20 | No release matches --target-revision, or the release has no media for this architecture. | Check the release number. |
60 | The command couldn't apply the new version, couldn't switch to the in-cluster source, or couldn't turn automated sync back on. | Check /var/log/dspm-installer.log, run sudo dspmctl enable-auto netwrix, and run the command again. |
70 | The new version applied, but ArgoCD didn't acknowledge it or the release didn't become healthy within --timeout. The new pin stays in place and ArgoCD keeps reconciling. | Run sudo dspm-installer wait-for-apps to keep waiting, or roll back. |
71 | A pod failed to start. | Check the failing pod with sudo kubectl get pods -A, then roll back or fix the cause and run the command again. |
Troubleshooting an Upgrade
Automated sync is still off after a failed upgrade. Run the same upgrade command to finish it, or turn sync back on with sudo dspmctl enable-auto netwrix.
An upgrade exits with code 70, and running it again says the cluster is already on that version. The new version is in place but wasn't healthy in time. Run sudo dspm-installer wait-for-apps.
The upgrade stops with exit code 16 about free space. Free space on the media volume, or point the media elsewhere with --tmp-dir. The check counts media from other releases as free, because the upgrade deletes them, but it deletes nothing unless the check passes.
The progress bar shows garbled characters. Run with --progress ascii, or set DSPM_PROGRESS=ascii.
Checking the Result
Wait one to five minutes for the pods to restart, then check the version again:
sudo dspmctl version
The output should show the version you set. Pod restarts take longer on a busy server, so if the version hasn't changed after five minutes, wait another two or three minutes and run the command again.
For a detailed view of the sync, ask ArgoCD directly:
sudo kubectl exec -n argocd -ti deploy/dspmctl -- argocd app get argocd/netwrix
Check TARGET REVISION and Sync Status. The netwrix app only manages the child Application resources; each child still has to sync on its own to roll new pods. A child with auto-sync enabled syncs shortly after the parent. Otherwise, sync it directly, for example:
sudo dspmctl sync netwrix.webapp
Troubleshooting: dspmctl hangs after a cancelled command
If you press Ctrl-C part-way through a dspmctl command (for example, after typing the wrong version), every later dspmctl call can hang at Logging in to ArgoCD ... and never return. Even argocd version --client, which needs no network at all, hangs, so the cause is local to the pod. Every dspmctl invocation runs inside the same long-lived dspmctl pod, and the interrupted run leaves the argocd binary in that pod unresponsive.
Restart that pod and re-run the upgrade:
sudo kubectl rollout restart deploy/dspmctl -n argocd
sudo kubectl rollout status deploy/dspmctl -n argocd
sudo kubectl exec -n argocd deploy/dspmctl -- argocd version --client # should print instantly now
sudo dspmctl set-revision netwrix 1.1.2
sudo dspmctl sync netwrix
If argocd version --client still hangs after the restart, dspmctl isn't usable in that environment. Everything dspmctl does is an edit to the netwrix ArgoCD Application object, so make the same changes directly with kubectl from the host.
Pin the umbrella chart:
sudo kubectl patch application netwrix -n argocd --type merge \
-p '{"spec":{"source":{"targetRevision":"1.1.2"}}}'
Set the Helm parameter that propagates the version to the child apps. List the parameters, find the 0-based position of config.spec.source.targetRevision, and use it as N:
sudo kubectl get application netwrix -n argocd \
-o jsonpath='{range .spec.source.helm.parameters[*]}{.name}{"\n"}{end}'
sudo kubectl patch application netwrix -n argocd --type json \
-p '[{"op":"replace","path":"/spec/source/helm/parameters/N/value","value":"1.1.2"}]'
Turn auto-sync back on and force an immediate refresh:
sudo kubectl patch application netwrix -n argocd --type merge \
-p '{"spec":{"syncPolicy":{"automated":{"selfHeal":true,"prune":true}}}}'
sudo kubectl annotate application netwrix -n argocd argocd.argoproj.io/refresh=hard --overwrite
sudo kubectl get applications -n argocd -w