tags:

views:

157

answers:

1

Hi,

I have the following scenario.

  • MSI installs a service.
  • MSI makes MAJOR upgrade to this installed service (uninstalls old version and installs new version)
  • During the major upgrade if it fails, it makes rollback and the service uninstalls completely.

Is it possible to tell MSI that if service major upgrade fails, uninstall the upgrade and install the previous version of the service? And how?

This is my code:

   <CustomAction Id="SetCustomActionDataValue" Return="check"
Property="RunCmdRollback" Value="[INSTALLDIR], [UPGRADINGPRODUCTCODE],
[OLDFOUND]" />

   <CustomAction Id="RunCmdRollback" BinaryKey="OPGInstallerCA2.dll"
DllEntry="CustomAction1" Execute='rollback' Return="ignore"
Impersonate='no'/>

   <CustomAction Id='InstallServiceSetProp' Property='InstallService'
Value='/installtype=notransaction /action=install /LogFile=
"[#WindowsService]" "[#ConfigFile]"' />
   <CustomAction Id='InstallService' BinaryKey='InstallUtil'
DllEntry='ManagedInstall' Execute='deferred' Return='ignore'
Impersonate='no' />

   <CustomAction Id='UnInstallServiceSetProp'
Property='UnInstallService' Value='/installtype=notransaction
/action=uninstall /LogFile= "[#WindowsService]" "[#ConfigFile]"' />
   <CustomAction Id='UnInstallService' BinaryKey='InstallUtil'
DllEntry='ManagedInstall' Execute='deferred' Return='ignore'
Impersonate='no'/>

   <CustomAction Id='CommitServiceSetProp' Property='CommitService'
Value='/installtype=notransaction /action=commit /LogFile=
"[#WindowsService]" "[#ConfigFile]"' />
   <CustomAction Id='CommitService' BinaryKey='InstallUtil'
DllEntry='ManagedInstall' Execute='commit' Return='ignore'
Impersonate='no' />

   <CustomAction Id='RollbackServiceSetProp'
Property='RollbackService' Value='/installtype=notransaction
/action=rollback /LogFile= "[#WindowsService]" "[#ConfigFile]"' />
   <CustomAction Id='RollbackService' BinaryKey='InstallUtil'
DllEntry='ManagedInstall' Execute='rollback' Return='ignore'
Impersonate='no' />

   <CustomAction Id='ConfigurePort'  Execute='deferred'
Return='ignore' BinaryKey='HTTPCFG' ExeCommand='set urlacl -u
http://+:55555/OPGatewayService/ -a D:(A;;GA;;;NS)' Impersonate='no'/>
   <CustomAction Id='UnConfigurePort'  Execute='deferred'
Return='ignore' BinaryKey='HTTPCFG' ExeCommand='delete urlacl -u
http://+:55555/OPGatewayService/' Impersonate='no'/>
   <CustomAction Id='RollbackConfigurePort'  Execute='rollback'
Return='ignore' BinaryKey='HTTPCFG' ExeCommand='delete urlacl -u
http://+:55555/OPGatewayService/' Impersonate='no'/>

   <CustomAction Id="StopVCA" Execute='rollback' Return='ignore'
ExeCommand="net stop OPGatewayService" Directory="TARGETDIR"
Impersonate='no' />


   <InstallExecuteSequence>


     <InstallValidate Sequence="1400" />
     <RemoveExistingProducts Sequence="1402">OLDFOUND</RemoveExistingProducts>
     <InstallInitialize Sequence="1500" />

     <Custom Action="ConfigurePort"
After='InstallService'>$OPGatewayComponent>2</Custom>
     <Custom Action="UnConfigurePort"
After='UnInstallService'>$OPGatewayComponent=2</Custom>

     <Custom Action='InstallServiceSetProp'
Before='StartServices'>$OPGatewayComponent>2</Custom>
     <Custom Action='InstallService'
After='InstallServiceSetProp'>$OPGatewayComponent>2</Custom>

     <Custom Action='UnInstallServiceSetProp'
After='StopServices'>$OPGatewayComponent=2</Custom>
     <Custom Action='UnInstallService'
After='UnInstallServiceSetProp'>$OPGatewayComponent=2</Custom>

     <Custom Action='CommitServiceSetProp'
After='RollbackService'>$OPGatewayComponent>2</Custom>
     <Custom Action='CommitService'
After='CommitServiceSetProp'>$OPGatewayComponent>2</Custom>

     <Custom Action='RollbackServiceSetProp'
After='InstallService'>$OPGatewayComponent>2</Custom>
     <Custom Action='RollbackService'
After='RollbackServiceSetProp'>$OPGatewayComponent>2</Custom>
     <Custom Action="StopVCA"
After='RollbackService'>$OPGatewayComponent>2</Custom>
     <Custom Action='RollbackConfigurePort'
After='StopVCA'>$OPGatewayComponent>2</Custom>
     <Custom Action='SetCustomActionDataValue'
After='RollbackConfigurePort'>$OPGatewayComponent>2</Custom>
     <Custom Action="RunCmdRollback" After='SetCustomActionDataValue'
 >$OPGatewayComponent>2</Custom>

     <Custom Action='AlreadyUpdated'
After='FindRelatedProducts'>SELFFOUND</Custom>
     <Custom Action='NoDowngrade'
After='FindRelatedProducts'>NEWERFOUND</Custom>

   </InstallExecuteSequence>

Another question. How can i make rollback action (RunCmdRollback) not to execute on failed upgrade, only on failed new install?

Thank you very much, Adriana

A: 

Is there a reason you're unable to use the ServiceInstall and ServiceControl elements in WiX?

It looks like you're making things way more complicated than they need to be.

sascha