]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/win32/win32_installer/winbacula.nsi
Win -- add help files to installer + stop any running bacula-fd before install
[bacula/bacula] / bacula / src / win32 / win32_installer / winbacula.nsi
1 ; winbacula.nsi
2 ;
3 ; Began as a version written by Michel Meyers (michel@tcnnet.dyndns.org)
4 ;
5 ; Adapted by Kern Sibbald for native Win32 Bacula
6 ;    added a number of elements from Christopher Hull's installer
7 ;
8 ; D. Scott Barninger Nov 13 2004
9 ; added configuration editing for bconsole.conf and bwx-console.conf
10 ; better explanation in dialog boxes for editing config files
11 ; added Start Menu items
12 ; fix uninstall of config files to do all not just bacula-fd.conf
13 ;
14 ; D. Scott Barninger Dec 05 2004
15 ; added specification of default permissions for bacula-fd.conf
16 ;   - thanks to Jamie Ffolliott for pointing me at cacls
17 ; added removal of working-dir files if user selects to remove config
18 ; uninstall is now 100% clean
19 ;
20 ; D. Scott Barninger Apr 17 2005
21 ; 1.36.3 release docs update
22 ; add pdf manual and menu shortcut
23 ;
24 ; Robert Nelson May 15 2006
25 ; Added server installs and implemented Microsoft install locations
26 ; Use LogicLib.nsh
27 ; Added Bacula-SD and Bacula-DIR
28 ; Replaced ParameterGiven with standard GetOptions
29 ;
30 ; Kern Sibbald October 2010
31 ; Remove server installs
32 ; Install into single bacula directory
33 ;  (i.e. undo a large part of what Robert Nelson did)
34 ;
35 ;
36 ; Command line options:
37 ;
38 ; /service    - 
39 ; /start
40 ;
41 ; netsh firewall add portopening protocol=tcp port=9102 name="Bacula-FD"
42
43
44 !define PRODUCT "Bacula"
45
46 ;
47 ; Include the Modern UI
48 ;
49
50 !include "MUI.nsh"
51 !include "LogicLib.nsh"
52 !include "FileFunc.nsh"
53 !include "Sections.nsh"
54 !include "StrFunc.nsh"
55 !include "WinMessages.nsh"
56 ;
57 ; Basics
58 ;
59 Name "Bacula"
60 OutFile "${OUT_DIR}\win${WINVER}bacula-${VERSION}.exe"
61 SetCompressor lzma
62
63 InstallDir "C:\Program Files\Bacula"
64 InstallDirRegKey HKLM "Software\Bacula" "InstallLocation"
65
66 InstType "Client"
67 ;InstType "Server"
68 ;InstType "Full"
69
70 !insertmacro GetParent
71
72 ${StrCase}
73 ${StrRep}
74 ${StrTok}
75 ${StrTrimNewLines}
76
77 ;
78 ; Pull in pages
79 ;
80
81 !define      MUI_COMPONENTSPAGE_SMALLDESC
82
83 !define      MUI_HEADERIMAGE
84 !define      MUI_BGCOLOR                739AB9
85 !define      MUI_HEADERIMAGE_BITMAP     "bacula-logo.bmp"
86
87 !InsertMacro MUI_PAGE_WELCOME
88 !InsertMacro MUI_PAGE_LICENSE "..\..\..\LICENSE"
89 Page custom EnterInstallType
90 !define      MUI_PAGE_CUSTOMFUNCTION_SHOW PageComponentsShow
91 !InsertMacro MUI_PAGE_COMPONENTS
92 !define      MUI_PAGE_CUSTOMFUNCTION_PRE PageDirectoryPre
93 !InsertMacro MUI_PAGE_DIRECTORY
94 Page custom EnterConfigPage1 LeaveConfigPage1
95 Page custom EnterConfigPage2 LeaveConfigPage2
96 !Define      MUI_PAGE_CUSTOMFUNCTION_LEAVE LeaveInstallPage
97 !InsertMacro MUI_PAGE_INSTFILES
98 Page custom EnterWriteTemplates
99 !Define      MUI_FINISHPAGE_SHOWREADME $INSTDIR\Readme.txt
100 !InsertMacro MUI_PAGE_FINISH
101
102 !InsertMacro MUI_UNPAGE_WELCOME
103 !InsertMacro MUI_UNPAGE_CONFIRM
104 !InsertMacro MUI_UNPAGE_INSTFILES
105 !InsertMacro MUI_UNPAGE_FINISH
106
107 !define      MUI_ABORTWARNING
108
109 !InsertMacro MUI_LANGUAGE "English"
110
111 !InsertMacro GetParameters
112 !InsertMacro GetOptions
113
114 DirText "Setup will install Bacula ${VERSION} to the directory specified below. To install in a different folder, click Browse and select another folder."
115
116 !InsertMacro MUI_RESERVEFILE_INSTALLOPTIONS
117 ;
118 ; Global Variables
119 ;
120 Var OptService
121 Var OptStart
122 Var OptSilent
123
124 Var CommonFilesDone
125
126 Var OsIsNT
127
128 Var HostName
129
130 Var ConfigClientName
131 Var ConfigClientPort
132 Var ConfigClientMaxJobs
133 Var ConfigClientPassword
134 Var ConfigClientInstallService
135 Var ConfigClientStartService
136
137 Var ConfigStorageName
138 Var ConfigStoragePort
139 Var ConfigStorageMaxJobs
140 Var ConfigStoragePassword
141 Var ConfigStorageInstallService
142 Var ConfigStorageStartService
143
144 Var ConfigDirectorName
145 Var ConfigDirectorPort
146 Var ConfigDirectorMaxJobs
147 Var ConfigDirectorPassword
148 Var ConfigDirectorAddress
149 Var ConfigDirectorMailServer
150 Var ConfigDirectorMailAddress
151 Var ConfigDirectorDB
152 Var ConfigDirectorInstallService
153 Var ConfigDirectorStartService
154
155 Var ConfigMonitorName
156 Var ConfigMonitorPassword
157
158 Var LocalDirectorPassword
159 Var LocalHostAddress
160
161 Var MySQLPath
162 Var MySQLVersion
163 Var PostgreSQLPath
164 Var PostgreSQLVersion
165
166 Var AutomaticInstall
167 Var InstallType
168
169 !define NewInstall      0
170 !define UpgradeInstall  1
171 !define MigrateInstall  2
172
173 Var OldInstallDir
174 Var PreviousComponents
175 Var NewComponents
176
177 ; Bit 0 = File Service
178 ;     1 = Storage Service
179 ;     2 = Director Service
180 ;     3 = Command Console
181 ;     4 = Bat Console
182 ;     5 = wxWidgits Console
183 ;     6 = Documentation (PDF)
184 ;     7 = Documentation (HTML)
185
186 !define ComponentFile                   1
187 !define ComponentStorage                2
188 !define ComponentDirector               4
189 !define ComponentTextConsole            8
190 !define ComponentBatConsole             16
191 !define ComponentGUIConsole             32
192 !define ComponentPDFDocs                64
193 !define ComponentHTMLDocs               128
194
195 !define ComponentsRequiringUserConfig           63
196 !define ComponentsFileAndStorage                3
197 !define ComponentsFileAndStorageAndDirector     7
198 !define ComponentsDirectorAndTextGuiConsoles    60
199 !define ComponentsTextAndGuiConsoles            56
200
201 Var HDLG
202 Var HCTL
203
204 Function .onInit
205   Push $R0
206   Push $R1
207
208   ; Process Command Line Options
209   StrCpy $OptService 1
210   StrCpy $OptStart 1
211   StrCpy $OptSilent 0
212   StrCpy $CommonFilesDone 0
213   StrCpy $OsIsNT 0
214   StrCpy $AutomaticInstall 0
215   StrCpy $InstallType ${NewInstall}
216   StrCpy $OldInstallDir ""
217   StrCpy $PreviousComponents 0
218   StrCpy $NewComponents 0
219   StrCpy $MySQLPath ""
220   StrCpy $MySQLVersion ""
221   StrCpy $PostgreSQLPath ""
222   StrCpy $PostgreSQLVersion ""
223   StrCpy $LocalDirectorPassword ""
224
225   ${GetParameters} $R0
226
227   ClearErrors
228   ${GetOptions} $R0 "/noservice" $R1
229   IfErrors +2
230     StrCpy $OptService 0
231
232   ClearErrors
233   ${GetOptions} $R0 "/nostart" $R1
234   IfErrors +2
235     StrCpy $OptStart 0
236
237   IfSilent 0 +2
238     StrCpy $OptSilent 1
239
240   ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
241   ${If} $R0 != ""
242     StrCpy $OsIsNT 1
243   ${EndIf}
244
245   Call GetComputerName
246   Pop $HostName
247
248   Call GetHostName
249   Pop $LocalHostAddress
250
251   Call GetUserName
252
253   ; Configuration Defaults
254
255   StrCpy $ConfigClientName               "$HostName-fd"
256   StrCpy $ConfigClientPort               9102
257   StrCpy $ConfigClientMaxJobs            10
258   ;StrCpy $ConfigClientPassword
259   StrCpy $ConfigClientInstallService     "$OptService"
260   StrCpy $ConfigClientStartService       "$OptStart"
261
262   StrCpy $ConfigDirectorPort             9101
263
264   StrCpy $ConfigMonitorName              "$HostName-mon"
265   ;StrCpy $ConfigMonitorPassword
266
267 ; PLUGINSDIR refers to temporary helper programs and not Bacula plugins!
268   InitPluginsDir
269   File "/oname=$PLUGINSDIR\openssl.exe"  "${SRC_DIR}\openssl.exe"
270   File "/oname=$PLUGINSDIR\libeay32.dll" "${SRC_DIR}\libeay32.dll"
271   File "/oname=$PLUGINSDIR\ssleay32.dll" "${SRC_DIR}\ssleay32.dll"
272   File "/oname=$PLUGINSDIR\sed.exe"      "${SRC_DIR}\sed.exe"
273
274   !InsertMacro MUI_INSTALLOPTIONS_EXTRACT "InstallType.ini"
275   !InsertMacro MUI_INSTALLOPTIONS_EXTRACT "WriteTemplates.ini"
276
277   SetPluginUnload alwaysoff
278
279 ; Set client password
280   nsExec::Exec '"$PLUGINSDIR\openssl.exe" rand -base64 -out $PLUGINSDIR\pw.txt 33'
281   pop $R0
282   ${If} $R0 = 0
283    FileOpen $R1 "$PLUGINSDIR\pw.txt" r
284    IfErrors +4
285      FileRead $R1 $R0
286      ${StrTrimNewLines} $ConfigClientPassword $R0
287      FileClose $R1
288   ${EndIf}
289
290   SetPluginUnload manual
291
292 ; Set monitor password
293   nsExec::Exec '"$PLUGINSDIR\openssl.exe" rand -base64 -out $PLUGINSDIR\pw.txt 33'
294   pop $R0
295   ${If} $R0 = 0
296    FileOpen $R1 "$PLUGINSDIR\pw.txt" r
297    IfErrors +4
298      FileRead $R1 $R0
299      ${StrTrimNewLines} $ConfigMonitorPassword $R0
300      FileClose $R1
301   ${EndIf}
302
303   Pop $R1
304   Pop $R0
305 FunctionEnd
306
307 Function .onSelChange
308   Call UpdateComponentUI
309 FunctionEnd
310
311 Function InstallCommonFiles
312   ${If} $CommonFilesDone = 0
313     SetOutPath "$INSTDIR"
314     File "Readme.txt"
315
316     SetOutPath "$INSTDIR"
317 !if "${BUILD_TOOLS}" == "MinGW32"
318     File "${SRC_DIR}\mingwm10.dll"
319     File "${SRC_DIR}\pthreadGCE.dll"
320     File "${SRC_DIR}\zlib1.dll"
321     File "${SRC_DIR}\ssleay32.dll"
322     File "${SRC_DIR}\libeay32.dll"
323 !endif
324 !if "${BUILD_TOOLS}" == "MinGW64"
325     File "${SRC_DIR}\pthreadGCE.dll"
326     File "${SRC_DIR}\cryptoeay32-0.9.8.dll"
327     File "${SRC_DIR}\ssleay32-0.9.8.dll"
328     File "${SRC_DIR}\zlib1.dll"
329 !endif
330     File "${SRC_DIR}\bacula.dll"
331
332     File "/oname=$INSTDIR\openssl.cnf" "${SRC_DIR}\openssl.cnf"
333     File "${SRC_DIR}\openssl.exe"
334     File "${SRC_DIR}\bsleep.exe"
335     File "${SRC_DIR}\bsmtp.exe"
336     File "${SRC_DIR}\expr64.exe"
337     File "${SRC_DIR}\snooze.exe"
338
339     CreateShortCut "$SMPROGRAMS\Bacula\Documentation\View Readme.lnk" "write.exe" '"$INSTDIR\Readme.txt"'
340
341     StrCpy $CommonFilesDone 1
342   ${EndIf}
343 FunctionEnd
344
345 Section "-Initialize"
346
347   WriteRegStr   HKLM Software\Bacula InstallLocation "$INSTDIR"
348
349   Call GetSelectedComponents
350   Pop $R2
351   WriteRegDWORD HKLM Software\Bacula Components $R2
352
353   ; remove start menu items
354   SetShellVarContext all
355
356   Delete /REBOOTOK "$SMPROGRAMS\Bacula\Configuration\*"
357   Delete /REBOOTOK "$SMPROGRAMS\Bacula\Documentation\*"
358   Delete /REBOOTOK "$SMPROGRAMS\Bacula\*"
359   RMDir "$SMPROGRAMS\Bacula\Configuration"
360   RMDir "$SMPROGRAMS\Bacula\Documentation"
361   RMDir "$SMPROGRAMS\Bacula"
362   CreateDirectory "$SMPROGRAMS\Bacula"
363   CreateDirectory "$SMPROGRAMS\Bacula\Configuration"
364   CreateDirectory "$SMPROGRAMS\Bacula\Documentation"
365
366   CreateDirectory "$INSTDIR"
367   CreateDirectory "$INSTDIR\working"
368
369   SetOutPath "$INSTDIR"
370   File "..\..\..\LICENSE"
371   Delete /REBOOTOK "$INSTDIR\License.txt"
372
373 ; Output a series of SED commands to configure the .conf file(s)
374   FileOpen $R1 $PLUGINSDIR\config.sed w
375   FileWrite $R1 "s;@VERSION@;${VERSION};g$\r$\n"
376   FileWrite $R1 "s;@DATE@;${__DATE__};g$\r$\n"
377   FileWrite $R1 "s;@DISTNAME@;Windows;g$\r$\n"
378
379   StrCpy $R2 ${BUILD_TOOLS}
380
381   Call GetHostName
382   Exch $R3
383   Pop $R3
384
385   FileWrite $R1 "s;@DISTVER@;$R2;g$\r$\n"
386
387   ${StrRep} $R2 "$INSTDIR\working" "\" "\\\\"
388   FileWrite $R1 's;@working_dir@;$R2;g$\r$\n'
389   ${StrRep} $R2 "$INSTDIR\working" "\" "\\"
390   FileWrite $R1 's;@working_dir_cmd@;$R2;g$\r$\n'
391
392 ; ${StrRep} $R2 "$INSTDIR" "\" "\\\\"
393 ; FileWrite $R1 's;@bin_dir@;$R2;g$\r$\n'
394 ; ${StrRep} $R2 "$INSTDIR" "\" "\\"
395 ; FileWrite $R1 's;@bin_dir_cmd@;$R2;g$\r$\n'
396
397   ${StrRep} $R2 "$INSTDIR\plugins" "\" "\\\\"
398   FileWrite $R1 's;@fdplugins_dir@;$R2;g$\r$\n'
399
400   ${StrRep} $R2 "$INSTDIR" "\" "/"
401   FileWrite $R1 "s;@BUILD_DIR@;$R2;g$\r$\n"
402
403   FileWrite $R1 "s;@client_address@;$LocalHostAddress;g$\r$\n"
404
405   ${If} "$ConfigClientName" != ""
406     FileWrite $R1 "s;@client_name@;$ConfigClientName;g$\r$\n"
407   ${EndIf}
408   ${If} "$ConfigClientPort" != ""
409     FileWrite $R1 "s;@client_port@;$ConfigClientPort;g$\r$\n"
410   ${EndIf}
411   ${If} "$ConfigClientMaxJobs" != ""
412     FileWrite $R1 "s;@client_maxjobs@;$ConfigClientMaxJobs;g$\r$\n"
413   ${EndIf}
414   ${If} "$ConfigClientPassword" != ""
415     FileWrite $R1 "s;@client_password@;$ConfigClientPassword;g$\r$\n"
416   ${EndIf}
417   ${If} "$ConfigDirectorName" != ""
418     FileWrite $R1 "s;@director_name@;$ConfigDirectorName;g$\r$\n"
419   ${EndIf}
420   ${If} "$ConfigDirectorPort" != ""
421     FileWrite $R1 "s;@director_port@;$ConfigDirectorPort;g$\r$\n"
422   ${EndIf}
423   ${If} "$ConfigDirectorPassword" != ""
424     FileWrite $R1 "s;@director_password@;$ConfigDirectorPassword;g$\r$\n"
425   ${EndIf}
426   ${If} "$ConfigDirectorAddress" != ""
427     FileWrite $R1 "s;@director_address@;$ConfigDirectorAddress;g$\r$\n"
428   ${EndIf}
429   ${If} "$ConfigMonitorName" != ""
430     FileWrite $R1 "s;@monitor_name@;$ConfigMonitorName;g$\r$\n"
431   ${EndIf}
432   ${If} "$ConfigMonitorPassword" != ""
433     FileWrite $R1 "s;@monitor_password@;$ConfigMonitorPassword;g$\r$\n"
434   ${EndIf}
435
436   FileClose $R1
437
438   ${If} ${FileExists} "$OldInstallDir\bacula-fd.exe"
439     nsExec::ExecToLog '"$OldInstallDir\bacula-fd.exe" /kill'     ; Shutdown any bacula that could be running
440     Sleep 3000
441     nsExec::ExecToLog '"$OldInstallDir\bacula-fd.exe" /remove'   ; Remove existing service
442   ${EndIf}
443
444 SectionEnd
445
446
447 SectionGroup "Client" SecGroupClient
448
449 Section "File Service" SecFileDaemon
450   SectionIn 1 2 3
451
452   SetOutPath "$INSTDIR\plugins"
453   File "${SRC_DIR}\exchange-fd.dll"
454
455   SetOutPath "$INSTDIR"
456
457   File "${SRC_DIR}\bacula-fd.exe"
458
459   File "/oname=$PLUGINSDIR\bacula-fd.conf" "bacula-fd.conf.in"
460
461   StrCpy $0 "$INSTDIR"
462   StrCpy $1 bacula-fd.conf
463   Call ConfigEditAndCopy
464
465   StrCpy $0 bacula-fd
466   StrCpy $1 "File Service"
467   StrCpy $2 $ConfigClientInstallService
468   StrCpy $3 $ConfigClientStartService
469
470   Call InstallDaemon
471
472   CreateShortCut "$SMPROGRAMS\Bacula\Configuration\Edit Client Configuration.lnk" "write.exe" '"$INSTDIR\bacula-fd.conf"'
473 SectionEnd
474
475 SectionGroupEnd
476
477 SectionGroup "Consoles" SecGroupConsoles
478
479 Section "Command Console" SecConsole
480   SectionIn 1 2 3
481
482   SetOutPath "$INSTDIR"
483
484   File "${SRC_DIR}\bconsole.exe"
485   Call InstallCommonFiles
486
487   File "/oname=$PLUGINSDIR\bconsole.conf" "bconsole.conf.in"
488   StrCpy $0 "$INSTDIR"
489   StrCpy $1 bconsole.conf
490   Call ConfigEditAndCopy
491
492   CreateShortCut "$SMPROGRAMS\Bacula\bconsole.lnk" "$INSTDIR\bconsole.exe" '-c "$INSTDIR\bconsole.conf"' "$INSTDIR\bconsole.exe" 0
493   CreateShortCut "$SMPROGRAMS\Bacula\Configuration\Edit Command Console Configuration.lnk" "write.exe" '"$INSTDIR\bconsole.conf"'
494
495 SectionEnd
496
497 Section "Bat Console" SecBatConsole
498   SectionIn 1 2 3
499
500   SetOutPath "$INSTDIR"
501
502   Call InstallCommonFiles
503   File "${SRC_DIR}\QtCore4.dll"
504   File "${SRC_DIR}\QtGui4.dll"
505
506   File "${SRC_DIR}\bat.exe"
507
508   File "/oname=$PLUGINSDIR\bat.conf" "bat.conf.in"
509   StrCpy $0 "$INSTDIR"
510   StrCpy $1 bat.conf
511   Call ConfigEditAndCopy
512
513   File "${SRC_DIR}\help\*"
514    
515
516   ; Create Start Menu entry
517   CreateShortCut "$SMPROGRAMS\Bacula\Bat.lnk" "$INSTDIR\bat.exe" '-c "$INSTDIR\bat.conf"' "$INSTDIR\bat.exe" 0
518   CreateShortCut "$SMPROGRAMS\Bacula\Configuration\Edit Bat Configuration.lnk" "write.exe" '"$INSTDIR\bat.conf"'
519 SectionEnd
520
521
522 ; Deleted because wxconsole is deprecated
523 ;Section "Graphical Console" SecWxConsole
524 ;  SectionIn 1 2 3
525   
526 ;  SetOutPath "$INSTDIR"
527 ;
528 ;SectionEnd
529
530 SectionGroupEnd
531
532 SectionGroup "Documentation" SecGroupDocumentation
533
534 Section "Documentation (Acrobat Format)" SecDocPdf
535   SectionIn 1 2 3
536
537   SetOutPath "$INSTDIR\doc"
538   CreateDirectory "$INSTDIR\doc"
539
540   File "${SRC_DIR}\docs\manuals\en\console\console.pdf"
541   File "${SRC_DIR}\docs\manuals\en\misc\misc.pdf"
542   File "${SRC_DIR}\docs\manuals\en\main\main.pdf"
543   File "${SRC_DIR}\docs\manuals\en\utility\utility.pdf"
544   File "${SRC_DIR}\docs\manuals\en\problems\problems.pdf"
545   CreateShortCut "$SMPROGRAMS\Bacula\Documentation\Console.lnk" '"$INSTDIR\doc\console.pdf"'
546   CreateShortCut "$SMPROGRAMS\Bacula\Documentation\Main.lnk" '"$INSTDIR\doc\main.pdf"'
547   CreateShortCut "$SMPROGRAMS\Bacula\Documentation\Misc.lnk" '"$INSTDIR\doc\misc.pdf"'
548   CreateShortCut "$SMPROGRAMS\Bacula\Documentation\Utility.lnk" '"$INSTDIR\doc\utility.pdf"'
549   CreateShortCut "$SMPROGRAMS\Bacula\Documentation\Problems.lnk" '"$INSTDIR\doc\problems.pdf"'
550   SetOutPath "$INSTDIR"
551 SectionEnd
552
553 ;Section "Documentation (HTML Format)" SecDocHtml
554 ;  SectionIn 3
555
556 ; SetOutPath "$INSTDIR\doc"
557 ; CreateDirectory "$INSTDIR\doc"
558
559 ; File "${SRC_DIR}\manual\bacula\*.html"
560 ; File "${SRC_DIR}\manual\bacula\*.png"
561 ; File "${SRC_DIR}\manual\bacula\*.css"
562 ; CreateShortCut "$SMPROGRAMS\Bacula\Documentation\Manual (HTML).lnk" '"$INSTDIR\doc\index.html"'
563 ;SectionEnd
564
565 SectionGroupEnd
566
567 Section "-Finish"
568   Push $R0
569
570   ${If} $OsIsNT = 1
571 ;   nsExec::ExecToLog 'cmd.exe /C echo Y|cacls "$INSTDIR" /T /G SYSTEM:F Administrators:F'
572   ${EndIf}
573
574   ; Write the uninstall keys for Windows & create Start Menu entry
575   WriteRegStr   HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula" "DisplayName" "Bacula"
576   WriteRegStr   HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula" "InstallLocation" "$INSTDIR"
577   WriteRegStr   HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula" "DisplayVersion" "${VERSION}"
578   ${StrTok} $R0 "${VERSION}" "." 0 0
579   WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula" "VersionMajor" $R0
580   ${StrTok} $R0 "${VERSION}" "." 1 0
581   WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula" "VersionMinor" $R0
582   WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula" "NoModify" 1
583   WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula" "NoRepair" 1
584   WriteRegStr   HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula" "URLUpdateInfo" "http://www.bacula.org"
585   WriteRegStr   HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula" "URLInfoAbout" "http://www.bacula.org"
586   WriteRegStr   HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula" "HelpLink" "http://www.bacula.org?page=support"
587   WriteRegStr   HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula" "UninstallString" '"$INSTDIR\uninstall.exe"'
588   WriteUninstaller "$INSTDIR\Uninstall.exe"
589   CreateShortCut "$SMPROGRAMS\Bacula\Uninstall Bacula.lnk" "$INSTDIR\Uninstall.exe" "" "$INSTDIR\Uninstall.exe" 0
590   Pop $R0
591 SectionEnd
592
593 ; Extra Page descriptions
594
595 LangString DESC_SecFileDaemon ${LANG_ENGLISH} "Install Bacula File Daemon on this system."
596 LangString DESC_SecConsole ${LANG_ENGLISH} "Install command console program on this system."
597 LangString DESC_SecBatConsole ${LANG_ENGLISH} "Install Bat graphical console program on this system."
598
599 LangString TITLE_ConfigPage1 ${LANG_ENGLISH} "Configuration"
600 LangString SUBTITLE_ConfigPage1 ${LANG_ENGLISH} "Set installation configuration."
601
602 LangString TITLE_ConfigPage2 ${LANG_ENGLISH} "Configuration (continued)"
603 LangString SUBTITLE_ConfigPage2 ${LANG_ENGLISH} "Set installation configuration."
604
605 LangString TITLE_InstallType ${LANG_ENGLISH} "Installation Type"
606 LangString SUBTITLE_InstallType ${LANG_ENGLISH} "Choose installation type."
607
608 LangString TITLE_WriteTemplates ${LANG_ENGLISH} "Create Templates"
609 LangString SUBTITLE_WriteTemplates ${LANG_ENGLISH} "Create a resource template for inclusion in the Director's configuration file."
610
611 !InsertMacro MUI_FUNCTION_DESCRIPTION_BEGIN
612   !InsertMacro MUI_DESCRIPTION_TEXT ${SecFileDaemon} $(DESC_SecFileDaemon)
613   !InsertMacro MUI_DESCRIPTION_TEXT ${SecConsole} $(DESC_SecConsole)
614   !InsertMacro MUI_DESCRIPTION_TEXT ${SecBatConsole} $(DESC_SecBatConsole)
615 !InsertMacro MUI_FUNCTION_DESCRIPTION_END
616
617 ; Uninstall section
618
619 UninstallText "This will uninstall Bacula. Click Uninstall to continue."
620
621 Section "Uninstall"
622   ; Shutdown any baculum that could be running
623   nsExec::ExecToLog '"$INSTDIR\bacula-fd.exe" /kill'
624   Sleep 3000
625
626 ; ReadRegDWORD $R0 HKLM "Software\Bacula" "Service_Bacula-fd"
627   ; Remove bacula service
628   nsExec::ExecToLog '"$INSTDIR\bacula-fd.exe" /remove'
629   nsExec::ExecToLog '"$INSTDIR\plugins\exchange-fd.dll" /remove'
630   
631   ; remove registry keys
632   DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula"
633   DeleteRegKey HKLM "Software\Bacula"
634
635   ; remove start menu items
636   SetShellVarContext all
637   Delete /REBOOTOK "$SMPROGRAMS\Bacula\*"
638   RMDir "$SMPROGRAMS\Bacula"
639
640   ; remove files and uninstaller (preserving config for now)
641   Delete /REBOOTOK "$INSTDIR\doc\*"
642   Delete /REBOOTOK "$INSTDIR\*"
643
644   ; Check for existing installation
645   MessageBox MB_YESNO|MB_ICONQUESTION \
646   "Would you like to delete the current configuration files and the working state file?" IDNO NoDel
647     Delete /REBOOTOK "$INSTDIR\*"
648     Delete /REBOOTOK "$INSTDIR\working\*"
649     Delete /REBOOTOK "$INSTDIR\plugins\*"
650     Delete /REBOOTOK "$PLUGINSDIR\bacula-*.conf"
651     Delete /REBOOTOK "$PLUGINSDIR\*console.conf"
652     Delete /REBOOTOK "$PLUGINSDIR\*conf.in"
653     Delete /REBOOTOK "$PLUGINSDIR\openssl.exe"
654     Delete /REBOOTOK "$PLUGINSDIR\libeay32.dll"
655     Delete /REBOOTOK "$PLUGINSDIR\ssleay32.dll"
656     Delete /REBOOTOK "$PLUGINSDIR\sed.exe"    
657     Delete /REBOOTOK "$PLUGINSDIR\pw.txt"     
658     Delete /REBOOTOK "$PLUGINSDIR\*.sed" 
659     Delete /REBOOTOK "$PLUGINSDIR\*.cmd"    
660     Delete /REBOOTOK "$PLUGINSDIR\*.sql"    
661     RMDir "$INSTDIR\plugins"
662     RMDir "$INSTDIR\working"
663     RMDir "$INSTDIR"
664 NoDel:
665
666   ; remove directories used
667   RMDir "$INSTDIR\doc"
668   RMDir "$INSTDIR"
669 SectionEnd
670
671 ;
672 ; $0 - Service Name (ie Bacula-FD)
673 ; $1 - Service Description (ie Bacula File Daemon)
674 ; $2 - Install as Service
675 ; $3 - Start Service now
676 ;
677 Function InstallDaemon
678   Call InstallCommonFiles
679
680   WriteRegDWORD HKLM "Software\Bacula" "Service_$0" $2
681   
682   ${If} $2 = 1
683     nsExec::ExecToLog '"$INSTDIR\$0.exe" /kill'
684     sleep 3000
685     nsExec::ExecToLog '"$INSTDIR\$0.exe" /remove'
686     nsExec::ExecToLog '"$INSTDIR\$0.exe" /install -c "$INSTDIR\$0.conf"'
687
688     ${If} $OsIsNT <> 1
689       File "Start.bat"
690       File "Stop.bat"
691     ${EndIf}
692
693     ; Start the service?
694
695     ${If} $3 = 1  
696       ${If} $OsIsNT = 1
697         nsExec::ExecToLog 'net start $0'
698       ${Else}
699         Exec '"$INSTDIR\$0.exe" /service -c "$INSTDIR\$0.conf"'
700       ${EndIf}
701     ${EndIf}
702   ${Else}
703     CreateShortCut "$SMPROGRAMS\Bacula\Start $1.lnk" "$INSTDIR\$0.exe" '-c "$INSTDIR\$0.conf"' "$INSTDIR\$0.exe" 0
704   ${EndIf}
705 FunctionEnd
706
707 Function GetComputerName
708   Push $R0
709   Push $R1
710   Push $R2
711
712   System::Call "kernel32::GetComputerNameA(t .R0, *i ${NSIS_MAX_STRLEN} R1) i.R2"
713
714   ${StrCase} $R0 $R0 "L"
715
716   Pop $R2
717   Pop $R1
718   Exch $R0
719 FunctionEnd
720
721 !define ComputerNameDnsFullyQualified   3
722
723 Function GetHostName
724   Push $R0
725   Push $R1
726   Push $R2
727
728   ${If} $OsIsNT = 1
729     System::Call "kernel32::GetComputerNameExA(i ${ComputerNameDnsFullyQualified}, t .R0, *i ${NSIS_MAX_STRLEN} R1) i.R2 ?e"
730     ${If} $R2 = 0
731       Pop $R2
732       DetailPrint "GetComputerNameExA failed - LastError = $R2"
733       Call GetComputerName
734       Pop $R0
735     ${Else}
736       Pop $R2
737     ${EndIf}
738   ${Else}
739     Call GetComputerName
740     Pop $R0
741   ${EndIf}
742
743   Pop $R2
744   Pop $R1
745   Exch $R0
746 FunctionEnd
747
748 !define NameUserPrincipal 8
749
750 Function GetUserName
751   Push $R0
752   Push $R1
753   Push $R2
754
755   ${If} $OsIsNT = 1
756     System::Call "secur32::GetUserNameExA(i ${NameUserPrincipal}, t .R0, *i ${NSIS_MAX_STRLEN} R1) i.R2 ?e"
757     ${If} $R2 = 0
758       Pop $R2
759       DetailPrint "GetUserNameExA failed - LastError = $R2"
760       Pop $R0
761       StrCpy $R0 ""
762     ${Else}
763       Pop $R2
764     ${EndIf}
765   ${Else}
766       StrCpy $R0 ""
767   ${EndIf}
768
769   ${If} $R0 == ""
770     System::Call "advapi32::GetUserNameA(t .R0, *i ${NSIS_MAX_STRLEN} R1) i.R2 ?e"
771     ${If} $R2 = 0
772       Pop $R2
773       DetailPrint "GetUserNameA failed - LastError = $R2"
774       StrCpy $R0 ""
775     ${Else}
776       Pop $R2
777     ${EndIf}
778   ${EndIf}
779
780   Pop $R2
781   Pop $R1
782   Exch $R0
783 FunctionEnd
784
785 Function ConfigEditAndCopy
786   Push $R1
787
788   ${If} ${FileExists} "$0\$1"
789     StrCpy $R1 ".new"
790   ${Else}
791     StrCpy $R1 ""
792   ${EndIf}
793
794   nsExec::ExecToLog '$PLUGINSDIR\sed.exe -f "$PLUGINSDIR\config.sed" -i.bak "$PLUGINSDIR\$1"'
795   CopyFiles "$PLUGINSDIR\$1" "$0\$1$R1"
796
797   Pop $R1
798 FunctionEnd
799
800 Function GetSelectedComponents
801   Push $R0
802   StrCpy $R0 0
803   ${If} ${SectionIsSelected} ${SecFileDaemon}
804     IntOp $R0 $R0 | ${ComponentFile}
805   ${EndIf}
806   ${If} ${SectionIsSelected} ${SecConsole}
807     IntOp $R0 $R0 | ${ComponentTextConsole}
808   ${EndIf}
809   ${If} ${SectionIsSelected} ${SecBatConsole}
810     IntOp $R0 $R0 | ${ComponentBatConsole}
811   ${EndIf}
812   ${If} ${SectionIsSelected} ${SecDocPdf}
813     IntOp $R0 $R0 | ${ComponentPDFDocs}
814   ${EndIf}
815   Exch $R0
816 FunctionEnd
817
818 Function PageComponentsShow
819   Call SelectPreviousComponents
820   Call UpdateComponentUI
821 FunctionEnd
822
823 Function PageDirectoryPre
824   ${If} $AutomaticInstall = 1
825   ${OrIf} $InstallType = ${UpgradeInstall}
826     Abort
827   ${EndIf}
828 FunctionEnd
829
830 Function LeaveInstallPage
831   Push "$INSTDIR\install.log"
832   Call DumpLog
833 FunctionEnd
834
835 Function EnterWriteTemplates
836   Push $R0
837   Push $R1
838
839   Call GetSelectedComponents
840   Pop $R0
841
842   IntOp $R0 $R0 & ${ComponentDirector}
843   IntOp $R1 $NewComponents & ${ComponentsFileAndStorage}
844
845   ${If} $R0 <> 0
846   ${OrIf} $R1 = 0
847     Pop $R1
848     Pop $R0
849     Abort
850   ${EndIf}
851
852   IntOp $R0 $NewComponents & ${ComponentFile}
853   ${If} $R0 = 0
854     WriteINIStr "$PLUGINSDIR\WriteTemplates.ini" "Field 2" State 0
855     WriteINIStr "$PLUGINSDIR\WriteTemplates.ini" "Field 2" Flags DISABLED
856     DeleteINIStr "$PLUGINSDIR\WriteTemplates.ini" "Field 3" State
857     WriteINIStr "$PLUGINSDIR\WriteTemplates.ini" "Field 3" Flags REQ_SAVE|FILE_EXPLORER|WARN_IF_EXIST|DISABLED
858   ${Else}
859     WriteINIStr "$PLUGINSDIR\WriteTemplates.ini" "Field 2" State 1
860     DeleteINIStr "$PLUGINSDIR\WriteTemplates.ini" "Field 2" Flags
861     WriteINIStr "$PLUGINSDIR\WriteTemplates.ini" "Field 3" State "C:\$ConfigClientName.conf"
862   ${EndIf}
863
864
865   !InsertMacro MUI_HEADER_TEXT "$(TITLE_WriteTemplates)" "$(SUBTITLE_WriteTemplates)"
866   !InsertMacro MUI_INSTALLOPTIONS_DISPLAY "WriteTemplates.ini"
867
868   !InsertMacro MUI_INSTALLOPTIONS_READ $R0 "WriteTemplates.ini" "Field 2" State
869   ${If} $R0 <> 0
870     File "/oname=$PLUGINSDIR\client.conf.in" "client.conf.in"
871
872     nsExec::ExecToLog '$PLUGINSDIR\sed.exe -f "$PLUGINSDIR\config.sed" -i.bak "$PLUGINSDIR\client.conf.in"'
873     !InsertMacro MUI_INSTALLOPTIONS_READ $R0 "WriteTemplates.ini" "Field 3" State
874     ${If} $R0 != ""
875       CopyFiles "$PLUGINSDIR\client.conf.in" "$R0"
876     ${EndIf}
877   ${EndIf}
878
879
880   Pop $R1
881   Pop $R0
882 FunctionEnd
883
884 Function SelectPreviousComponents
885   ${If} $InstallType <> ${NewInstall}
886     IntOp $R1 $PreviousComponents & ${ComponentFile}
887     ${If} $R1 <> 0
888       !InsertMacro SelectSection ${SecFileDaemon}
889       !InsertMacro SetSectionFlag ${SecFileDaemon} ${SF_RO}
890     ${Else}
891       !InsertMacro UnselectSection ${SecFileDaemon}
892       !InsertMacro ClearSectionFlag ${SecFileDaemon} ${SF_RO}
893     ${EndIf}
894     IntOp $R1 $PreviousComponents & ${ComponentTextConsole}
895     ${If} $R1 <> 0
896       !InsertMacro SelectSection ${SecConsole}
897       !InsertMacro SetSectionFlag ${SecConsole} ${SF_RO}
898     ${Else}
899       !InsertMacro UnselectSection ${SecConsole}
900       !InsertMacro ClearSectionFlag ${SecConsole} ${SF_RO}
901     ${EndIf}
902     IntOp $R1 $PreviousComponents & ${ComponentBatConsole}
903     ${If} $R1 <> 0
904       !InsertMacro SelectSection ${SecBatConsole}
905       !InsertMacro SetSectionFlag ${SecBatConsole} ${SF_RO}
906     ${Else}
907       !InsertMacro UnselectSection ${SecBatConsole}
908       !InsertMacro ClearSectionFlag ${SecBatConsole} ${SF_RO}
909     ${EndIf}
910     ${If} $R1 <> 0
911       !InsertMacro SelectSection ${SecDocPdf}
912       !InsertMacro SetSectionFlag ${SecDocPdf} ${SF_RO}
913     ${Else}
914       !InsertMacro UnselectSection ${SecDocPdf}
915       !InsertMacro ClearSectionFlag ${SecDocPdf} ${SF_RO}
916     ${EndIf}
917   ${EndIf}
918 FunctionEnd
919
920 Function UpdateComponentUI
921   Push $R0
922   Push $R1
923
924   Call GetSelectedComponents
925   Pop $R0
926
927   IntOp $R1 $R0 ^ $PreviousComponents
928   IntOp $NewComponents $R0 & $R1
929
930   ${If} $InstallType <> ${NewInstall}
931     IntOp $R1 $NewComponents & ${ComponentFile}
932     ${If} $R1 <> 0
933       !InsertMacro SetSectionFlag ${SecFileDaemon} ${SF_BOLD}
934     ${Else}
935       !InsertMacro ClearSectionFlag ${SecFileDaemon} ${SF_BOLD}
936     ${EndIf}
937     IntOp $R1 $NewComponents & ${ComponentTextConsole}
938     ${If} $R1 <> 0
939       !InsertMacro SetSectionFlag ${SecConsole} ${SF_BOLD}
940     ${Else}
941       !InsertMacro ClearSectionFlag ${SecConsole} ${SF_BOLD}
942     ${EndIf}
943    IntOp $R1 $NewComponents & ${ComponentBatConsole}
944     ${If} $R1 <> 0
945       !InsertMacro SetSectionFlag ${SecBatConsole} ${SF_BOLD}
946     ${Else}
947       !InsertMacro ClearSectionFlag ${SecBatConsole} ${SF_BOLD}
948     ${EndIf}
949     IntOp $R1 $NewComponents & ${ComponentPDFDocs}
950     ${If} $R1 <> 0
951       !InsertMacro SetSectionFlag ${SecDocPdf} ${SF_BOLD}
952     ${Else}
953       !InsertMacro ClearSectionFlag ${SecDocPdf} ${SF_BOLD}
954     ${EndIf}
955   ${EndIf}
956
957   GetDlgItem $R0 $HWNDPARENT 1
958
959   IntOp $R1 $NewComponents & ${ComponentsRequiringUserConfig}
960   ${If} $R1 = 0
961     SendMessage $R0 ${WM_SETTEXT} 0 "STR:Install"
962   ${Else}
963     SendMessage $R0 ${WM_SETTEXT} 0 "STR:&Next >"
964   ${EndIf}
965
966   Pop $R1
967   Pop $R0
968 FunctionEnd
969
970 !include "InstallType.nsh"
971 !include "ConfigPage1.nsh"
972 !include "ConfigPage2.nsh"
973 !include "DumpLog.nsh"