I am building a software install agent which will be broken down into the following sequence...
1. Agent receives software request
The agent (which is a WCF service [WPF front-end]) receives a request which specifies the package ID, package name, source files location and silent install script (this part has already been taken care of).
2. Request is added to download queue
The request is added to a queue where each application that becomes first in line is downloaded from the source files location into a cached location on the local machine
3. Downloaded completes
Once the download is complete, the download is removed from the queue and the agent running in the system-tray presents a balloon asking if the user wants to begin the install (this is in case the user is about to shut-down their machine in which case the install will fail). If the user does not wish to install the software at that moment, the install is pending on the agent.
4. Check existing installs
Scan processes to make sure msiexec is not running. If it is running, the install becomes pending on the agent.
5. Initiate install
Install begins using the silent install script. Other installs may try to launch whilst one is running however it will be made pending on the agent as Step 4 outlines.
6. Install completes
Once msiexec is no longer detected as running, package is removed from installs pending and the cache is deletedMy question is, how would I cache the status of these pending downloads/installs which the agent would read from? Obviously if a user logs off or shuts down their machine, a record of the downloads to be resumed upon next startup needs to be restored as well as the pending installs.
The only way I can think of doing it is to write download requests (Step1/2) to an xml file.. after the download is complete (Step 3), remove the download request from the xml file.. add the pending install (Step 3) to another xml file containing all installs.. after the install is complete (Step 6), remove the install from the xml file.
This seems like a pretty clunky way of doing it though.. anyone got a better idea?