]> git.proxmox.com Git - mirror_smartmontools-debian.git/blob - os_win32/installer.nsi
19a0a1c6fa7b0de5b58d6317084d42e139e50908
[mirror_smartmontools-debian.git] / os_win32 / installer.nsi
1 ;
2 ; os_win32/installer.nsi - smartmontools install NSIS script
3 ;
4 ; Home page of code is: http://www.smartmontools.org
5 ;
6 ; Copyright (C) 2006-17 Christian Franke
7 ;
8 ; This program is free software; you can redistribute it and/or modify
9 ; it under the terms of the GNU General Public License as published by
10 ; the Free Software Foundation; either version 2, or (at your option)
11 ; any later version.
12 ;
13 ; You should have received a copy of the GNU General Public License
14 ; (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
15 ;
16 ; $Id: installer.nsi 4575 2017-10-29 16:06:18Z chrfranke $
17 ;
18
19
20 ;--------------------------------------------------------------------
21 ; Command line arguments:
22 ; makensis -DINPDIR=<input-dir> -DINPDIR64=<input-dir-64-bit> \
23 ; -DOUTFILE=<output-file> -DVERSTR=<version-string> installer.nsi
24
25 !ifndef INPDIR
26 !define INPDIR "."
27 !endif
28
29 !ifndef OUTFILE
30 !define OUTFILE "smartmontools.win32-setup.exe"
31 !endif
32
33 ;--------------------------------------------------------------------
34 ; General
35
36 Name "smartmontools"
37 OutFile "${OUTFILE}"
38
39 RequestExecutionLevel admin
40
41 SetCompressor /solid lzma
42
43 XPStyle on
44 InstallColors /windows
45
46 ; Set in .onInit
47 ;InstallDir "$PROGRAMFILES\smartmontools"
48 ;InstallDirRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation"
49
50 Var EDITOR
51
52 !ifdef INPDIR64
53 Var X64
54 Var INSTDIR32
55 Var INSTDIR64
56 !endif
57
58 LicenseData "${INPDIR}\doc\COPYING.txt"
59
60 !include "FileFunc.nsh"
61 !include "LogicLib.nsh"
62 !include "Sections.nsh"
63
64
65 ;--------------------------------------------------------------------
66 ; Pages
67
68 Page license
69 Page components
70 !ifdef INPDIR64
71 Page directory CheckX64
72 !else
73 Page directory
74 !endif
75 Page instfiles
76
77 UninstPage uninstConfirm
78 UninstPage instfiles
79
80 InstType "Full"
81 InstType "Extract files only"
82 InstType "Drive menu"
83 !ifdef INPDIR64
84 InstType "Full (x64)"
85 InstType "Extract files only (x64)"
86 InstType "Drive menu (x64)"
87 !endif
88
89
90 ;--------------------------------------------------------------------
91 ; Sections
92
93 !ifdef INPDIR64
94 Section "64-bit version" X64_SECTION
95 SectionIn 4 5 6
96 ; Handled in Function CheckX64
97 SectionEnd
98
99 !define FULL_TYPES "1 4"
100 !define EXTRACT_TYPES "2 5"
101 !define DRIVEMENU_TYPE "3 6"
102 !else
103 !define FULL_TYPES "1"
104 !define EXTRACT_TYPES "2"
105 !define DRIVEMENU_TYPE "3"
106 !endif
107
108 SectionGroup "!Program files"
109
110 !macro FileExe path option
111 !ifdef INPDIR64
112 ; Use dummy SetOutPath to control archive location of executables
113 ${If} $X64 != ""
114 Goto +2
115 SetOutPath "$INSTDIR\bin64"
116 File ${option} '${INPDIR64}\${path}'
117 ${Else}
118 Goto +2
119 SetOutPath "$INSTDIR\bin"
120 File ${option} '${INPDIR}\${path}'
121 ${EndIf}
122 !else
123 File ${option} '${INPDIR}\${path}'
124 !endif
125 !macroend
126
127 Section "smartctl" SMARTCTL_SECTION
128
129 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
130
131 SetOutPath "$INSTDIR\bin"
132 !insertmacro FileExe "bin\smartctl.exe" ""
133
134 SectionEnd
135
136 Section "smartd" SMARTD_SECTION
137
138 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
139
140 SetOutPath "$INSTDIR\bin"
141
142 ; Stop service ?
143 StrCpy $1 ""
144 ${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
145 ReadRegStr $0 HKLM "System\CurrentControlSet\Services\smartd" "ImagePath"
146 ${If} $0 != ""
147 ExecWait "net stop smartd" $1
148 ${EndIf}
149 ${EndIf}
150 !insertmacro FileExe "bin\smartd.exe" ""
151
152 IfFileExists "$INSTDIR\bin\smartd.conf" 0 +2
153 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Replace existing configuration file$\n$INSTDIR\bin\smartd.conf ?" /SD IDNO IDYES 0 IDNO +2
154 File "${INPDIR}\doc\smartd.conf"
155
156 File "${INPDIR}\bin\smartd_mailer.ps1"
157 File "${INPDIR}\bin\smartd_mailer.conf.sample.ps1"
158 File "${INPDIR}\bin\smartd_warning.cmd"
159 !insertmacro FileExe "bin\wtssendmsg.exe" ""
160
161 ; Restart service ?
162 ${If} $1 == "0"
163 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Restart smartd service ?" /SD IDNO IDYES 0 IDNO +2
164 ExecWait "net start smartd"
165 ${EndIf}
166
167 SectionEnd
168
169 Section "smartctl-nc (GSmartControl)" SMARTCTL_NC_SECTION
170
171 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
172
173 SetOutPath "$INSTDIR\bin"
174 !insertmacro FileExe "bin\smartctl-nc.exe" ""
175
176 SectionEnd
177
178 Section "drivedb.h (Drive Database)" DRIVEDB_SECTION
179
180 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
181
182 SetOutPath "$INSTDIR\bin"
183 File "${INPDIR}\bin\drivedb.h"
184 File "${INPDIR}\bin\update-smart-drivedb.exe"
185
186 SectionEnd
187
188 SectionGroupEnd
189
190 Section "!Documentation" DOC_SECTION
191
192 SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
193
194 SetOutPath "$INSTDIR\doc"
195 File "${INPDIR}\doc\AUTHORS.txt"
196 File "${INPDIR}\doc\ChangeLog.txt"
197 File "${INPDIR}\doc\ChangeLog-5.0-6.0.txt"
198 File "${INPDIR}\doc\COPYING.txt"
199 File "${INPDIR}\doc\INSTALL.txt"
200 File "${INPDIR}\doc\NEWS.txt"
201 File "${INPDIR}\doc\README.txt"
202 File "${INPDIR}\doc\TODO.txt"
203 !ifdef INPDIR64
204 ${If} $X64 != ""
205 File "${INPDIR64}\doc\checksums64.txt"
206 ${Else}
207 File "${INPDIR}\doc\checksums32.txt"
208 ${EndIf}
209 !else
210 File "${INPDIR}\doc\checksums??.txt"
211 !endif
212 File "${INPDIR}\doc\smartctl.8.html"
213 File "${INPDIR}\doc\smartctl.8.pdf"
214 Delete "$INSTDIR\doc\smartctl.8.txt" ; TODO: Remove after smartmontools 6.6
215 File "${INPDIR}\doc\smartd.8.html"
216 File "${INPDIR}\doc\smartd.8.pdf"
217 Delete "$INSTDIR\doc\smartd.8.txt" ; TODO: Remove after smartmontools 6.6
218 File "${INPDIR}\doc\smartd.conf"
219 File "${INPDIR}\doc\smartd.conf.5.html"
220 File "${INPDIR}\doc\smartd.conf.5.pdf"
221 Delete "$INSTDIR\doc\smartd.conf.5.txt" ; TODO: Remove after smartmontools 6.6
222
223 SectionEnd
224
225 Section "Uninstaller" UNINST_SECTION
226
227 SectionIn ${FULL_TYPES}
228 AddSize 40
229
230 CreateDirectory "$INSTDIR"
231
232 ; Keep old Install_Dir registry entry for GSmartControl
233 ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GSmartControl" "InstallLocation"
234 ReadRegStr $1 HKLM "Software\smartmontools" "Install_Dir"
235 ${If} "$0$1" != ""
236 WriteRegStr HKLM "Software\smartmontools" "Install_Dir" "$INSTDIR"
237 ${EndIf}
238
239 ; Write uninstall keys and program
240 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "DisplayName" "smartmontools"
241 !ifdef VERSTR
242 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "DisplayVersion" "${VERSTR}"
243 !endif
244 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation" "$INSTDIR"
245 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "UninstallString" '"$INSTDIR\uninst-smartmontools.exe"'
246 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "Publisher" "smartmontools.org"
247 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLInfoAbout" "https://www.smartmontools.org/"
248 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "HelpLink" "https://www.smartmontools.org/wiki/Help"
249 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLUpdateInfo" "https://builds.smartmontools.org/"
250 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoModify" 1
251 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoRepair" 1
252 WriteUninstaller "uninst-smartmontools.exe"
253
254 SectionEnd
255
256 Section "Start Menu Shortcuts" MENU_SECTION
257
258 SectionIn ${FULL_TYPES}
259
260 SetShellVarContext all
261
262 CreateDirectory "$SMPROGRAMS\smartmontools"
263
264 !macro CreateAdminShortCut link target args
265 CreateShortCut '${link}' '${target}' '${args}'
266 push '${link}'
267 Call ShellLinkSetRunAs
268 !macroend
269
270 ; runcmdu
271 ${If} ${FileExists} "$INSTDIR\bin\smartctl.exe"
272 ${OrIf} ${FileExists} "$INSTDIR\bin\smartd.exe"
273 SetOutPath "$INSTDIR\bin"
274 !insertmacro FileExe "bin\runcmdu.exe" ""
275 Delete "$INSTDIR\bin\runcmdu.exe.manifest" ; TODO: Remove after smartmontools 6.5
276 ${EndIf}
277
278 ; smartctl
279 ${If} ${FileExists} "$INSTDIR\bin\smartctl.exe"
280 SetOutPath "$INSTDIR\bin"
281 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl (Admin CMD).lnk" "$WINDIR\system32\cmd.exe" '/k PATH=$INSTDIR\bin;%PATH%&cd /d "$INSTDIR\bin"'
282 CreateDirectory "$SMPROGRAMS\smartmontools\smartctl Examples"
283 FileOpen $0 "$SMPROGRAMS\smartmontools\smartctl Examples\!Read this first!.txt" "w"
284 FileWrite $0 "All the example commands in this directory$\r$\napply to the first drive (sda).$\r$\n"
285 FileClose $0
286 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\All info (-x).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -x sda"
287 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Identify drive (-i).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -i sda"
288 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART attributes (-A -f brief).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -A -f brief sda"
289 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART capabilities (-c).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -c sda"
290 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART health status (-H).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -H sda"
291 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART error log (-l error).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l error sda"
292 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART selftest log (-l selftest).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l selftest sda"
293 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start long selftest (-t long).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t long sda"
294 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start offline test (-t offline).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t offline sda"
295 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start short selftest (-t short).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t short sda"
296 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Stop(Abort) selftest (-X).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -X sda"
297 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART off (-s off).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s off sda"
298 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART on (-s on).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s on sda"
299 ${EndIf}
300
301 ; smartd
302 ${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
303 SetOutPath "$INSTDIR\bin"
304 CreateDirectory "$SMPROGRAMS\smartmontools\smartd Examples"
305 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, smartd.log.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -l local0"
306 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, eventlog.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd"
307 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon stop.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd stop"
308 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Do all tests once (-q onecheck).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -q onecheck"
309 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Debug mode (-d).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -d"
310 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (edit).lnk" "$EDITOR" '"$INSTDIR\bin\smartd.conf"'
311 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (view).lnk" "$EDITOR" '"$INSTDIR\bin\smartd.conf"'
312 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.log (view).lnk" "$EDITOR" '"$INSTDIR\bin\smartd.log"'
313 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd_mailer.conf.sample.ps1 (view).lnk" "$EDITOR" '"$INSTDIR\bin\smartd_mailer.conf.sample.ps1"'
314 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd_mailer.conf.ps1 (create, edit).lnk" "$EDITOR" '"$INSTDIR\bin\smartd_mailer.conf.ps1"'
315
316 ; smartd service
317 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, eventlog, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install"
318 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 10min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0 -i 600"
319 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0"
320 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service remove.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd remove"
321 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service start.lnk" "$INSTDIR\bin\runcmdu.exe" "net start smartd"
322 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service stop.lnk" "$INSTDIR\bin\runcmdu.exe" "net stop smartd"
323 ${EndIf}
324
325 ; Documentation
326 ${If} ${FileExists} "$INSTDIR\doc\README.TXT"
327 SetOutPath "$INSTDIR\doc"
328 CreateDirectory "$SMPROGRAMS\smartmontools\Documentation"
329 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (html).lnk" "$INSTDIR\doc\smartctl.8.html"
330 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (html).lnk" "$INSTDIR\doc\smartd.8.html"
331 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (html).lnk" "$INSTDIR\doc\smartd.conf.5.html"
332 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (pdf).lnk" "$INSTDIR\doc\smartctl.8.pdf"
333 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (pdf).lnk" "$INSTDIR\doc\smartd.8.pdf"
334 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (pdf).lnk" "$INSTDIR\doc\smartd.conf.5.pdf"
335 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf sample.lnk" "$EDITOR" '"$INSTDIR\doc\smartd.conf"'
336 ${If} ${FileExists} "$INSTDIR\bin\drivedb.h"
337 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb.h (view).lnk" "$EDITOR" '"$INSTDIR\bin\drivedb.h"'
338 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb-add.h (create, edit).lnk" "$EDITOR" '"$INSTDIR\bin\drivedb-add.h"'
339 ${EndIf}
340 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\ChangeLog.lnk" "$INSTDIR\doc\ChangeLog.txt"
341 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\COPYING.lnk" "$INSTDIR\doc\COPYING.txt"
342 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\NEWS.lnk" "$INSTDIR\doc\NEWS.txt"
343 ${EndIf}
344
345 ; Homepage
346 CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Home Page.lnk" "https://www.smartmontools.org/"
347 CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Daily Builds.lnk" "https://builds.smartmontools.org/"
348
349 ; drivedb.h update
350 ${If} ${FileExists} "$INSTDIR\bin\update-smart-drivedb.exe"
351 SetOutPath "$INSTDIR\bin"
352 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\drivedb.h update.lnk" "$INSTDIR\bin\update-smart-drivedb.exe" ""
353 ${EndIf}
354
355 ; Uninstall
356 ${If} ${FileExists} "$INSTDIR\uninst-smartmontools.exe"
357 SetOutPath "$INSTDIR"
358 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Uninstall smartmontools.lnk" "$INSTDIR\uninst-smartmontools.exe" ""
359 ${EndIf}
360
361 SectionEnd
362
363 Section "Add install dir to PATH" PATH_SECTION
364
365 SectionIn ${FULL_TYPES}
366
367 Push "$INSTDIR\bin"
368 Call AddToPath
369
370 SectionEnd
371
372 SectionGroup "Add smartctl to drive menu"
373
374 !macro DriveMenuRemove
375 DetailPrint "Remove drive menu entries"
376 DeleteRegKey HKCR "Drive\shell\smartctl0"
377 DeleteRegKey HKCR "Drive\shell\smartctl1"
378 DeleteRegKey HKCR "Drive\shell\smartctl2"
379 DeleteRegKey HKCR "Drive\shell\smartctl3"
380 DeleteRegKey HKCR "Drive\shell\smartctl4"
381 DeleteRegKey HKCR "Drive\shell\smartctl5"
382 !macroend
383
384 Section "Remove existing entries first" DRIVE_REMOVE_SECTION
385 SectionIn ${DRIVEMENU_TYPE}
386 !insertmacro DriveMenuRemove
387 SectionEnd
388
389 !macro DriveSection id name args
390 Section 'smartctl ${args} ...' DRIVE_${id}_SECTION
391 SectionIn ${DRIVEMENU_TYPE}
392 Call CheckRunCmdA
393 DetailPrint 'Add drive menu entry "${name}": smartctl ${args} ...'
394 WriteRegStr HKCR "Drive\shell\smartctl${id}" "" "${name}"
395 WriteRegStr HKCR "Drive\shell\smartctl${id}\command" "" '"$INSTDIR\bin\runcmda.exe" "$INSTDIR\bin\smartctl.exe" ${args} %L'
396 SectionEnd
397 !macroend
398
399 !insertmacro DriveSection 0 "SMART all info" "-x"
400 !insertmacro DriveSection 1 "SMART status" "-Hc"
401 !insertmacro DriveSection 2 "SMART attributes" "-A -f brief"
402 !insertmacro DriveSection 3 "SMART short selftest" "-t short"
403 !insertmacro DriveSection 4 "SMART long selftest" "-t long"
404 !insertmacro DriveSection 5 "SMART continue selective selftest" '-t "selective,cont"'
405
406 SectionGroupEnd
407
408 ;--------------------------------------------------------------------
409
410 Section "Uninstall"
411
412 ; Stop & remove service
413 ${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
414 ReadRegStr $0 HKLM "System\CurrentControlSet\Services\smartd" "ImagePath"
415 ${If} $0 != ""
416 ExecWait "net stop smartd"
417 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Remove smartd service ?" /SD IDNO IDYES 0 IDNO +2
418 ExecWait "$INSTDIR\bin\smartd.exe remove"
419 ${EndIf}
420 ${EndIf}
421
422 ; Remove installer registry keys
423 DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools"
424 DeleteRegKey HKLM "Software\smartmontools"
425
426 ; Remove conf file ?
427 ${If} ${FileExists} "$INSTDIR\bin\smartd.conf"
428 ; Assume unchanged if timestamp is equal to sample file
429 GetFileTime "$INSTDIR\bin\smartd.conf" $0 $1
430 GetFileTime "$INSTDIR\doc\smartd.conf" $2 $3
431 StrCmp "$0:$1" "$2:$3" +2 0
432 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete configuration file$\n$INSTDIR\bin\smartd.conf ?" /SD IDNO IDYES 0 IDNO +2
433 Delete "$INSTDIR\bin\smartd.conf"
434 ${EndIf}
435
436 ; Remove log file ?
437 ${If} ${FileExists} "$INSTDIR\bin\smartd.log"
438 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete log file$\n$INSTDIR\bin\smartd.log ?" /SD IDNO IDYES 0 IDNO +2
439 Delete "$INSTDIR\bin\smartd.log"
440 ${EndIf}
441
442 ; Remove drivedb-add file ?
443 ${If} ${FileExists} "$INSTDIR\bin\drivedb-add.h"
444 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete local drive database file$\n$INSTDIR\bin\drivedb-add.h ?" /SD IDNO IDYES 0 IDNO +2
445 Delete "$INSTDIR\bin\drivedb-add.h"
446 ${EndIf}
447
448 ; Remove smartd_mailer.conf.ps1 file ?
449 ${If} ${FileExists} "$INSTDIR\bin\smartd_mailer.conf.ps1"
450 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete mailer configuration file$\n$INSTDIR\bin\smartd_mailer.conf.ps1 ?" /SD IDNO IDYES 0 IDNO +2
451 Delete "$INSTDIR\bin\smartd_mailer.conf.ps1"
452 ${EndIf}
453
454 ; Remove files
455 Delete "$INSTDIR\bin\smartctl.exe"
456 Delete "$INSTDIR\bin\smartctl-nc.exe"
457 Delete "$INSTDIR\bin\smartd.exe"
458 Delete "$INSTDIR\bin\smartd_mailer.ps1"
459 Delete "$INSTDIR\bin\smartd_mailer.conf.sample.ps1"
460 Delete "$INSTDIR\bin\smartd_warning.cmd" ; TODO: Check for modifications?
461 Delete "$INSTDIR\bin\drivedb.h"
462 Delete "$INSTDIR\bin\drivedb.h.error"
463 Delete "$INSTDIR\bin\drivedb.h.lastcheck"
464 Delete "$INSTDIR\bin\drivedb.h.old"
465 Delete "$INSTDIR\bin\update-smart-drivedb.exe"
466 Delete "$INSTDIR\bin\runcmda.exe"
467 Delete "$INSTDIR\bin\runcmda.exe.manifest" ; TODO: Remove after smartmontools 6.5
468 Delete "$INSTDIR\bin\runcmdu.exe"
469 Delete "$INSTDIR\bin\runcmdu.exe.manifest" ; TODO: Remove after smartmontools 6.5
470 Delete "$INSTDIR\bin\wtssendmsg.exe"
471 Delete "$INSTDIR\doc\AUTHORS.txt"
472 Delete "$INSTDIR\doc\ChangeLog.txt"
473 Delete "$INSTDIR\doc\ChangeLog-5.0-6.0.txt"
474 Delete "$INSTDIR\doc\COPYING.txt"
475 Delete "$INSTDIR\doc\INSTALL.txt"
476 Delete "$INSTDIR\doc\NEWS.txt"
477 Delete "$INSTDIR\doc\README.txt"
478 Delete "$INSTDIR\doc\TODO.txt"
479 Delete "$INSTDIR\doc\checksums*.txt"
480 Delete "$INSTDIR\doc\smartctl.8.html"
481 Delete "$INSTDIR\doc\smartctl.8.pdf"
482 Delete "$INSTDIR\doc\smartctl.8.txt" ; TODO: Remove after smartmontools 6.6
483 Delete "$INSTDIR\doc\smartd.8.html"
484 Delete "$INSTDIR\doc\smartd.8.pdf"
485 Delete "$INSTDIR\doc\smartd.8.txt" ; TODO: Remove after smartmontools 6.6
486 Delete "$INSTDIR\doc\smartd.conf"
487 Delete "$INSTDIR\doc\smartd.conf.5.html"
488 Delete "$INSTDIR\doc\smartd.conf.5.pdf"
489 Delete "$INSTDIR\doc\smartd.conf.5.txt" ; TODO: Remove after smartmontools 6.6
490 Delete "$INSTDIR\uninst-smartmontools.exe"
491
492 ; Remove shortcuts
493 SetShellVarContext all
494 Delete "$SMPROGRAMS\smartmontools\*.*"
495 Delete "$SMPROGRAMS\smartmontools\Documentation\*.*"
496 Delete "$SMPROGRAMS\smartmontools\smartctl Examples\*.*"
497 Delete "$SMPROGRAMS\smartmontools\smartd Examples\*.*"
498
499 ; Remove folders
500 RMDir "$SMPROGRAMS\smartmontools\Documentation"
501 RMDir "$SMPROGRAMS\smartmontools\smartctl Examples"
502 RMDir "$SMPROGRAMS\smartmontools\smartd Examples"
503 RMDir "$SMPROGRAMS\smartmontools"
504 RMDir "$INSTDIR\bin"
505 RMDir "$INSTDIR\doc"
506 RMDir "$INSTDIR"
507
508 ; Remove install dir from PATH
509 Push "$INSTDIR\bin"
510 Call un.RemoveFromPath
511
512 ; Remove drive menu registry entries
513 !insertmacro DriveMenuRemove
514
515 ; Check for still existing entries
516 ${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
517 MessageBox MB_OK|MB_ICONEXCLAMATION "$INSTDIR\bin\smartd.exe could not be removed.$\nsmartd is possibly still running." /SD IDOK
518 ${ElseIf} ${FileExists} "$INSTDIR"
519 MessageBox MB_OK "Note: $INSTDIR could not be removed." /SD IDOK
520 ${EndIf}
521
522 ${If} ${FileExists} "$SMPROGRAMS\smartmontools"
523 MessageBox MB_OK "Note: $SMPROGRAMS\smartmontools could not be removed." /SD IDOK
524 ${EndIf}
525
526 SectionEnd
527
528 ;--------------------------------------------------------------------
529 ; Functions
530
531 !macro AdjustSectionSize section
532 SectionGetSize ${section} $0
533 IntOp $0 $0 / 2
534 SectionSetSize ${section} $0
535 !macroend
536
537 Function .onInit
538
539 ; Set default install directories
540 ${If} $INSTDIR == "" ; /D=PATH option not specified ?
541 ReadRegStr $INSTDIR HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation"
542 ${If} $INSTDIR == "" ; Not already installed ?
543 ReadRegStr $INSTDIR HKLM "Software\smartmontools" "Install_Dir"
544 ${If} $INSTDIR == "" ; Not already installed (smartmontools < r3911/6.3) ?
545 StrCpy $INSTDIR "$PROGRAMFILES\smartmontools"
546 !ifdef INPDIR64
547 StrCpy $INSTDIR32 $INSTDIR
548 StrCpy $INSTDIR64 "$PROGRAMFILES64\smartmontools"
549 !endif
550 ${EndIf}
551 ${EndIf}
552 ${EndIf}
553
554 !ifdef INPDIR64
555 ; Check for 64-bit unless already installed in 32-bit location
556 ${If} $INSTDIR64 != ""
557 ${OrIf} $INSTDIR != "$PROGRAMFILES\smartmontools"
558 ; $1 = IsWow64Process(GetCurrentProcess(), ($0=FALSE, &$0))
559 System::Call "kernel32::GetCurrentProcess() i.s"
560 System::Call "kernel32::IsWow64Process(i s, *i 0 r0) i.r1"
561 ${If} "$0 $1" == "1 1" ; 64-bit Windows ?
562 !insertmacro SelectSection ${X64_SECTION}
563 ${EndIf}
564 ${EndIf}
565
566 ; Sizes of binary sections include 32-bit and 64-bit executables
567 !insertmacro AdjustSectionSize ${SMARTCTL_SECTION}
568 !insertmacro AdjustSectionSize ${SMARTD_SECTION}
569 !insertmacro AdjustSectionSize ${SMARTCTL_NC_SECTION}
570 !endif
571
572 ; Use Notepad++ if installed
573 StrCpy $EDITOR "$PROGRAMFILES\Notepad++\notepad++.exe"
574 ${IfNot} ${FileExists} "$EDITOR"
575 StrCpy $EDITOR "notepad.exe"
576 ${EndIf}
577
578 Call ParseCmdLine
579
580 !ifdef INPDIR64
581 Call CheckX64
582 !endif
583 FunctionEnd
584
585 ; Check x64 section and update INSTDIR accordingly
586
587 !ifdef INPDIR64
588 Function CheckX64
589 ${IfNot} ${SectionIsSelected} ${X64_SECTION}
590 StrCpy $X64 ""
591 ${If} $INSTDIR32 != ""
592 ${AndIf} $INSTDIR == $INSTDIR64
593 StrCpy $INSTDIR $INSTDIR32
594 ${EndIf}
595 ${Else}
596 StrCpy $X64 "t"
597 ${If} $INSTDIR64 != ""
598 ${AndIf} $INSTDIR == $INSTDIR32
599 StrCpy $INSTDIR $INSTDIR64
600 ${EndIf}
601 ${EndIf}
602 FunctionEnd
603 !endif
604
605 ; Command line parsing
606
607 !macro GetCmdLineOption var name
608 Push ",$opts,"
609 Push ",${name},"
610 Call StrStr
611 Pop ${var}
612 ${If} ${var} != ""
613 StrCpy $nomatch ""
614 ${EndIf}
615 !macroend
616
617 !macro CheckCmdLineOption name section
618 StrCpy $allopts "$allopts,${name}"
619 !insertmacro GetCmdLineOption $0 ${name}
620 ${If} $0 == ""
621 !insertmacro UnselectSection ${section}
622 ${Else}
623 !insertmacro SelectSection ${section}
624 ${EndIf}
625 !macroend
626
627 Function ParseCmdLine
628 ; get /SO option
629 Var /global opts
630 ${GetParameters} $R0
631 ${GetOptions} $R0 "/SO" $opts
632 ${If} ${Errors}
633 Return
634 ${EndIf}
635 Var /global allopts
636 Var /global nomatch
637 StrCpy $nomatch "t"
638 !ifdef INPDIR64
639 ; Change previous 64-bit setting
640 StrCpy $allopts ",x32|x64"
641 !insertmacro GetCmdLineOption $0 "x32"
642 ${If} $0 != ""
643 !insertmacro UnselectSection ${X64_SECTION}
644 ${EndIf}
645 !insertmacro GetCmdLineOption $0 "x64"
646 ${If} $0 != ""
647 !insertmacro SelectSection ${X64_SECTION}
648 ${EndIf}
649 ; Leave other sections unchanged if only "x32" or "x64" is specified
650 ${If} $opts == "x32"
651 ${OrIf} $opts == "x64"
652 Return
653 ${EndIf}
654 !endif
655 ; Turn sections on or off
656 !insertmacro CheckCmdLineOption "smartctl" ${SMARTCTL_SECTION}
657 !insertmacro CheckCmdLineOption "smartd" ${SMARTD_SECTION}
658 !insertmacro CheckCmdLineOption "smartctlnc" ${SMARTCTL_NC_SECTION}
659 !insertmacro CheckCmdLineOption "drivedb" ${DRIVEDB_SECTION}
660 !insertmacro CheckCmdLineOption "doc" ${DOC_SECTION}
661 !insertmacro CheckCmdLineOption "uninst" ${UNINST_SECTION}
662 !insertmacro CheckCmdLineOption "menu" ${MENU_SECTION}
663 !insertmacro CheckCmdLineOption "path" ${PATH_SECTION}
664 !insertmacro CheckCmdLineOption "driveremove" ${DRIVE_REMOVE_SECTION}
665 !insertmacro CheckCmdLineOption "drive0" ${DRIVE_0_SECTION}
666 !insertmacro CheckCmdLineOption "drive1" ${DRIVE_1_SECTION}
667 !insertmacro CheckCmdLineOption "drive2" ${DRIVE_2_SECTION}
668 !insertmacro CheckCmdLineOption "drive3" ${DRIVE_3_SECTION}
669 !insertmacro CheckCmdLineOption "drive4" ${DRIVE_4_SECTION}
670 !insertmacro CheckCmdLineOption "drive5" ${DRIVE_5_SECTION}
671 ${If} $opts != "-"
672 ${If} $nomatch != ""
673 StrCpy $0 "$allopts,-" "" 1
674 MessageBox MB_OK "Usage: smartmontools-VERSION.win32-setup [/S] [/SO component,...] [/D=INSTDIR]$\n$\ncomponents:$\n $0"
675 Abort
676 ${EndIf}
677 ${EndIf}
678 FunctionEnd
679
680 ; Install runcmda.exe only once
681
682 Function CheckRunCmdA
683 Var /global runcmda
684 ${If} $runcmda == ""
685 StrCpy $runcmda "t"
686 SetOutPath "$INSTDIR\bin"
687 !insertmacro FileExe "bin\runcmda.exe" ""
688 Delete "$INSTDIR\bin\runcmda.exe.manifest" ; TODO: Remove after smartmontools 6.5
689 ${EndIf}
690 FunctionEnd
691
692
693 ;--------------------------------------------------------------------
694 ; Path functions
695 ;
696 ; Based on example from:
697 ; http://nsis.sourceforge.net/Path_Manipulation
698 ;
699
700
701 !include "WinMessages.nsh"
702
703 ; Registry Entry for environment (NT4,2000,XP)
704 ; All users:
705 ;!define Environ 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
706 ; Current user only:
707 !define Environ 'HKCU "Environment"'
708
709
710 ; AddToPath - Appends dir to PATH
711 ; (does not work on Win9x/ME)
712 ;
713 ; Usage:
714 ; Push "dir"
715 ; Call AddToPath
716
717 Function AddToPath
718 Exch $0
719 Push $1
720 Push $2
721 Push $3
722 Push $4
723
724 ; NSIS ReadRegStr returns empty string on string overflow
725 ; Native calls are used here to check actual length of PATH
726
727 ; $4 = RegOpenKey(HKEY_CURRENT_USER, "Environment", &$3)
728 System::Call "advapi32::RegOpenKey(i 0x80000001, t'Environment', *i.r3) i.r4"
729 IntCmp $4 0 0 done done
730 ; $4 = RegQueryValueEx($3, "PATH", (DWORD*)0, (DWORD*)0, &$1, ($2=NSIS_MAX_STRLEN, &$2))
731 ; RegCloseKey($3)
732 System::Call "advapi32::RegQueryValueEx(i $3, t'PATH', i 0, i 0, t.r1, *i ${NSIS_MAX_STRLEN} r2) i.r4"
733 System::Call "advapi32::RegCloseKey(i $3)"
734
735 ${If} $4 = 234 ; ERROR_MORE_DATA
736 DetailPrint "AddToPath: original length $2 > ${NSIS_MAX_STRLEN}"
737 MessageBox MB_OK "PATH not updated, original length $2 > ${NSIS_MAX_STRLEN}" /SD IDOK
738 Goto done
739 ${EndIf}
740
741 ${If} $4 <> 0 ; NO_ERROR
742 ${If} $4 <> 2 ; ERROR_FILE_NOT_FOUND
743 DetailPrint "AddToPath: unexpected error code $4"
744 Goto done
745 ${EndIf}
746 StrCpy $1 ""
747 ${EndIf}
748
749 ; Check if already in PATH
750 Push "$1;"
751 Push "$0;"
752 Call StrStr
753 Pop $2
754 StrCmp $2 "" 0 done
755 Push "$1;"
756 Push "$0\;"
757 Call StrStr
758 Pop $2
759 StrCmp $2 "" 0 done
760
761 ; Prevent NSIS string overflow
762 StrLen $2 $0
763 StrLen $3 $1
764 IntOp $2 $2 + $3
765 IntOp $2 $2 + 2 ; $2 = strlen(dir) + strlen(PATH) + sizeof(";")
766 ${If} $2 > ${NSIS_MAX_STRLEN}
767 DetailPrint "AddToPath: new length $2 > ${NSIS_MAX_STRLEN}"
768 MessageBox MB_OK "PATH not updated, new length $2 > ${NSIS_MAX_STRLEN}." /SD IDOK
769 Goto done
770 ${EndIf}
771
772 ; Append dir to PATH
773 DetailPrint "Add to PATH: $0"
774 StrCpy $2 $1 1 -1
775 ${If} $2 == ";"
776 StrCpy $1 $1 -1 ; remove trailing ';'
777 ${EndIf}
778 ${If} $1 != "" ; no leading ';'
779 StrCpy $0 "$1;$0"
780 ${EndIf}
781 WriteRegExpandStr ${Environ} "PATH" $0
782 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
783
784 done:
785 Pop $4
786 Pop $3
787 Pop $2
788 Pop $1
789 Pop $0
790 FunctionEnd
791
792
793 ; RemoveFromPath - Removes dir from PATH
794 ;
795 ; Usage:
796 ; Push "dir"
797 ; Call RemoveFromPath
798
799 Function un.RemoveFromPath
800 Exch $0
801 Push $1
802 Push $2
803 Push $3
804 Push $4
805 Push $5
806 Push $6
807
808 ReadRegStr $1 ${Environ} "PATH"
809 StrCpy $5 $1 1 -1
810 ${If} $5 != ";"
811 StrCpy $1 "$1;" ; ensure trailing ';'
812 ${EndIf}
813 Push $1
814 Push "$0;"
815 Call un.StrStr
816 Pop $2 ; pos of our dir
817 StrCmp $2 "" done
818
819 DetailPrint "Remove from PATH: $0"
820 StrLen $3 "$0;"
821 StrLen $4 $2
822 StrCpy $5 $1 -$4 ; $5 is now the part before the path to remove
823 StrCpy $6 $2 "" $3 ; $6 is now the part after the path to remove
824 StrCpy $3 "$5$6"
825 StrCpy $5 $3 1 -1
826 ${If} $5 == ";"
827 StrCpy $3 $3 -1 ; remove trailing ';'
828 ${EndIf}
829 WriteRegExpandStr ${Environ} "PATH" $3
830 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
831
832 done:
833 Pop $6
834 Pop $5
835 Pop $4
836 Pop $3
837 Pop $2
838 Pop $1
839 Pop $0
840 FunctionEnd
841
842
843 ; StrStr - find substring in a string
844 ;
845 ; Usage:
846 ; Push "this is some string"
847 ; Push "some"
848 ; Call StrStr
849 ; Pop $0 ; "some string"
850
851 !macro StrStr un
852 Function ${un}StrStr
853 Exch $R1 ; $R1=substring, stack=[old$R1,string,...]
854 Exch ; stack=[string,old$R1,...]
855 Exch $R2 ; $R2=string, stack=[old$R2,old$R1,...]
856 Push $R3
857 Push $R4
858 Push $R5
859 StrLen $R3 $R1
860 StrCpy $R4 0
861 ; $R1=substring, $R2=string, $R3=strlen(substring)
862 ; $R4=count, $R5=tmp
863 ${Do}
864 StrCpy $R5 $R2 $R3 $R4
865 ${IfThen} $R5 == $R1 ${|} ${ExitDo} ${|}
866 ${IfThen} $R5 == "" ${|} ${ExitDo} ${|}
867 IntOp $R4 $R4 + 1
868 ${Loop}
869 StrCpy $R1 $R2 "" $R4
870 Pop $R5
871 Pop $R4
872 Pop $R3
873 Pop $R2
874 Exch $R1 ; $R1=old$R1, stack=[result,...]
875 FunctionEnd
876 !macroend
877 !insertmacro StrStr ""
878 !insertmacro StrStr "un."
879
880
881 ;--------------------------------------------------------------------
882 ; Set Run As Administrator flag in shortcut
883 ;
884 ; Slightly modified version from:
885 ; http://nsis.sourceforge.net/IShellLink_Set_RunAs_flag
886 ;
887
888 !define IPersistFile {0000010b-0000-0000-c000-000000000046}
889 !define CLSID_ShellLink {00021401-0000-0000-C000-000000000046}
890 !define IID_IShellLinkA {000214EE-0000-0000-C000-000000000046}
891 !define IID_IShellLinkW {000214F9-0000-0000-C000-000000000046}
892 !define IShellLinkDataList {45e2b4ae-b1c3-11d0-b92f-00a0c90312e1}
893 !ifdef NSIS_UNICODE
894 !define IID_IShellLink ${IID_IShellLinkW}
895 !else
896 !define IID_IShellLink ${IID_IShellLinkA}
897 !endif
898
899 Function ShellLinkSetRunAs
900 ; Set archive location of $PLUGINSDIR
901 Goto +2
902 SetOutPath "$INSTDIR"
903
904 System::Store S ; push $0-$9, $R0-$R9
905 pop $9
906 ; $0 = CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER, IID_IShellLink, &$1)
907 System::Call "ole32::CoCreateInstance(g'${CLSID_ShellLink}',i0,i1,g'${IID_IShellLink}',*i.r1)i.r0"
908 ${If} $0 = 0
909 System::Call "$1->0(g'${IPersistFile}',*i.r2)i.r0" ; $0 = $1->QueryInterface(IPersistFile, &$2)
910 ${If} $0 = 0
911 System::Call "$2->5(w '$9',i 0)i.r0" ; $0 = $2->Load($9, STGM_READ)
912 ${If} $0 = 0
913 System::Call "$1->0(g'${IShellLinkDataList}',*i.r3)i.r0" ; $0 = $1->QueryInterface(IShellLinkDataList, &$3)
914 ${If} $0 = 0
915 System::Call "$3->6(*i.r4)i.r0"; $0 = $3->GetFlags(&$4)
916 ${If} $0 = 0
917 System::Call "$3->7(i $4|0x2000)i.r0" ; $0 = $3->SetFlags($4|SLDF_RUNAS_USER)
918 ${If} $0 = 0
919 System::Call "$2->6(w '$9',i1)i.r0" ; $2->Save($9, TRUE)
920 ${EndIf}
921 ${EndIf}
922 System::Call "$3->2()" ; $3->Release()
923 ${EndIf}
924 System::Call "$2->2()" ; $2->Release()
925 ${EndIf}
926 ${EndIf}
927 System::Call "$1->2()" ; $1->Release()
928 ${EndIf}
929 ${If} $0 <> 0
930 DetailPrint "Set RunAsAdmin: $9 failed ($0)"
931 ${Else}
932 DetailPrint "Set RunAsAdmin: $9"
933 ${EndIf}
934 System::Store L ; pop $R9-$R0, $9-$0
935 FunctionEnd