Bacula

A silent installer for Bacula.

Clearly this recipe was only for bacula-fd (Bacula Client).

Instead of installing bacula-fd for specific host, I install bacula for all host and I activate it when needed, using some script glue.

My recipe is:

<package
        id="bacula"
        name="Bacula File Daemon"
        revision="2281"
        reboot="false"
        priority="50">

        <check type="uninstall" condition="exists" path="Bacula" />

        <install cmd='"%SOFTWARE%\WPKG\winbacula-2.2.8.exe" /S' />
        <install cmd='net stop Bacula-fd' >
                <exit code='0' />
                <exit code='2' />
        </install>
        <install cmd='sc config Bacula-fd start= demand' />
        <upgrade cmd='net stop Bacula-fd' >
                <exit code='0' />
                <exit code='2' />
        </upgrade>
        <upgrade cmd='sc delete Bacula-fd' />
        <upgrade cmd='"%SOFTWARE%\WPKG\winbacula-2.2.8.exe" /S' />
        <upgrade cmd='sc config Bacula-fd start= demand' />
        <remove cmd='"%ProgramFiles%\Bacula\uninstall.exe" /S' />
</package>

as you can see:

  1. I install/upgrade bacula, then I stop and deactivate it (as stated on intro, default installation for all clients, but not activated)
  2. on upgrade, bacula service have to be removed for a real silent installation, so I stop and remove it before upgrade

Done that, I've to configure, and I use this recipe:

<package
        id="bacula-settings"
        name="Bacula File Daemon settings"
        revision="200803051"
        priority="5"
        reboot="false"
        execute="once">
        <depends package-id="bacula" />

        <install cmd='%WPKGROOT%\packages\bacula.bat' />
        <remove cmd='net stop Bacula-fd' >
                <exit code='0' />
                <exit code='2' />
        </remove>
        <remove cmd='sc config Bacula-fd start= demand' />
</package>

Note the execute=once, so this recipe have no check condition nor an upgrade command.

The bacula.bat script simply copies configuration files and scripts from a directory based on the hostname:

@ECHO OFF

:: Stop the service, for maximum safety
::
net stop Bacula-fd

:: We use the %COMPUTERNAME% variable to setup conditionally the bacula daemon
:: Note the dirs for English and Italian configuration files, add/modify as needed
::
if exist "%WPKGROOT%\packages\bacula\%COMPUTERNAME%.conf" (
        if exist "%ALLUSERSPROFILE%\Dati applicazioni\Bacula" (
                copy /y "%WPKGROOT%\packages\bacula\%COMPUTERNAME%.conf" "%ALLUSERSPROFILE%\Dati applicazioni\Bacula\bacula-fd.conf"
        )
        if exist "%ALLUSERSPROFILE%\Application Data\Bacula" (
                copy /y "%WPKGROOT%\packages\bacula\%COMPUTERNAME%.conf" "%ALLUSERSPROFILE%\Application Data\Bacula\bacula-fd.conf"
        )

        if exist "%WPKGROOT%\packages\bacula\%COMPUTERNAME%-before.bat" (
                if exist "%ALLUSERSPROFILE%\Dati applicazioni\Bacula" (
                        copy /y "%WPKGROOT%\packages\bacula\%COMPUTERNAME%-before.bat" "%ALLUSERSPROFILE%\Dati applicazioni\Bacula\before.bat"
                )
                if exist "%ALLUSERSPROFILE%\Application Data\Bacula" (
                        copy /y "%WPKGROOT%\packages\bacula\%COMPUTERNAME%-before.bat" "%ALLUSERSPROFILE%\Application Data\Bacula\before.bat"
                )
        )
        if exist "%WPKGROOT%\packages\bacula\%COMPUTERNAME%-after.bat" (
                if exist "%ALLUSERSPROFILE%\Dati applicazioni\Bacula" (
                        copy /y "%WPKGROOT%\packages\bacula\%COMPUTERNAME%-after.bat" "%ALLUSERSPROFILE%\Dati applicazioni\Bacula\after.bat"
                )
                if exist "%ALLUSERSPROFILE%\Application Data\Bacula" (
                        copy /y "%WPKGROOT%\packages\bacula\%COMPUTERNAME%-after.bat" "%ALLUSERSPROFILE%\Application Data\Bacula\after.bat"
                )
        )

        :: netsh firewall set portopening ALL 9102 "Bacula File Daemon" ENABLE SUBNET
        netsh firewall add allowedprogram program = "%ProgramFiles%\Bacula\bin\bacula-fd.exe" name = "Bacula File Daemon"
        sc config Bacula-fd start= auto
        net start Bacula-fd
) else (
        :: netsh firewall delete portopening ALL 9102
        netsh firewall delete allowedprogram program = "%ProgramFiles%\Bacula\bin\bacula-fd.exe"
        sc config Bacula-fd start= demand
)

:: force an exit with well-known code
::
exit 0

The only drawback for now: if I upgrade the binary (package bacula), I have to upgrade also the settings (bacula-settings) because by default the bacula package disables the service, and only the -settings package enables it.