summaryrefslogtreecommitdiff
path: root/build.nsi
blob: 66408e81285422d8e26904c5f5a00fb3f4b8727c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
;yacy.nsi
; ----------------------------------------
;(C) 2004-2006 by Alexander Schier
;(C) 2008-2010 by David Wieditz
/*----------------------------------------
MANUALS
http://nsis.sourceforge.net/Docs/
http://nsis.sourceforge.net/Docs/Modern%20UI%202/Readme.html
----------------------------------------
COMMAND LINE OPTIONS (case sensitive):
/S - silent install/uninstall
/D="C:\yacy" - installation folder
----------------------------------------*/

; ----------------------------------------
; MODERN UI

!include MUI2.nsh
!include x64.nsh
!include FileFunc.nsh
!include WinVer.nsh

; ----------------------------------------
; GENERAL

VIProductVersion "@REPL_VERSION@.0.0"
VIAddVersionKey "ProductName" "YaCy"
VIAddVersionKey "LegalCopyright" "YaCy"
VIAddVersionKey "FileVersion" "@REPL_VERSION@"
VIAddVersionKey "FileDescription" "YaCy"
VIAddVersionKey "OriginalFilename" "yacy_v@REPL_VERSION@_@REPL_DATE@_@REPL_REVISION_NR@.exe"

Name "YaCy @REPL_VERSION@"
OutFile "RELEASE\WINDOWS\yacy_v@REPL_VERSION@_@REPL_DATE@_@REPL_REVISION_NR@.exe"

;default installation folder
InstallDir "$PROFILE\YaCy"
InstallDirRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\YaCy" "UninstallString"

;recommend free space in GB for YaCy
!define RecommendSpace "30"

; some string for Firewall
!define WinXPAddFwRule 'netsh firewall add portopening protocol=tcp port=8090 name=YaCy mode=enable'
!define WinXPDelFwRule 'netsh firewall del portopening protocol=tcp port=8090'
!define WinVistaAddFwRule 'netsh advfirewall firewall add rule name="YaCy" dir=in action=allow protocol=tcp localport=8090'
!define WinVistaDelFwRule 'netsh advfirewall firewall del rule name="YaCy"'
var WinAddFwRule
var WinDelFwRule


;requested execution level on Vista / 7
RequestExecutionLevel admin

SetCompressor /SOLID LZMA
!insertmacro MUI_RESERVEFILE_LANGDLL ;loads faster

; ----------------------------------------
; JAVA VERSION
; http://www.java.com/de/download/manual.jsp BundleId +1 / +2

!define JRE_VERSION6 "1.6"
!define JRE_32 "http://yacy.berlios.de/download.php?what=jre&version=32&yacyrevnr=@REPL_REVISION_NR@"
!define JRE_64 "http://yacy.berlios.de/download.php?what=jre&version=64&yacyrevnr=@REPL_REVISION_NR@"

; ----------------------------------------
; GENERAL APPEARANCE

BrandingText "yacy.net"

!define MUI_ICON "RELEASE\MAIN\addon\YaCy.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\orange-uninstall.ico"

!define MUI_WELCOMEFINISHPAGE_BITMAP "RELEASE\MAIN\addon\installer\network.bmp"

!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "RELEASE\MAIN\addon\installer\logo.bmp"
!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH

!define MUI_ABORTWARNING ;display warning before aborting installation

; ----------------------------------------
; INSTALLER PAGES

!insertmacro MUI_PAGE_WELCOME

!insertmacro MUI_PAGE_LICENSE gpl.txt

!define MUI_COMPONENTSPAGE_NODESC
!insertmacro MUI_PAGE_COMPONENTS
ComponentText "YaCy v@REPL_VERSION@ (Build @REPL_DATE@)"

!define MUI_PAGE_CUSTOMFUNCTION_LEAVE CheckDriveSpace
!insertmacro MUI_PAGE_DIRECTORY

!insertmacro MUI_PAGE_INSTFILES

!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOW_PageFinish_custom
!define MUI_FINISHPAGE_SHOWREADME http://www.yacy-websuche.de/wiki/index.php/InstallerFinished
!define MUI_FINISHPAGE_SHOWREADME_TEXT $(finishPage)
!insertmacro MUI_PAGE_FINISH

; ----------------------------------------
; UNINSTALLER PAGES

!insertmacro MUI_UNPAGE_CONFIRM

