]> git.proxmox.com Git - mirror_smartmontools-debian.git/blob - os_win32/installer.nsi
Imported Upstream version 5.42+svn3539
[mirror_smartmontools-debian.git] / os_win32 / installer.nsi
1 ;
2 ; smartmontools install NSIS script
3 ;
4 ; Home page of code is: http://smartmontools.sourceforge.net
5 ;
6 ; Copyright (C) 2006-11 Christian Franke <smartmontools-support@lists.sourceforge.net>
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 3457 2011-10-20 16:36:47Z chrfranke $
17 ;
18
19
20 ;--------------------------------------------------------------------
21 ; Command line arguments:
22 ; makensis -DINPDIR=<input-dir> -DOUTFILE=<output-file> -DVERSTR=<version-string> installer.nsi
23
24 !ifndef INPDIR
25 !define INPDIR "."
26 !endif
27
28 !ifndef OUTFILE
29 !define OUTFILE "smartmontools.win32-setup.exe"
30 !endif
31
32 ;--------------------------------------------------------------------
33 ; General
34
35 Name "smartmontools"
36 OutFile "${OUTFILE}"
37
38 SetCompressor /solid lzma
39
40 XPStyle on
41 InstallColors /windows
42
43 InstallDir "$PROGRAMFILES\smartmontools"
44 InstallDirRegKey HKLM "Software\smartmontools" "Install_Dir"
45
46 Var EDITOR
47 Var UBCDDIR
48
49 LicenseData "${INPDIR}\doc\COPYING.txt"
50
51 !include "FileFunc.nsh"
52 !include "Sections.nsh"
53
54 !insertmacro GetParameters
55 !insertmacro GetOptions
56
57 RequestExecutionLevel admin
58
59 ;--------------------------------------------------------------------
60 ; Pages
61
62 Page license
63 Page components
64 Page directory SkipProgPath "" ""
65 PageEx directory
66 PageCallbacks SkipUBCDPath "" ""
67 DirText "Setup will install the UBCD4Win plugin in the following folder."
68 DirVar $UBCDDIR
69 PageExEnd
70 Page instfiles
71
72 UninstPage uninstConfirm
73 UninstPage instfiles
74
75 InstType "Full"
76 InstType "Extract files only"
77 InstType "Drive menu"
78 InstType "UBCD4Win plugin"
79
80
81 ;--------------------------------------------------------------------
82 ; Sections
83
84 SectionGroup "!Program files"
85
86 Section "smartctl" SMARTCTL_SECTION
87
88 SectionIn 1 2
89
90 SetOutPath "$INSTDIR\bin"
91 File "${INPDIR}\bin\smartctl.exe"
92
93 SectionEnd
94
95 Section "smartd" SMARTD_SECTION
96
97 SectionIn 1 2
98
99 SetOutPath "$INSTDIR\bin"
100
101 ; Stop service ?
102 StrCpy $1 ""
103 IfFileExists "$INSTDIR\bin\smartd.exe" 0 nosrv
104 ReadRegStr $0 HKLM "System\CurrentControlSet\Services\smartd" "ImagePath"
105 StrCmp $0 "" nosrv
106 ExecWait "net stop smartd" $1
107 nosrv:
108 File "${INPDIR}\bin\smartd.exe"
109
110 IfFileExists "$INSTDIR\bin\smartd.conf" 0 +2
111 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Replace existing configuration file$\n$INSTDIR\bin\smartd.conf ?" IDYES 0 IDNO +2
112 File "${INPDIR}\doc\smartd.conf"
113
114 IfFileExists "$WINDIR\system32\cmd.exe" 0 +2
115 File /nonfatal "${INPDIR}\bin\syslogevt.exe"
116
117 ; Restart service ?
118 StrCmp $1 "0" 0 +3
119 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Restart smartd service ?" IDYES 0 IDNO +2
120 ExecWait "net start smartd"
121
122 SectionEnd
123
124 Section "smartctl-nc (GSmartControl)" SMARTCTL_NC_SECTION
125
126 SectionIn 1 2
127
128 SetOutPath "$INSTDIR\bin"
129 File "${INPDIR}\bin\smartctl-nc.exe"
130
131 SectionEnd
132
133 Section "drivedb.h (Drive Database)" DRIVEDB_SECTION
134
135 SectionIn 1 2
136
137 SetOutPath "$INSTDIR\bin"
138 File "${INPDIR}\bin\drivedb.h"
139 File "${INPDIR}\bin\update-smart-drivedb.exe"
140
141 SectionEnd
142
143 SectionGroupEnd
144
145 Section "!Documentation" DOC_SECTION
146
147 SectionIn 1 2
148
149 SetOutPath "$INSTDIR\doc"
150 File "${INPDIR}\doc\AUTHORS.txt"
151 File "${INPDIR}\doc\CHANGELOG.txt"
152 File "${INPDIR}\doc\COPYING.txt"
153 File "${INPDIR}\doc\INSTALL.txt"
154 File "${INPDIR}\doc\NEWS.txt"
155 File "${INPDIR}\doc\README.txt"
156 File "${INPDIR}\doc\TODO.txt"
157 File "${INPDIR}\doc\WARNINGS.txt"
158 File "${INPDIR}\doc\checksums.txt"
159 File "${INPDIR}\doc\smartctl.8.html"
160 File "${INPDIR}\doc\smartctl.8.txt"
161 File "${INPDIR}\doc\smartd.8.html"
162 File "${INPDIR}\doc\smartd.8.txt"
163 File "${INPDIR}\doc\smartd.conf"
164 File "${INPDIR}\doc\smartd.conf.5.html"
165 File "${INPDIR}\doc\smartd.conf.5.txt"
166
167 SectionEnd
168
169 Section "Uninstaller" UNINST_SECTION
170
171 SectionIn 1
172 AddSize 35
173
174 CreateDirectory "$INSTDIR"
175
176 ; Save installation location
177 WriteRegStr HKLM "Software\smartmontools" "Install_Dir" "$INSTDIR"
178
179 ; Write uninstall keys and program
180 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "DisplayName" "smartmontools"
181 !ifdef VERSTR
182 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "DisplayVersion" "${VERSTR}"
183 !endif
184 ;WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "Publisher" "smartmontools"
185 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "UninstallString" '"$INSTDIR\uninst-smartmontools.exe"'
186 ;WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLInfoAbout" "http://smartmontools.sourceforge.net/"
187 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "HelpLink" "http://smartmontools.sourceforge.net/"
188 ;WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLUpdateInfo" "http://sourceforge.net/project/showfiles.php?group_id=64297"
189 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLUpdateInfo" "http://smartmontools-win32.dyndns.org/"
190 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoModify" 1
191 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoRepair" 1
192 WriteUninstaller "uninst-smartmontools.exe"
193
194 SectionEnd
195
196 Section "Start Menu Shortcuts" MENU_SECTION
197
198 SectionIn 1
199
200 SetShellVarContext all
201
202 CreateDirectory "$SMPROGRAMS\smartmontools"
203
204 !macro CreateAdminShortCut link target args
205 CreateShortCut '${link}' '${target}' '${args}'
206 push '${link}'
207 Call ShellLinkSetRunAs
208 !macroend
209
210 ; runcmdu
211 IfFileExists "$INSTDIR\bin\smartctl.exe" 0 +2
212 IfFileExists "$INSTDIR\bin\smartd.exe" 0 +4
213 SetOutPath "$INSTDIR\bin"
214 File "${INPDIR}\bin\runcmdu.exe"
215 File "${INPDIR}\bin\runcmdu.exe.manifest"
216
217 ; smartctl
218 IfFileExists "$INSTDIR\bin\smartctl.exe" 0 noctl
219 SetOutPath "$INSTDIR\bin"
220 IfFileExists "$WINDIR\system32\cmd.exe" 0 nocmd
221 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl (Admin CMD).lnk" "$WINDIR\system32\cmd.exe" '/k PATH=$INSTDIR\bin;%PATH%&cd /d "$INSTDIR\bin"'
222 nocmd:
223 CreateDirectory "$SMPROGRAMS\smartmontools\smartctl Examples"
224 FileOpen $0 "$SMPROGRAMS\smartmontools\smartctl Examples\!Read this first!.txt" "w"
225 FileWrite $0 "All the example commands in this directory$\r$\napply to the first drive (sda).$\r$\n"
226 FileClose $0
227 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\All info (-a).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -a sda"
228 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Identify drive (-i).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -i sda"
229 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART attributes (-A).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -A sda"
230 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART capabilities (-c).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -c sda"
231 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART health status (-H).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -H sda"
232 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART error log (-l error).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l error sda"
233 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART selftest log (-l selftest).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l selftest sda"
234 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start long selftest (-t long).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t long sda"
235 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start offline test (-t offline).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t offline sda"
236 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start short selftest (-t short).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t short sda"
237 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Stop(Abort) selftest (-X).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -X sda"
238 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART off (-s off).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s off sda"
239 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART on (-s on).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s on sda"
240 noctl:
241
242 ; smartd
243 IfFileExists "$INSTDIR\bin\smartd.exe" 0 nod
244 SetOutPath "$INSTDIR\bin"
245 CreateDirectory "$SMPROGRAMS\smartmontools\smartd Examples"
246 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, smartd.log.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -l local0"
247 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, eventlog.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd"
248 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon stop.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd stop"
249 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Do all tests once (-q onecheck).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -q onecheck"
250 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Debug mode (-d).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -d"
251 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (edit).lnk" "$EDITOR" "$INSTDIR\bin\smartd.conf"
252 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (view).lnk" "$EDITOR" "$INSTDIR\bin\smartd.conf"
253 CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.log (view).lnk" "$EDITOR" "$INSTDIR\bin\smartd.log"
254
255 ; smartd service (not on 9x/ME)
256 IfFileExists "$WINDIR\system32\cmd.exe" 0 nosvc
257 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, eventlog, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install"
258 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 10min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0 -i 600"
259 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0"
260 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service remove.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd remove"
261 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service start.lnk" "$INSTDIR\bin\runcmdu.exe" "net start smartd"
262 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service stop.lnk" "$INSTDIR\bin\runcmdu.exe" "net stop smartd"
263 nosvc:
264 nod:
265
266 ; Documentation
267 IfFileExists "$INSTDIR\doc\README.TXT" 0 nodoc
268 SetOutPath "$INSTDIR\doc"
269 CreateDirectory "$SMPROGRAMS\smartmontools\Documentation"
270 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (html).lnk" "$INSTDIR\doc\smartctl.8.html"
271 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (html).lnk" "$INSTDIR\doc\smartd.8.html"
272 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (html).lnk" "$INSTDIR\doc\smartd.conf.5.html"
273 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (txt).lnk" "$INSTDIR\doc\smartctl.8.txt"
274 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (txt).lnk" "$INSTDIR\doc\smartd.8.txt"
275 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (txt).lnk" "$INSTDIR\doc\smartd.conf.5.txt"
276 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf sample.lnk" "$EDITOR" "$INSTDIR\doc\smartd.conf"
277 IfFileExists "$INSTDIR\bin\drivedb.h" 0 nodb
278 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb.h (view).lnk" "$EDITOR" "$INSTDIR\bin\drivedb.h"
279 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb-add.h (create, edit).lnk" "$EDITOR" "$INSTDIR\bin\drivedb-add.h"
280 nodb:
281 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\AUTHORS.lnk" "$INSTDIR\doc\AUTHORS.txt"
282 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\CHANGELOG.lnk" "$INSTDIR\doc\CHANGELOG.txt"
283 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\COPYING.lnk" "$INSTDIR\doc\COPYING.txt"
284 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\INSTALL.lnk" "$INSTDIR\doc\INSTALL.txt"
285 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\NEWS.lnk" "$INSTDIR\doc\NEWS.txt"
286 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\README.lnk" "$INSTDIR\doc\README.txt"
287 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\TODO.lnk" "$INSTDIR\doc\TODO.txt"
288 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\WARNINGS.lnk" "$INSTDIR\doc\WARNINGS.txt"
289 CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\Windows version download page.lnk" "http://smartmontools-win32.dyndns.org/smartmontools/"
290 nodoc:
291
292 ; Homepage
293 CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Home Page.lnk" "http://smartmontools.sourceforge.net/"
294
295 ; drivedb.h update
296 IfFileExists "$INSTDIR\bin\update-smart-drivedb.exe" 0 noupdb
297 SetOutPath "$INSTDIR\bin"
298 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\drivedb.h update.lnk" "$INSTDIR\bin\update-smart-drivedb.exe" ""
299 noupdb:
300
301 ; Uninstall
302 IfFileExists "$INSTDIR\uninst-smartmontools.exe" 0 noinst
303 SetOutPath "$INSTDIR"
304 !insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Uninstall smartmontools.lnk" "$INSTDIR\uninst-smartmontools.exe" ""
305 noinst:
306
307 SectionEnd
308
309 Section "Add install dir to PATH" PATH_SECTION
310
311 SectionIn 1
312
313 IfFileExists "$WINDIR\system32\cmd.exe" 0 +3
314 Push "$INSTDIR\bin"
315 Call AddToPath
316
317 SectionEnd
318
319 SectionGroup "Add smartctl to drive menu"
320
321 !macro DriveMenuRemove
322 DetailPrint "Remove drive menu entries"
323 DeleteRegKey HKCR "Drive\shell\smartctl0"
324 DeleteRegKey HKCR "Drive\shell\smartctl1"
325 DeleteRegKey HKCR "Drive\shell\smartctl2"
326 DeleteRegKey HKCR "Drive\shell\smartctl3"
327 DeleteRegKey HKCR "Drive\shell\smartctl4"
328 DeleteRegKey HKCR "Drive\shell\smartctl5"
329 !macroend
330
331 Section "Remove existing entries first" DRIVE_REMOVE_SECTION
332 SectionIn 3
333 !insertmacro DriveMenuRemove
334 SectionEnd
335
336 !macro DriveSection id name args
337 Section 'smartctl ${args} ...' DRIVE_${id}_SECTION
338 SectionIn 3
339 Call CheckRunCmdA
340 DetailPrint 'Add drive menu entry "${name}": smartctl ${args} ...'
341 WriteRegStr HKCR "Drive\shell\smartctl${id}" "" "${name}"
342 WriteRegStr HKCR "Drive\shell\smartctl${id}\command" "" '"$INSTDIR\bin\runcmda.exe" "$INSTDIR\bin\smartctl.exe" ${args} %L'
343 SectionEnd
344 !macroend
345
346 !insertmacro DriveSection 0 "SMART all info" "-a"
347 !insertmacro DriveSection 1 "SMART status" "-Hc"
348 !insertmacro DriveSection 2 "SMART attributes" "-A"
349 !insertmacro DriveSection 3 "SMART short selftest" "-t short"
350 !insertmacro DriveSection 4 "SMART long selftest" "-t long"
351 !insertmacro DriveSection 5 "SMART continue selective selftest" '-t "selective,cont"'
352
353 SectionGroupEnd
354
355 Section "UBCD4Win Plugin" UBCD_SECTION
356
357 SectionIn 4
358
359 SetOutPath "$UBCDDIR"
360 DetailPrint "Create file: smartmontools.inf"
361 FileOpen $0 "$UBCDDIR\smartmontools.inf" "w"
362 FileWrite $0 '; smartmontools.inf$\r$\n; PE Builder v3 plug-in INF file$\r$\n'
363 FileWrite $0 '; Created by smartmontools installer$\r$\n'
364 FileWrite $0 '; http://smartmontools.sourceforge.net/$\r$\n$\r$\n'
365 FileWrite $0 '[Version]$\r$\nSignature= "$$Windows NT$$"$\r$\n$\r$\n'
366 FileWrite $0 '[PEBuilder]$\r$\nName="Disk -Diagnostic: smartmontools"$\r$\n'
367 FileWrite $0 'Enable=1$\r$\nHelp="files\smartctl.8.html"$\r$\n$\r$\n'
368 FileWrite $0 '[WinntDirectories]$\r$\na=Programs\smartmontools,2$\r$\n$\r$\n'
369 FileWrite $0 '[SourceDisksFolders]$\r$\nfiles=a,,1$\r$\n$\r$\n'
370 FileWrite $0 '[Append]$\r$\nnu2menu.xml, smartmontools_nu2menu.xml$\r$\n'
371 FileClose $0
372
373 DetailPrint "Create file: smartmontools_nu2menu.xml"
374 FileOpen $0 "$UBCDDIR\smartmontools_nu2menu.xml" "w"
375 FileWrite $0 '<!-- Nu2Menu entry for smartmontools -->$\r$\n<NU2MENU>$\r$\n'
376 FileWrite $0 '$\t<MENU ID="Programs">$\r$\n$\t$\t<MITEM TYPE="POPUP" MENUID="Disk Tools">'
377 FileWrite $0 'Disk Tools</MITEM>$\r$\n$\t</MENU>$\r$\n$\t<MENU ID="Disk Tools">$\r$\n'
378 FileWrite $0 '$\t$\t<MITEM TYPE="POPUP" MENUID="Diagnostic">Diagnostic</MITEM>$\r$\n$\t</MENU>'
379 FileWrite $0 '$\r$\n$\t<MENU ID="Diagnostic">$\r$\n$\t$\t<MITEM TYPE="ITEM" DISABLED="'
380 FileWrite $0 '@Not(@FileExists(@GetProgramDrive()\Programs\smartmontools\smartctl.exe))" '
381 FileWrite $0 'CMD="RUN" FUNC="cmd.exe /k cd /d @GetProgramDrive()\Programs\smartmontools&'
382 FileWrite $0 'set PATH=@GetProgramDrive()\Programs\smartmontools;%PATH% ">'
383 FileWrite $0 'smartctl</MITEM>$\r$\n$\t</MENU>$\r$\n</NU2MENU>$\r$\n'
384 FileClose $0
385
386 SetOutPath "$UBCDDIR\files"
387 File "${INPDIR}\bin\smartctl.exe"
388 File "${INPDIR}\bin\smartd.exe"
389 File "${INPDIR}\doc\smartctl.8.html"
390 File "${INPDIR}\doc\smartctl.8.txt"
391 File "${INPDIR}\doc\smartd.8.html"
392 File "${INPDIR}\doc\smartd.8.txt"
393 File "${INPDIR}\doc\smartd.conf"
394
395 SectionEnd
396
397
398 ;--------------------------------------------------------------------
399
400 Section "Uninstall"
401
402 ; Stop & remove service
403 IfFileExists "$INSTDIR\bin\smartd.exe" 0 nosrv
404 ReadRegStr $0 HKLM "System\CurrentControlSet\Services\smartd" "ImagePath"
405 StrCmp $0 "" nosrv
406 ExecWait "net stop smartd"
407 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Remove smartd service ?" IDYES 0 IDNO nosrv
408 ExecWait "$INSTDIR\bin\smartd.exe remove"
409 nosrv:
410
411 ; Remove installer registry keys
412 DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools"
413 DeleteRegKey HKLM "Software\smartmontools"
414
415 ; Remove conf file ?
416 IfFileExists "$INSTDIR\bin\smartd.conf" 0 noconf
417 ; Assume unchanged if timestamp is equal to sample file
418 GetFileTime "$INSTDIR\bin\smartd.conf" $0 $1
419 GetFileTime "$INSTDIR\doc\smartd.conf" $2 $3
420 StrCmp "$0:$1" "$2:$3" +2 0
421 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete configuration file$\n$INSTDIR\bin\smartd.conf ?" IDYES 0 IDNO noconf
422 Delete "$INSTDIR\bin\smartd.conf"
423 noconf:
424
425 ; Remove log file ?
426 IfFileExists "$INSTDIR\bin\smartd.log" 0 +3
427 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete log file$\n$INSTDIR\bin\smartd.log ?" IDYES 0 IDNO +2
428 Delete "$INSTDIR\bin\smartd.log"
429
430 ; Remove drivedb-add file ?
431 IfFileExists "$INSTDIR\bin\drivedb-add.h" 0 +3
432 MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete local drive database file$\n$INSTDIR\bin\drivedb-add.h ?" IDYES 0 IDNO +2
433 Delete "$INSTDIR\bin\drivedb-add.h"
434
435 ; Remove files
436 Delete "$INSTDIR\bin\smartctl.exe"
437 Delete "$INSTDIR\bin\smartctl-nc.exe"
438 Delete "$INSTDIR\bin\smartd.exe"
439 Delete "$INSTDIR\bin\syslogevt.exe"
440 Delete "$INSTDIR\bin\drivedb.h"
441 Delete "$INSTDIR\bin\drivedb.h.error"
442 Delete "$INSTDIR\bin\drivedb.h.lastcheck"
443 Delete "$INSTDIR\bin\drivedb.h.old"
444 Delete "$INSTDIR\bin\update-smart-drivedb.exe"
445 Delete "$INSTDIR\bin\smartctl-run.bat"
446 Delete "$INSTDIR\bin\smartd-run.bat"
447 Delete "$INSTDIR\bin\net-run.bat"
448 Delete "$INSTDIR\bin\runcmda.exe"
449 Delete "$INSTDIR\bin\runcmda.exe.manifest"
450 Delete "$INSTDIR\bin\runcmdu.exe"
451 Delete "$INSTDIR\bin\runcmdu.exe.manifest"
452 Delete "$INSTDIR\doc\AUTHORS.txt"
453 Delete "$INSTDIR\doc\CHANGELOG.txt"
454 Delete "$INSTDIR\doc\COPYING.txt"
455 Delete "$INSTDIR\doc\INSTALL.txt"
456 Delete "$INSTDIR\doc\NEWS.txt"
457 Delete "$INSTDIR\doc\README.txt"
458 Delete "$INSTDIR\doc\TODO.txt"
459 Delete "$INSTDIR\doc\WARNINGS.txt"
460 Delete "$INSTDIR\doc\checksums.txt"
461 Delete "$INSTDIR\doc\smartctl.8.html"
462 Delete "$INSTDIR\doc\smartctl.8.txt"
463 Delete "$INSTDIR\doc\smartd.8.html"
464 Delete "$INSTDIR\doc\smartd.8.txt"
465 Delete "$INSTDIR\doc\smartd.conf"
466 Delete "$INSTDIR\doc\smartd.conf.5.html"
467 Delete "$INSTDIR\doc\smartd.conf.5.txt"
468 Delete "$INSTDIR\uninst-smartmontools.exe"
469
470 ; Remove shortcuts
471 SetShellVarContext all
472 Delete "$SMPROGRAMS\smartmontools\*.*"
473 Delete "$SMPROGRAMS\smartmontools\Documentation\*.*"
474 Delete "$SMPROGRAMS\smartmontools\smartctl Examples\*.*"
475 Delete "$SMPROGRAMS\smartmontools\smartd Examples\*.*"
476
477 ; Remove folders
478 RMDir "$SMPROGRAMS\smartmontools\Documentation"
479 RMDir "$SMPROGRAMS\smartmontools\smartctl Examples"
480 RMDir "$SMPROGRAMS\smartmontools\smartd Examples"
481 RMDir "$SMPROGRAMS\smartmontools"
482 RMDir "$INSTDIR\bin"
483 RMDir "$INSTDIR\doc"
484 RMDir "$INSTDIR"
485
486 ; Remove install dir from PATH
487 IfFileExists "$WINDIR\system32\cmd.exe" 0 +3
488 Push "$INSTDIR\bin"
489 Call un.RemoveFromPath
490
491 ; Remove drive menu registry entries
492 !insertmacro DriveMenuRemove
493
494 ; Check for still existing entries
495 IfFileExists "$INSTDIR\bin\smartd.exe" 0 +3
496 MessageBox MB_OK|MB_ICONEXCLAMATION "$INSTDIR\bin\smartd.exe could not be removed.$\nsmartd is possibly still running."
497 Goto +3
498 IfFileExists "$INSTDIR" 0 +2
499 MessageBox MB_OK "Note: $INSTDIR could not be removed."
500
501 IfFileExists "$SMPROGRAMS\smartmontools" 0 +2
502 MessageBox MB_OK "Note: $SMPROGRAMS\smartmontools could not be removed."
503
504 SectionEnd
505
506 ;--------------------------------------------------------------------
507 ; Functions
508
509 Function .onInit
510
511 ; Use Notepad++ if installed
512 StrCpy $EDITOR "$PROGRAMFILES\Notepad++\notepad++.exe"
513 IfFileExists "$EDITOR" +2 0
514 StrCpy $EDITOR "notepad.exe"
515
516 ; Get UBCD4Win install location
517 ReadRegStr $0 HKLM "Software\UBCD4Win" "InstallPath"
518 StrCmp $0 "" 0 +2
519 StrCpy $0 "C:\UBCD4Win"
520 StrCpy $UBCDDIR "$0\plugin\Disk\Diagnostic\smartmontools"
521
522 ; Hide "Add install dir to PATH" on 9x/ME
523 IfFileExists "$WINDIR\system32\cmd.exe" +2 0
524 SectionSetText ${PATH_SECTION} ""
525
526 Call ParseCmdLine
527 FunctionEnd
528
529 ; Command line parsing
530 !macro CheckCmdLineOption name section
531 StrCpy $allopts "$allopts,${name}"
532 Push ",$opts,"
533 Push ",${name},"
534 Call StrStr
535 Pop $0
536 StrCmp $0 "" 0 sel_${name}
537 !insertmacro UnselectSection ${section}
538 Goto done_${name}
539 sel_${name}:
540 !insertmacro SelectSection ${section}
541 StrCpy $nomatch ""
542 done_${name}:
543 !macroend
544
545 Function ParseCmdLine
546 ; get /SO option
547 Var /global opts
548 ${GetParameters} $R0
549 ${GetOptions} $R0 "/SO" $opts
550 IfErrors 0 +2
551 Return
552 Var /global allopts
553 StrCpy $allopts ""
554 Var /global nomatch
555 StrCpy $nomatch "t"
556 ; turn sections on or off
557 !insertmacro CheckCmdLineOption "smartctl" ${SMARTCTL_SECTION}
558 !insertmacro CheckCmdLineOption "smartd" ${SMARTD_SECTION}
559 !insertmacro CheckCmdLineOption "smartctlnc" ${SMARTCTL_NC_SECTION}
560 !insertmacro CheckCmdLineOption "drivedb" ${DRIVEDB_SECTION}
561 !insertmacro CheckCmdLineOption "doc" ${DOC_SECTION}
562 !insertmacro CheckCmdLineOption "uninst" ${UNINST_SECTION}
563 !insertmacro CheckCmdLineOption "menu" ${MENU_SECTION}
564 !insertmacro CheckCmdLineOption "path" ${PATH_SECTION}
565 !insertmacro CheckCmdLineOption "driveremove" ${DRIVE_REMOVE_SECTION}
566 !insertmacro CheckCmdLineOption "drive0" ${DRIVE_0_SECTION}
567 !insertmacro CheckCmdLineOption "drive1" ${DRIVE_1_SECTION}
568 !insertmacro CheckCmdLineOption "drive2" ${DRIVE_2_SECTION}
569 !insertmacro CheckCmdLineOption "drive3" ${DRIVE_3_SECTION}
570 !insertmacro CheckCmdLineOption "drive4" ${DRIVE_4_SECTION}
571 !insertmacro CheckCmdLineOption "drive5" ${DRIVE_5_SECTION}
572 !insertmacro CheckCmdLineOption "ubcd" ${UBCD_SECTION}
573 StrCmp $opts "-" done
574 StrCmp $nomatch "" done
575 StrCpy $0 "$allopts,-" "" 1
576 MessageBox MB_OK "Usage: smartmontools-VERSION.win32-setup [/S] [/SO component,...] [/D=INSTDIR]$\n$\ncomponents:$\n $0"
577 Abort
578 done:
579 FunctionEnd
580
581 ; Directory page callbacks
582
583 !macro CheckSection section
584 SectionGetFlags ${section} $0
585 IntOp $0 $0 & 1
586 IntCmp $0 1 done
587 !macroend
588
589 Function SkipProgPath
590 !insertmacro CheckSection ${SMARTCTL_SECTION}
591 !insertmacro CheckSection ${SMARTCTL_NC_SECTION}
592 !insertmacro CheckSection ${SMARTD_SECTION}
593 !insertmacro CheckSection ${DRIVEDB_SECTION}
594 !insertmacro CheckSection ${DOC_SECTION}
595 !insertmacro CheckSection ${MENU_SECTION}
596 !insertmacro CheckSection ${PATH_SECTION}
597 !insertmacro CheckSection ${DRIVE_0_SECTION}
598 !insertmacro CheckSection ${DRIVE_1_SECTION}
599 !insertmacro CheckSection ${DRIVE_2_SECTION}
600 !insertmacro CheckSection ${DRIVE_3_SECTION}
601 !insertmacro CheckSection ${DRIVE_4_SECTION}
602 !insertmacro CheckSection ${DRIVE_5_SECTION}
603 Abort
604 done:
605 FunctionEnd
606
607 Function SkipUBCDPath
608 !insertmacro CheckSection ${UBCD_SECTION}
609 Abort
610 done:
611 FunctionEnd
612
613
614 ; Install runcmda.exe if missing
615
616 Function CheckRunCmdA
617 IfFileExists "$INSTDIR\bin\runcmda.exe" done 0
618 SetOutPath "$INSTDIR\bin"
619 File "${INPDIR}\bin\runcmda.exe"
620 File "${INPDIR}\bin\runcmda.exe.manifest"
621 done:
622 FunctionEnd
623
624
625 ;--------------------------------------------------------------------
626 ; Path functions
627 ;
628 ; Based on example from:
629 ; http://nsis.sourceforge.net/Path_Manipulation
630 ;
631
632
633 !include "WinMessages.nsh"
634
635 ; Registry Entry for environment (NT4,2000,XP)
636 ; All users:
637 ;!define Environ 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
638 ; Current user only:
639 !define Environ 'HKCU "Environment"'
640
641
642 ; AddToPath - Appends dir to PATH
643 ; (does not work on Win9x/ME)
644 ;
645 ; Usage:
646 ; Push "dir"
647 ; Call AddToPath
648
649 Function AddToPath
650 Exch $0
651 Push $1
652 Push $2
653 Push $3
654
655 ReadRegStr $1 ${Environ} "PATH"
656 Push "$1;"
657 Push "$0;"
658 Call StrStr
659 Pop $2
660 StrCmp $2 "" 0 done
661 Push "$1;"
662 Push "$0\;"
663 Call StrStr
664 Pop $2
665 StrCmp $2 "" 0 done
666
667 DetailPrint "Add to PATH: $0"
668 StrCpy $2 $1 1 -1
669 StrCmp $2 ";" 0 +2
670 StrCpy $1 $1 -1 ; remove trailing ';'
671 StrCmp $1 "" +2 ; no leading ';'
672 StrCpy $0 "$1;$0"
673 WriteRegExpandStr ${Environ} "PATH" $0
674 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
675
676 done:
677 Pop $3
678 Pop $2
679 Pop $1
680 Pop $0
681 FunctionEnd
682
683
684 ; RemoveFromPath - Removes dir from PATH
685 ;
686 ; Usage:
687 ; Push "dir"
688 ; Call RemoveFromPath
689
690 Function un.RemoveFromPath
691 Exch $0
692 Push $1
693 Push $2
694 Push $3
695 Push $4
696 Push $5
697 Push $6
698
699 ReadRegStr $1 ${Environ} "PATH"
700 StrCpy $5 $1 1 -1
701 StrCmp $5 ";" +2
702 StrCpy $1 "$1;" ; ensure trailing ';'
703 Push $1
704 Push "$0;"
705 Call un.StrStr
706 Pop $2 ; pos of our dir
707 StrCmp $2 "" done
708
709 DetailPrint "Remove from PATH: $0"
710 StrLen $3 "$0;"
711 StrLen $4 $2
712 StrCpy $5 $1 -$4 ; $5 is now the part before the path to remove
713 StrCpy $6 $2 "" $3 ; $6 is now the part after the path to remove
714 StrCpy $3 "$5$6"
715 StrCpy $5 $3 1 -1
716 StrCmp $5 ";" 0 +2
717 StrCpy $3 $3 -1 ; remove trailing ';'
718 WriteRegExpandStr ${Environ} "PATH" $3
719 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
720
721 done:
722 Pop $6
723 Pop $5
724 Pop $4
725 Pop $3
726 Pop $2
727 Pop $1
728 Pop $0
729 FunctionEnd
730
731
732 ; StrStr - find substring in a string
733 ;
734 ; Usage:
735 ; Push "this is some string"
736 ; Push "some"
737 ; Call StrStr
738 ; Pop $0 ; "some string"
739
740 !macro StrStr un
741 Function ${un}StrStr
742 Exch $R1 ; $R1=substring, stack=[old$R1,string,...]
743 Exch ; stack=[string,old$R1,...]
744 Exch $R2 ; $R2=string, stack=[old$R2,old$R1,...]
745 Push $R3
746 Push $R4
747 Push $R5
748 StrLen $R3 $R1
749 StrCpy $R4 0
750 ; $R1=substring, $R2=string, $R3=strlen(substring)
751 ; $R4=count, $R5=tmp
752 loop:
753 StrCpy $R5 $R2 $R3 $R4
754 StrCmp $R5 $R1 done
755 StrCmp $R5 "" done
756 IntOp $R4 $R4 + 1
757 Goto loop
758 done:
759 StrCpy $R1 $R2 "" $R4
760 Pop $R5
761 Pop $R4
762 Pop $R3
763 Pop $R2
764 Exch $R1 ; $R1=old$R1, stack=[result,...]
765 FunctionEnd
766 !macroend
767 !insertmacro StrStr ""
768 !insertmacro StrStr "un."
769
770
771 ;--------------------------------------------------------------------
772 ; Set Run As Administrator flag in shortcut
773 ;
774 ; Slightly modified version from:
775 ; http://nsis.sourceforge.net/IShellLink_Set_RunAs_flag
776 ;
777
778 !include "LogicLib.nsh"
779
780 !define IPersistFile {0000010b-0000-0000-c000-000000000046}
781 !define CLSID_ShellLink {00021401-0000-0000-C000-000000000046}
782 !define IID_IShellLinkA {000214EE-0000-0000-C000-000000000046}
783 !define IID_IShellLinkW {000214F9-0000-0000-C000-000000000046}
784 !define IShellLinkDataList {45e2b4ae-b1c3-11d0-b92f-00a0c90312e1}
785 !ifdef NSIS_UNICODE
786 !define IID_IShellLink ${IID_IShellLinkW}
787 !else
788 !define IID_IShellLink ${IID_IShellLinkA}
789 !endif
790
791 Function ShellLinkSetRunAs
792 System::Store S ; push $0-$9, $R0-$R9
793 pop $9
794 ; $0 = CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER, IID_IShellLink, &$1)
795 System::Call "ole32::CoCreateInstance(g'${CLSID_ShellLink}',i0,i1,g'${IID_IShellLink}',*i.r1)i.r0"
796 ${If} $0 = 0
797 System::Call "$1->0(g'${IPersistFile}',*i.r2)i.r0" ; $0 = $1->QueryInterface(IPersistFile, &$2)
798 ${If} $0 = 0
799 System::Call "$2->5(w '$9',i 0)i.r0" ; $0 = $2->Load($9, STGM_READ)
800 ${If} $0 = 0
801 System::Call "$1->0(g'${IShellLinkDataList}',*i.r3)i.r0" ; $0 = $1->QueryInterface(IShellLinkDataList, &$3)
802 ${If} $0 = 0
803 System::Call "$3->6(*i.r4)i.r0"; $0 = $3->GetFlags(&$4)
804 ${If} $0 = 0
805 System::Call "$3->7(i $4|0x2000)i.r0" ; $0 = $3->SetFlags($4|SLDF_RUNAS_USER)
806 ${If} $0 = 0
807 System::Call "$2->6(w '$9',i1)i.r0" ; $2->Save($9, TRUE)
808 ${EndIf}
809 ${EndIf}
810 System::Call "$3->2()" ; $3->Release()
811 ${EndIf}
812 System::Call "$2->2()" ; $2->Release()
813 ${EndIf}
814 ${EndIf}
815 System::Call "$1->2()" ; $1->Release()
816 ${EndIf}
817 ${If} $0 <> 0
818 DetailPrint "Set RunAsAdmin: $9 failed ($0)"
819 ${Else}
820 DetailPrint "Set RunAsAdmin: $9"
821 ${EndIf}
822 System::Store L ; push $0-$9, $R0-$R9
823 FunctionEnd