--- title: "Installing the Idle Tracker on Windows and Ubuntu EC2" slug: "installing-the-idle-tracker-on-windows-and-ubuntu-vm" updated: 2026-11-09T13:45:52Z published: 2026-11-09T13:45:52Z canonical: "help.cloudlabs.ai/installing-the-idle-tracker-on-windows-and-ubuntu-vm" --- > ## Documentation Index > Fetch the complete documentation index at: https://help.cloudlabs.ai/llms.txt > Use this file to discover all available pages before exploring further. # Installing the Idle Tracker on Windows and Ubuntu EC2 The idle tracker installs itself through the VM's **UserData** on first boot. It only installs when AppEnabled is True and OdlTrackingSource is 1 or 2. ## Windows VM: idle tracker in UserData This block is added only when AppEnabled is True and OdlTrackingSource is 1 or 2. Otherwise the UserData just prints *App Enabled is False*. 1. **Enable TLS 1.2** so the download works. 2. **Download the installer** from WindowsIdletrackingInstallationScriptUrl to C:\WindowsIdleTrackingInstallationScripts.ps1. 3. **Get the instance ID** from AWS metadata (169.254.169.254), using a token first. 4. **Run the installer** with the idle settings below plus the instance ID. 5. **Delete the installer** with Remove-Item. ### Script to add Add this Fn::If block inside the UserData's Fn::Join list, after your own setup script and before the closing . It also needs the AppEnabledAndOdlTrackingCondition under Conditions. { "Fn::If": [ "AppEnabledAndOdlTrackingCondition", { "Fn::Join": ["\n", [ { "Fn::Sub": "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;" }, { "Fn::Sub": "Invoke-WebRequest ${WindowsIdletrackingInstallationScriptUrl} -OutFile 'C:/WindowsIdleTrackingInstallationScripts.ps1'" }, { "Fn::Sub": "$Token = (Invoke-WebRequest -Method PUT -Uri \"http://169.254.169.254/latest/api/token\" -Headers @{\"X-aws-ec2-metadata-token-ttl-seconds\" = \"21600\"} -UseBasicParsing).Content\n$InstanceID = (Invoke-WebRequest -Uri \"http://169.254.169.254/latest/meta-data/instance-id\" -Headers @{\"X-aws-ec2-metadata-token\" = $Token} -UseBasicParsing).Content" }, { "Fn::Sub": "C:\\WindowsIdleTrackingInstallationScripts.ps1 ${WindowsIdlecheckFeatureConnectionString} ${Version} ${AppEnabled} ${ShutdownOnIdle} ${ShutdownOnIdleTimeout} ${WarningWaitTimeout} ${TrackingMode} ${ShutdownOnDisconnect} ${ShutdownOnDisconnectTimeout} ${ShutdownWhenNoUsersConnected} ${ShutdownWhenNoUsersConnectedTimeout} ${AppCheckFrequency} $InstanceID ${CloudLabsDeploymentIDEncrypt}" }, { "Fn::Sub": "Remove-Item 'C:/WindowsIdleTrackingInstallationScripts.ps1' -Force" } ]] }, { "Fn::Sub": "echo 'App Enabled is False'" } ] } Keep the installer arguments in this order; the script reads them by position. ${...} values come from the parameters below, while $Token and $InstanceID are PowerShell variables set at boot. The condition to add under Conditions: "AppEnabledAndOdlTrackingCondition": { "Fn::And": [ { "Fn::Equals": [{ "Ref": "AppEnabled" }, "True"] }, { "Fn::Or": [ { "Fn::Equals": [{ "Ref": "OdlTrackingSource" }, 1] }, { "Fn::Equals": [{ "Ref": "OdlTrackingSource" }, 2] } ]} ] } ## Windows VM: parameters CloudLabs fills these from the parameter file at deployment. | Parameter | Value in parameter file | What it does | | --- | --- | --- | | WindowsIdletrackingInstallationScriptUrl | AWS-WINDOWS-IDLETRACKING-INSTALLATION-SCRIPT-URL | Where the installer is downloaded from | | WindowsIdlecheckFeatureConnectionString | WINDOWS-IDLECHECK-FEATURE-CONNECTION-STRING | Where the tracker reports activity | | Version | GET-IDLE-TRACKING-VERSION | Tracker version | | AppEnabled | GET-ODL-ENABLE-ATTENDEE-TRACKING | Turns tracking on (True / False) | | OdlTrackingSource | GET-ODL-TRACKING-SOURCE | Must be 1 or 2, or the tracker is skipped | | ShutdownOnIdle | GET-ODL-ENABLE-SHUTDOWNONIDLE | Shut down when the user is idle | | ShutdownOnIdleTimeout | GET-ODL-SHUTDOWNONIDLE-TIMEOUT | Idle time before shutdown | | WarningWaitTimeout | GET-ODL-SHUTDOWNONIDLE-WARNINGWAITTIMEOUT | How long the idle warning waits | | TrackingMode | GET-ODL-SHUTDOWNONIDLE-TRACKINGMODE | Idle detection mode | | ShutdownOnDisconnect | GET-ODL-ENABLE-SHUTDOWNONDISCONNECT | Shut down after RDP disconnects | | ShutdownOnDisconnectTimeout | GET-ODL-SHUTDOWNONDISCONNECT-TIMEOUT | Wait time after disconnect | | ShutdownWhenNoUsersConnected | GET-ODL-ENABLE-SHUTDOWNWHENNOUSERSCONNECTED | Shut down when nobody is signed in | | ShutdownWhenNoUsersConnectedTimeout | GET-ODL-SHUTDOWNWHENNOUSERSCONNECTED-TIMEOUT | Wait time with no users signed in | | AppCheckFrequency | 2 | How often the tracker checks | | CloudLabsDeploymentIDEncrypt | GET-DEPLOYMENT-ID-ENCRYPT | Links the VM to its deployment | ## Sample Windows VM Idle Tracker File URL’s: - [cloudlabs-prod-templates-s3.s3.us-east-1.amazonaws.com/idle-tracker/windows-ec2/deploy-01.json](http://cloudlabs-prod-templates-s3.s3.us-east-1.amazonaws.com/idle-tracker/windows-ec2/deploy-01.json) - [cloudlabs-prod-templates-s3.s3.us-east-1.amazonaws.com/idle-tracker/windows-ec2/deploy-01.parameters.json](http://cloudlabs-prod-templates-s3.s3.us-east-1.amazonaws.com/idle-tracker/windows-ec2/deploy-01.parameters.json) ## Linux VM: idle tracker in UserData Same condition as Windows: the block runs only when AppEnabled is True and OdlTrackingSource is 1 or 2. Your base script must install wget, curl and dos2unix first, since the tracker block uses them. 1. **Download and run the bashrc script** from AddToBashrcScriptUrl to /opt/main.sh. 2. **Download the installer** from IdleTrackingInstallationScriptUrl to /opt/LinuxIdleTrackingInstallationScript.sh. dos2unix fixes Windows line endings in both scripts. 3. **Add sysadmin to sudoers** and **get the instance ID** from AWS metadata, using a token first. 4. **Run the installer** with the idle-check and xprintidle download URLs (x64 and arm64), the idle settings and the instance ID. 5. **Delete both scripts.** ### Script to add Add this Fn::If block inside the UserData's Fn::Join list, after your bash setup script. The same AppEnabledAndOdlTrackingCondition goes under Conditions. { "Fn::If": [ "AppEnabledAndOdlTrackingCondition", { "Fn::Join": ["\n", [ { "Fn::Sub": "wget ${AddToBashrcScriptUrl} -O /opt/main.sh\nchmod 0777 /opt/main.sh\ndos2unix /opt/main.sh\n/opt/main.sh" }, { "Fn::Sub": "wget ${IdleTrackingInstallationScriptUrl} -O /opt/LinuxIdleTrackingInstallationScript.sh\nchmod 0777 /opt/LinuxIdleTrackingInstallationScript.sh\ndos2unix /opt/LinuxIdleTrackingInstallationScript.sh" }, { "Fn::Sub": "echo 'sysadmin ALL=(ALL:ALL) ALL' >> /etc/sudoers\nTOKEN=$(curl -X PUT 'http://169.254.169.254/latest/api/token' -H 'X-aws-ec2-metadata-token-ttl-seconds: 21600')\ninstanceId=$(curl -H \"X-aws-ec2-metadata-token: $TOKEN\" -v http://169.254.169.254/latest/meta-data/instance-id)" }, { "Fn::Sub": "/opt/LinuxIdleTrackingInstallationScript.sh ${X64LinuxIdleCheckDownloadUrl} ${Arm64LinuxIdleCheckDownloadUrl} ${X64xprintIdleDownloadUrl} ${Arm64xprintIdleDownloadUrl} ${Version} ${AppEnabled} ${ShutdownOnIdle} ${ShutdownOnIdleTimeout} ${WarningWaitTimeout} ${TrackingMode} ${ShutdownOnDisconnect} ${ShutdownOnDisconnectTimeout} ${ShutdownWhenNoUsersConnected} ${ShutdownWhenNoUsersConnectedTimeout} ${AppCheckFrequency} $instanceId ${CloudLabsDeploymentIDEncrypt}" }, { "Fn::Sub": "rm /opt/LinuxIdleTrackingInstallationScript.sh\nrm /opt/main.sh" } ]] }, { "Fn::Sub": "echo 'App Enabled is False'" } ] } Keep the installer arguments in this order; the script reads them by position. $TOKEN and $instanceId are bash variables set at boot. ## Linux VM: parameters | Parameter | Value in parameter file | What it does | | --- | --- | --- | | AddToBashrcScriptUrl | AWS-ADD-TO-BASHRC-SCRIPT-URL | Script that sets up the user's bashrc for tracking | | IdleTrackingInstallationScriptUrl | AWS-LINUX-IDLETRACKING-INSTALLATION_SCRIPT-URL | Where the installer is downloaded from | | X64LinuxIdleCheckDownloadUrl | X64-LINUX-IDLECHECK-DOWNLOAD-URL | Idle-check agent for x64 VMs | | Arm64LinuxIdleCheckDownloadUrl | ARM64-LINUX-IDLECHECK-DOWNLOAD-URL | Idle-check agent for ARM64 VMs | | X64xprintIdleDownloadUrl | X64-XPRINTIDLE-DOWNLOAD-URL | xprintidle tool for x64 VMs | | Arm64xprintIdleDownloadUrl | ARM64-XPRINTIDLE-DOWNLOAD-URL | xprintidle tool for ARM64 VMs | | Version | GET-IDLE-TRACKING-VERSION | Tracker version | | AppEnabled | GET-ODL-ENABLE-ATTENDEE-TRACKING | Turns tracking on (True / False) | | OdlTrackingSource | GET-ODL-TRACKING-SOURCE | Must be 1 or 2, or the tracker is skipped | | ShutdownOnIdle | GET-ODL-ENABLE-SHUTDOWNONIDLE | Shut down when the user is idle | | ShutdownOnIdleTimeout | GET-ODL-SHUTDOWNONIDLE-TIMEOUT | Idle time before shutdown | | WarningWaitTimeout | GET-ODL-SHUTDOWNONIDLE-WARNINGWAITTIMEOUT | How long the idle warning waits | | TrackingMode | GET-ODL-SHUTDOWNONIDLE-TRACKINGMODE | Idle detection mode | | ShutdownOnDisconnect | GET-ODL-ENABLE-SHUTDOWNONDISCONNECT | Shut down after the session disconnects | | ShutdownOnDisconnectTimeout | GET-ODL-SHUTDOWNONDISCONNECT-TIMEOUT | Wait time after disconnect | | ShutdownWhenNoUsersConnected | GET-ODL-ENABLE-SHUTDOWNWHENNOUSERSCONNECTED | Shut down when nobody is signed in | | ShutdownWhenNoUsersConnectedTimeout | GET-ODL-SHUTDOWNWHENNOUSERSCONNECTED-TIMEOUT | Wait time with no users signed in | | AppCheckFrequency | 2 | How often the tracker checks | | CloudLabsDeploymentIDEncrypt | GET-DEPLOYMENT-ID-ENCRYPT | Links the VM to its deployment | AppPopupWaitTimeout (10) is in the parameter file but is not passed to the installer. ## Sample Linux VM Idle Tracker File URL’s: - [cloudlabs-prod-templates-s3.s3.us-east-1.amazonaws.com/idle-tracker/linux-ec2/deploy-01.json](http://cloudlabs-prod-templates-s3.s3.us-east-1.amazonaws.com/idle-tracker/linux-ec2/deploy-01.json) - [cloudlabs-prod-templates-s3.s3.us-east-1.amazonaws.com/idle-tracker/linux-ec2/deploy-01.parameters.json](http://cloudlabs-prod-templates-s3.s3.us-east-1.amazonaws.com/idle-tracker/linux-ec2/deploy-01.parameters.json)