!insertmacro MUI_UNPAGE_INSTFILES

; ----------------------------------------
; LANGUAGES

!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "German"

LangString stillRunning ${LANG_ENGLISH} "YaCy is still active. Please stop YaCy first."
LangString keepData 0 "Do you want to keep the data?"
LangString noAdminForJava 0 "You need Administrator privileges to install Java. Java will now be downloaded to the shared documents folder. YaCy won't run without Java."
LangString finishPage 0 "Show how to configure the Windows Firewall for YaCy."
LangString yacyNoHd 0 "YaCy should be installed on a hard disk. Continue with selected folder?" 
LangString yacyNeedSpace 0 "We recommend ${RecommendSpace} GB free space for YaCy. There are only $TempDriveFree GB left. Continue anyway?"
LangString yacyNeedOs 0 "Please run Windows 2000 or better (e.g. Windows XP, Vista or Windows 7) for YaCy."

LangString stillRunning ${LANG_FRENCH} "YaCy is still active. Please stop YaCy first."
LangString keepData 0 "Do you want to keep the data?"
LangString noAdminForJava 0 "You need Administrator privileges to install Java. Java will now be downloaded to the shared documents folder. YaCy won't run without Java."
LangString finishPage 0 "Show how to configure the Windows Firewall for YaCy."
LangString yacyNoHd 0 "YaCy should be installed on a hard disk. Continue with selected folder?"
LangString yacyNeedSpace 0 "We recommend ${RecommendSpace} GB free space for YaCy. There are only $TempDriveFree GB left. Continue anyway?"
LangString yacyNeedOs 0 "Please run Windows 2000 or better (e.g. Windows XP, Vista or Windows 7) for YaCy."

LangString stillRunning ${LANG_GERMAN} "YaCy ist noch aktiv. Bitte beenden Sie YaCy."
LangString keepData 0 "Moechten Sie die Daten behalten?"
LangString noAdminForJava 0 "Sie benoetigen Administrator-Rechte um Java zu installieren. Java wird nun in 'Gemeinsame Dokumente' gespeichert. YaCy benoetigt Java zur Ausfuehrung."
LangString finishPage 0 "Zeige die Windows Firewall Konfiguration fuer YaCy."
LangString yacyNoHd 0 "YaCy sollte auf einer Festplatte installiert werden. Soll der gewaehlte Ordner trotzdem verwendet werden?" 
LangString yacyNeedSpace 0 "Wir empfehlen ${RecommendSpace} GB fuer YaCy. Es sind noch $TempDriveFree GB frei. Trotzdem fortfahren?"
LangString yacyNeedOs 0 "YaCy benoetigt Windows 2000 oder besser (z.B. Windows XP, Vista oder Windows 7)."

; ----------------------------------------
; INSTALLABLE MODULES

;InstType "Normal"

Section "YaCy"
	SectionIn 1 RO
	SetShellVarContext current ; use system variables (folders) for current user
	RMDir /r "$INSTDIR\lib" ;remove old libraries in case of update
	RMDir /r "$SMPROGRAMS\YaCy" ;clear old shortcuts
	Delete "$QUICKLAUNCH\YaCy-Search.lnk" ;old
	Delete "$DESKTOP\YaCy-Search.lnk" ;old
	Delete "$SMSTARTUP\start YaCy (no console).lnk" ;old
	
	SetOutPath $INSTDIR
	;set noindex attribute for windows indexing service
    	nsExec::Exec 'attrib +I "$INSTDIR"'
	nsExec::Exec 'attrib +I "$INSTDIR\*" /S /D'
    
	File /r "RELEASE\MAIN\*"

	WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\YaCy" "DisplayName" "YaCy"
	WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\YaCy" "UninstallString" '"$INSTDIR\uninstall.exe"'
	WriteUninstaller "uninstall.exe"
SectionEnd

Section "Sun Java" Sec_Java_id
    	SectionIn 1 RO
    	SetShellVarContext current
    	Call GetJRE
SectionEnd

Section "Start Menu Group"
	SectionIn 1
	SetShellVarContext current
	CreateDirectory "$SMPROGRAMS\YaCy"
	CreateShortCut "$SMPROGRAMS\YaCy\YaCy.lnk" "$INSTDIR\startYACY.bat" "" "$INSTDIR\addon\YaCy.ico" "" SW_SHOWMINIMIZED
	CreateShortCut "$SMPROGRAMS\YaCy\Readme.lnk" "$INSTDIR\readme.txt"
	CreateShortCut "$SMPROGRAMS\YaCy\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
