-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUpdate.nsi
282 lines (233 loc) · 10.1 KB
/
Update.nsi
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
/*
AMPc for Windows - Entorno web local para Windows
Copyright (C) 2025 Hu SpA ( https://hucreativa.cl )
This file is part of AMPc for Windows.
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this file,
You can obtain one at http://mozilla.org/MPL/2.0/.
-------------------------------------------------------------------------------
Updater.nsi - Genera ejecutable para consulta y descarga de actualizaciones.
NOTAS:
+ Algunas constantes estan ubicadas en el archivo Commons.nsi y son
compartidas por otros archivos *.NSI del proyecto.
+ Todos los caracteres especiales se han omitido para mayor compatibilidad.
*/
;
; PACKAGE - Nombre del paquete a compilar.
!define PACKAGE "Update AMPc for Windows"
;
; FILE_STATUS - Entorno final de este archivo compilado. Valores: dev|prod.
!define FILE_STATUS "dev"
;
; VER_F_VIP - Version apta para VIProductVersion (no cumple SemVer).
!define VER_F_VIP "${AMPC_VERSION}.1"
;
; URL_UPDATE_INI - URL del archivo update.ini
!define URL_UPDATE_INI "https://raw.githubusercontent.com/hucrea/AMPc/main/update.ini"
;
; THE_UPDATE_EXE - Ruta del instalador actualizado.
!define THE_UPDATE_EXE "$INSTDIR\ampc_for_windows-latest.exe"
;
; Incluye el archivo de constantes compartidas con otros *.NSI del proyecto.
!include "Commons.nsh"
###############################################################################
; DETALLES DE LA COMPILACION ACTUAL.
###############################################################################
;
; Nombre del instalador EXE compilado.
OutFile "bin-src\ampc\update-ampc.exe"
;
; Permitir mostrar detalles durante instalacion.
ShowInstDetails show
;
; Ruta de instalacion, para almacenar instalable actualizado.
InstallDir "$APPDATA\Hu SpA"
;
; Descripcion del archivo.
VIAddVersionKey /LANG=0 "FileDescription" "${PACKAGE}"
###############################################################################
; PROCESO DE INSTALACION.
###############################################################################
!include "MUI.nsh"
!include "x64.nsh"
!include "MUI2.nsh"
;!include "nsDialogs.nsh"
!include "LogicLib.nsh"
!include "VersionCompare.nsh"
; Configuracion de la instalacion.
!define MUI_HEADERIMAGE_BITMAP "media-src\header-update.bmp"
!define MUI_WELCOMEFINISHPAGE_BITMAP "media-src\banner-update.bmp"
!define MUI_ICON "media-src\ampc_update.ico"
!define MUI_PAGE_HEADER_TEXT "Guardar (ejecutable de) actualización"
!define MUI_PAGE_HEADER_SUBTEXT "Selecciona una carpeta para guardar la actualización"
!define MUI_DIRECTORYPAGE_TEXT_TOP "Selecciona la carpeta donde se guardará el archivo ampc-lastest.exe$\n$\n \
Por defecto, se selecciona el directorio de la instalación actual aunque puede ser cambiado."
!define MUI_DIRECTORYPAGE_TEXT_DESTINATION "Carpeta donde se guardará ampc-latest.exe"
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_HEADER_TEXT "Actualización"
!define MUI_PAGE_HEADER_SUBTEXT "Espera mientras se ejecutan las tareas de actualización."
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_FINISHPAGE_RUN "${THE_UPDATE_EXE}"
!define MUI_FINISHPAGE_RUN_TEXT "Actualizar AMPc for Windows"
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Spanish"
###############################################################################
; VARIABLES DEL PAQUETE.
###############################################################################
Var versionCurrentAMPc
Var versionAvailableAMPc
Var urlDownloadRelease
Var urlUpdateINI
Var remoteHashUpdate
Var skipDownload
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Al iniciar el ejecutable.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function .onInit
InitPluginsDir
; Splash al iniciar el actualizador.
SetOutPath $PLUGINSDIR
File "media-src\splash-update.bmp"
splash::show 1750 "$PLUGINSDIR\splash-update"
Pop $0
Delete "$PLUGINSDIR\splash-update.bmp"
; Verifica que arquitectura del sistema anfitrion sea x64.
${IfNot} ${RunningX64}
MessageBox MB_OK|MB_ICONSTOP "Error inesperado (2000)."
Abort
${EndIf}
; Evita redirecciones de WOW64 en directorios y registros.
${DisableX64FSRedirection}
SetRegView 64
; Verifica si existe alguna instalacion previa.
ClearErrors
ReadRegStr $R1 ${REGKEY_ROOT} "${REGKEY_UNINST}" "DisplayVersion"
; No existe instalacion previa.
${If} ${Errors}
MessageBox MB_OK|MB_ICONINFORMATION "No se ha detectado ninguna versión de AMPc for Windows instalada.$\n$\nSi esto un error y necesitas ayuda, o deseas obtener más información, visita$\n$\n${AMPC_URL}"
Abort ; Aborta el proceso.
${EndIf}
; Almacena numero de version actual encontrado.
StrCpy $versionCurrentAMPc "$R1"
; Descarga archivo update.ini desde el repositorio.
NScurl::http get "${URL_UPDATE_INI}" "$PLUGINSDIR\update.ini" /TIMEOUT 10s /END
Pop $0
; NScurl devuelve OK solo si todo sale bien.
${IfNot} $0 == "OK"
MessageBox MB_OK|MB_ICONINFORMATION "Error al descargar update.ini desde la URL:$\n$\n${URL_UPDATE_INI}$\n$\nError devuelto: $0"
Abort ; Aborta el proceso.
${EndIf}
; Lee la version declarada como última desde update.ini
ReadINIStr $versionAvailableAMPc "$PLUGINSDIR\update.ini" "AMPc" "version"
; Lee la URL declarada en update.ini para update.ini.
ReadINIStr $urlUpdateINI "$PLUGINSDIR\update.ini" "AMPc" "current"
; Lee la firma HASH SHA-256 de la ultima version disponible.
ReadINIStr $remoteHashUpdate "$PLUGINSDIR\update.ini" "AMPc" "hsha256"
; Compara que la URL declarada sea igual a la URL almacenada en el paquete.
StrCmp $urlUpdateINI ${URL_UPDATE_INI} isSameUrl notSameUrl
notSameUrl: ; No es la misma URL.
MessageBox MB_OK|MB_ICONINFORMATION "Error inesperado (2050)"
Abort ; Aborta el proceso.
isSameUrl:
; Compara la version local con la version declarada en update.ini.
${VersionCompare} "$versionCurrentAMPc" "$versionAvailableAMPc" $R2
${If} $R2 == "0"
; Esta utilizando la ultima version.
MessageBox MB_OK|MB_USERICON "Tienes la última versión disponible.$\n$\n$versionCurrentAMPc (actual) = $versionAvailableAMPc (disponible)"
Abort ; Aborta el proceso.
${ElseIf} $R2 == "1"
; La version instalada es superior a la ultima version.
MessageBox MB_OK|MB_USERICON "Estas usando una versión en desarrollo.$\n$\n$versionCurrentAMPc (actual) > $versionAvailableAMPc (disponible)"
Abort ; Aborta el proceso.
${ElseIf} $R2 == "2"
; La version instalada es inferior a la ultima version.
MessageBox MB_YESNO|MB_USERICON "Hay una actualización disponible.$\n$\n$versionCurrentAMPc (actual) < $versionAvailableAMPc (disponible)$\n$\n¿Descargar la última versión?" IDYES true IDNO false
; Usuario rechaza la descarga automatica.
false:
Abort ; Aborta el proceso.
true:
StrCpy $skipDownload "no"
${Else}
; No deberias llegar aqui, pero por si las moscas.
MessageBox MB_OK|MB_ICONEXCLAMATION "Error inesperado (2001)."
Abort ; Aborta el proceso.
${EndIf}
FunctionEnd
Section -"Prepare"
DetailPrint "Verificando si existen actualizaciones descargadas"
IfFileExists "${THE_UPDATE_EXE}" exeFound exeNotFoud
exeFound:
ClearErrors
Crypto::HashFile "SHA2" "${THE_UPDATE_EXE}"
Pop $R0
${If} ${Errors}
DetailPrint "No se puede obtener el HASH de ${THE_UPDATE_EXE}"
${EndIf}
StrCmp $R0 $remoteHashUpdate isSameHash notSameHash
notSameHash:
DetailPrint "Hash esperado: $remoteHashUpdate"
DetailPrint "Hash obtenido: $R0"
DetailPrint "Resultado: hash NO coincide."
DetailPrint "Existe archivo EXE pero no coincide con el HASH de la última versión."
DetailPrint "Eliminando el archivo EXE existente."
Delete ${THE_UPDATE_EXE}
DetailPrint "Archivo EXE eliminado."
Goto exeNotFoud
isSameHash:
DetailPrint "Hash esperado: $remoteHashUpdate"
DetailPrint "Hash obtenido: $R0"
DetailPrint "Resultado: hash coincide."
DetailPrint "Se omitirá la descarga."
StrCpy $skipDownload "yes"
exeNotFoud:
SectionEnd
Section -"Download"
${If} $skipDownload == "no"
DetailPrint "Estableciendo URL de descarga."
; La URL de descarga no se puede establecer via constante.
StrCpy $urlDownloadRelease "https://github.com/hucrea/AMPc/releases/download/$versionAvailableAMPc/ampc-$versionAvailableAMPc.exe"
DetailPrint "URL de descarga establecida:$\n$\n$urlDownloadRelease"
DetailPrint "Descargando versión $versionAvailableAMPc"
; Descarga la ultima version disponbile.
NScurl::http get "$urlDownloadRelease" "${THE_UPDATE_EXE}" /INSIST /CANCEL /RESUME /END
Pop $0
; NScurl devuelve OK solo si todo sale bien.
${IfNot} $0 == "OK"
DetailPrint "La descarga no se pudo completar."
MessageBox MB_OK|MB_ICONEXCLAMATION "Ocurrio un error al intentar descargar la última versión. Reintenta más tarde o visita ${URL_UPDATE} para descargar la última versión disponible."
DetailPrint "Detalles del error: $0"
DetailPrint "Presiona Cancelar para cerrar."
Abort ; Aborta el proceso.
${EndIf}
DetailPrint "Última versión ($versionAvailableAMPc) descargada."
${Else}
DetailPrint "Descarga omitida"
${EndIf}
SectionEnd
Section -"CheckIntegrity"
DetailPrint "Comprobando integridad de la descarga."
ClearErrors
Crypto::HashFile "SHA2" "${THE_UPDATE_EXE}"
Pop $R0
${If} ${Errors}
DetailPrint "No se pudo obtener el HASH del archivo descargado."
DetailPrint "Detalles del error: $R0"
MessageBox MB_OK|MB_ICONEXCLAMATION "No se pudo obtener el HASH para el archivo descargado. Proceso abortado."
DetailPrint "Presiona Cancelar para cerrar."
Abort ; Aborta el proceso.
${EndIf}
StrCmp $R0 $remoteHashUpdate isSameHash notSameHash
notSameHash:
DetailPrint "Hash esperado: $remoteHashUpdate"
DetailPrint "Hash obtenido: $R0"
DetailPrint "Resultado: hash NO coincide."
MessageBox MB_OK|MB_ICONEXCLAMATION "El hash de la descarga no coincide con el valor obtenido desde update.ini$\n$\nVuelve a ejecutar el actualizador y, si el problema persiste, visita la página de soporte."
DetailPrint "Presiona Cancelar para cerrar."
Abort ; Aborta el proceso.
isSameHash:
DetailPrint "Hash esperado: $remoteHashUpdate"
DetailPrint "Hash obtenido: $R0"
DetailPrint "Resultado: hash coincide."
DetailPrint "Finalizando asistente."
SectionEnd