SectionEnd

Section "Desktop Icon"
	SectionIn 1
	SetShellVarContext current
	CreateShortCut "$DESKTOP\YaCy.lnk" "$INSTDIR\startYACY.bat" "" "$INSTDIR\addon\YaCy.ico" "" SW_SHOWMINIMIZED
SectionEnd

Section "Open Firewall (Port 8090)" Sec_Firewall_id
	SectionIn 1
	SetShellVarContext current
	call OpenFirewall	
SectionEnd

/*
Section "YaCy in Startup"
	SetShellVarContext current
	CreateShortCut "$SMSTARTUP\YaCy.lnk" "$INSTDIR\startYACY.bat" "" "$INSTDIR\addon\YaCy.ico" "" SW_SHOWMINIMIZED
SectionEnd
*/

; ----------------------------------------
; UNINSTALLER

Section "Uninstall"
	IfFileExists "$INSTDIR\DATA\yacy.running" 0 uninstall
	MessageBox MB_ICONSTOP "$(stillRunning)" /SD IDOK
	Goto nouninstall

	uninstall:
	Call un.CloseFirewall
	SetShellVarContext current

	RMDir /r "$INSTDIR\addon"
    	RMDir /r "$INSTDIR\bin"
	RMDir /r "$INSTDIR\classes"
	RMDir /r "$INSTDIR\defaults"
	RMDir /r "$INSTDIR\htroot"
	RMDir /r "$INSTDIR\lib"
	RMDir /r "$INSTDIR\libx"
	RMDir /r "$INSTDIR\locales"
	RMDir /r "$INSTDIR\ranking"
	RMDir /r "$INSTDIR\skins"
	RMDir /r "$INSTDIR\source"
	Delete "$INSTDIR\*.*"

	MessageBox MB_YESNO|MB_ICONQUESTION "$(keepData)" /SD IDYES IDYES keepdata
	
	;delete all
	RMDir /r "$INSTDIR"
	
	;or jump to this
	keepdata:
	RMDir /r "$SMPROGRAMS\YaCy"
	Delete "$DESKTOP\YaCy.lnk"
	Delete "$SMSTARTUP\YaCy.lnk"
	
	DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\YaCy"
	nouninstall:
SectionEnd

; ----------------------------------------
; FUNCTIONS

Function .onInit
	; check Windows-Version, need Win 2000 or higher
	${If} ${AtMostWinME} 
		MessageBox MB_ICONSTOP "$(yacyNeedOs)" 
		Abort 
	${EndIf}		
	
	; init of JRE section
	; detect JRE first
	var /global InstalledJREVersion
	${If} ${RunningX64}
		SetRegView 64
	${EndIf}
	ReadRegStr $InstalledJREVersion HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion"
	; if right JRE already installed hide and deselect JRE section
	${If} $InstalledJREVersion = ${JRE_VERSION6}
		SectionSetText ${Sec_Java_id} ""
		SectionSetFlags ${Sec_Java_id} 0
	${EndIf}
	
	; init of Firewall section, only valid for WindowsXP SP2/SP3 and Vista/Win 7 with Admin 
	var /global FirewallServiceStart 
	IntOp $FirewallServiceStart 3 + 0

	${If} ${IsWinVista} 
	${OrIf} ${IsWin7}
		StrCpy $WinAddFwRule '${WinVistaAddFwRule}'
		StrCpy $WinDelFwRule '${WinVistaDelFwRule}'
		ReadRegDWORD $FirewallServiceStart HKLM "SYSTEM\CurrentControlSet\services\MpsSvc" "Start"
	${EndIf}

	${If} ${IsWinXP} 
	${AndIf} ${AtLeastServicePack} 2
		StrCpy $WinAddFwRule '${WinXPAddFwRule}'
		StrCpy $WinDelFwRule '${WinXPDelFwRule}'
		ReadRegDWORD $FirewallServiceStart HKLM "SYSTEM\CurrentControlSet\services\SharedAccess" "Start"
	${EndIf}
	
	;need Admin for firewall-config
	${IfNot} $0 = "Admin" 
		IntOp $FirewallServiceStart 3 + 0
	${EndIf}

	; hide and deselect Firewall if no proper configuration
	${If} $FirewallServiceStart > 2 
		SectionSetText ${Sec_Firewall_id} ""
		SectionSetFlags ${Sec_Firewall_id} 0
	${EndIf}
FunctionEnd

Function GetJRE
; based on http://nsis.sourceforge.net/Simple_Java_Runtime_Download_Script
    	${If} ${RunningX64}
    		StrCpy $3 ${JRE_64} 
    	${Else}
    		StrCpy $3 ${JRE_32}
    	${EndIf}

	;check if admin before download, advise if non    
	userInfo::getAccountType
	Pop $0

	${IfNot} $0 = "Admin" 
		MessageBox MB_ICONEXCLAMATION "$(noAdminForJava)" /SD IDOK
	${EndIf}

	SetShellVarContext all
	StrCpy $2 "$DOCUMENTS\Java Runtime (install for YaCy).exe"
	SetShellVarContext current
	nsisdl::download /TIMEOUT=30000 $3 $2
	Pop $R0 ;Get the return value
	
	${IfNot} $R0 = "success" 
		MessageBox MB_OK "Download failed: $R0" /SD IDOK
		Return
	${EndIf}

	${If} $0 == "Admin" 
		ExecWait "$2 /s"
		Delete $2
	${Else}
		CreateShortCut "$DESKTOP\Install Java for YaCy.lnk" "$2"
	${EndIf}
FunctionEnd

Function CheckDriveSpace
	var /global RootFolder
   	var /global TempDriveFree
   	var /global RootFolderType

	; if "\\Folder" it's a Network-Folder
   	StrCpy $RootFolder $InstDir 2
   	StrCmp $RootFolder "\\" NetworkFolder Driveletter

   	Networkfolder:
		; prepare String for DriveSpace
      		${GetRoot} $RootFolder $InstDir
      		goto NoHDD

	; now check drive-letters
   	Driveletter:
   		StrCpy $RootFolder $InstDir 3

		; prepare for {GetDrives-Loop}
   		StrCpy $RootFolderType "invalid"
   		${GetDrives} "ALL" "CheckDriveType"

		; jump if error
   		StrCmp $RootFolderType "invalid" CheckSpace

		; jump if HDD
   		StrCmp $RootFolderType "HDD" CheckSpace

   	NoHDD:
	; stay on folder-selection if user wants to give another folder, else check free space
      		MessageBox MB_ICONEXCLAMATION|MB_YESNO "$(yacyNoHd)" IDYES NextPage
      		Abort      

   	CheckSpace:

   	ClearErrors
   	${DriveSpace} $RootFolder "/D=F /S=G" $TempDriveFree
	; if DriveSpace fails for any reason -> jump ahead
   	IfErrors NextPage

   	${If} $TempDriveFree < ${RecommendSpace} 
		MessageBox MB_ICONEXCLAMATION|MB_YESNO "$(yacyNeedSpace)" IDYES NextPage
      		Abort	
	${EndIf}

   	NextPage:
FunctionEnd

Function CheckDriveType
; based on http://nsis.sourceforge.net/GetDrives  
   	${If} $9 == $RootFolder 
   		StrCpy $RootFolderType $8   
   		StrCpy $0 StopGetDrives
	${EndIf}
   	Push $0
FunctionEnd

Function OpenFirewall
	var /global ExecErrorCode
	; run netsh 
	nsExec::ExecToStack '$WinAddFwRule'
	pop $ExecErrorCode
	; if run without error register for uninstall and clear finish page 
	${If} $ExecErrorCode = "0"
		WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\YaCy" "DelFwRule" '$WinDelFwRule'
		IntOp $FirewallServiceStart 0 + 0
	${Else}
		IntOp $FirewallServiceStart 3 + 0
	${EndIf}
FunctionEnd

Function SHOW_PageFinish_custom
	; hide and disable firewall info from wiki if firewall is open
	${If} $FirewallServiceStart = 0 
		SendMessage $mui.FinishPage.ShowReadme ${BM_SETCHECK} 0 0
	    	ShowWindow $mui.FinishPage.ShowReadme ${SW_HIDE}
	${EndIf}
FunctionEnd

Function un.CloseFirewall
	; get string for closing port from registy
	ReadRegStr '$WinDelFwRule' HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\YaCy" "DelFwRule"
	; if found > run netsh to close port
	${IfNot} '$WinDelFwRule' == '' 
		nsExec::ExecToStack '$WinDelFwRule'
	${EndIf}
FunctionEnd