From c0e0d98702c6180393ad695d460683b789e93003 Mon Sep 17 00:00:00 2001 From: Hugo Montero Date: Wed, 10 Apr 2024 08:57:55 -0600 Subject: [PATCH] add windows installer --- .npmignore | 1 + installer/windows/.gitignore | 5 + installer/windows/GetWindowsVersion.nsh | 145 ++++ installer/windows/ParticleCLISetup.nsi | 181 +++++ .../windows/Plugins/amd64-unicode/INetC.dll | Bin 0 -> 27136 bytes .../windows/Plugins/amd64-unicode/nsJSON.dll | Bin 0 -> 39936 bytes installer/windows/Plugins/x86-ansi/INetC.dll | Bin 0 -> 22016 bytes installer/windows/Plugins/x86-ansi/nsJSON.dll | Bin 0 -> 28672 bytes installer/windows/README.md | 25 + .../windows/Screenshots/CLI installer 1.PNG | Bin 0 -> 17636 bytes .../windows/Screenshots/CLI installer 2.PNG | Bin 0 -> 18566 bytes installer/windows/assets/particle.bmp | Bin 0 -> 52574 bytes installer/windows/assets/particle.ico | Bin 0 -> 82214 bytes installer/windows/build_all.cmd | 24 + installer/windows/licenses.txt | 712 ++++++++++++++++++ installer/windows/utils.nsh | 172 +++++ installer/windows/welcome.txt | 4 + scripts/generate-win-installer.js | 44 ++ 18 files changed, 1313 insertions(+) create mode 100644 installer/windows/.gitignore create mode 100644 installer/windows/GetWindowsVersion.nsh create mode 100644 installer/windows/ParticleCLISetup.nsi create mode 100644 installer/windows/Plugins/amd64-unicode/INetC.dll create mode 100644 installer/windows/Plugins/amd64-unicode/nsJSON.dll create mode 100644 installer/windows/Plugins/x86-ansi/INetC.dll create mode 100644 installer/windows/Plugins/x86-ansi/nsJSON.dll create mode 100644 installer/windows/README.md create mode 100644 installer/windows/Screenshots/CLI installer 1.PNG create mode 100644 installer/windows/Screenshots/CLI installer 2.PNG create mode 100644 installer/windows/assets/particle.bmp create mode 100644 installer/windows/assets/particle.ico create mode 100644 installer/windows/build_all.cmd create mode 100644 installer/windows/licenses.txt create mode 100644 installer/windows/utils.nsh create mode 100644 installer/windows/welcome.txt create mode 100644 scripts/generate-win-installer.js diff --git a/.npmignore b/.npmignore index 9c172097b..15ae52a14 100644 --- a/.npmignore +++ b/.npmignore @@ -12,3 +12,4 @@ # but don't forget to also ignore us .DS_Store* .env +installer/**/* diff --git a/installer/windows/.gitignore b/installer/windows/.gitignore new file mode 100644 index 000000000..2485d0b5a --- /dev/null +++ b/installer/windows/.gitignore @@ -0,0 +1,5 @@ +*.swp +ParticleCLISetup.exe +Thumbs.db +*.p12 +ParticleDriversSetup.exe diff --git a/installer/windows/GetWindowsVersion.nsh b/installer/windows/GetWindowsVersion.nsh new file mode 100644 index 000000000..92cc65958 --- /dev/null +++ b/installer/windows/GetWindowsVersion.nsh @@ -0,0 +1,145 @@ +; GetWindowsVersion 4.1.1 (2015-06-22) +; http://nsis.sourceforge.net/Get_Windows_version +; +; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/ +; Update by Joost Verburg +; Update (Macro, Define, Windows 7 detection) - John T. Haller of PortableApps.com - 2008-01-07 +; Update (Windows 8 detection) - Marek Mizanin (Zanir) - 2013-02-07 +; Update (Windows 8.1 detection) - John T. Haller of PortableApps.com - 2014-04-04 +; Update (Windows 10 TP detection) - John T. Haller of PortableApps.com - 2014-10-01 +; Update (Windows 10 TP4 detection, and added include guards) - Kairu - 2015-06-22 +; +; Usage: ${GetWindowsVersion} $R0 +; +; $R0 contains: 95, 98, ME, NT x.x, 2000, XP, 2003, Vista, 7, 8, 8.1, 10.0 or '' (for unknown) + +!ifndef __GET_WINDOWS_VERSION_NSH +!define __GET_WINDOWS_VERSION_NSH + +!macro DefineGetWindowsVersion un +Function ${un}GetWindowsVersion + + Push $R0 + Push $R1 + Push $R2 + Push $R3 + + ClearErrors + + ; check if Windows NT family + ReadRegStr $R0 HKLM \ + "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion + + IfErrors 0 lbl_winnt + + ; we are not NT + ReadRegStr $R0 HKLM \ + "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber + + StrCpy $R1 $R0 1 + StrCmp $R1 '4' 0 lbl_error + + StrCpy $R1 $R0 3 + + StrCmp $R1 '4.0' lbl_win32_95 + StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98 + + lbl_win32_95: + StrCpy $R0 '95' + Goto lbl_done + + lbl_win32_98: + StrCpy $R0 '98' + Goto lbl_done + + lbl_win32_ME: + StrCpy $R0 'ME' + Goto lbl_done + + lbl_winnt: + + StrCpy $R1 $R0 1 + + StrCmp $R1 '3' lbl_winnt_x + StrCmp $R1 '4' lbl_winnt_x + + StrCpy $R1 $R0 3 + + StrCmp $R1 '5.0' lbl_winnt_2000 + StrCmp $R1 '5.1' lbl_winnt_XP + StrCmp $R1 '5.2' lbl_winnt_2003 + StrCmp $R1 '6.0' lbl_winnt_vista + StrCmp $R1 '6.1' lbl_winnt_7 + StrCmp $R1 '6.2' lbl_winnt_8 + + Goto lbl_winnt_latest + + lbl_winnt_x: + StrCpy $R0 "NT $R0" 6 + Goto lbl_done + + lbl_winnt_2000: + Strcpy $R0 '2000' + Goto lbl_done + + lbl_winnt_XP: + Strcpy $R0 'XP' + Goto lbl_done + + lbl_winnt_2003: + Strcpy $R0 '2003' + Goto lbl_done + + lbl_winnt_vista: + Strcpy $R0 'Vista' + Goto lbl_done + + lbl_winnt_7: + Strcpy $R0 '7' + Goto lbl_done + + lbl_winnt_8: + Strcpy $R0 '8' + Goto lbl_done + + lbl_winnt_81: + Strcpy $R0 '8.1' + Goto lbl_done + + lbl_winnt_latest: + ReadRegStr $R2 HKLM \ + "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentMajorVersionNumber + ReadRegStr $R3 HKLM \ + "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentMinorVersionNumber + StrCpy $R0 "$R2.$R3" + StrCmp $R0 "" lbl_winnt_81 + Goto lbl_done + + lbl_error: + Strcpy $R0 '' + + lbl_done: + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 + +FunctionEnd +!macroend + +; Make GetWindowsVersion available for installer and uninstaller +!insertmacro DefineGetWindowsVersion "" +!insertmacro DefineGetWindowsVersion "un." + +!macro GetWindowsVersion OUTPUT_VALUE + !ifdef __UNINSTALL__ + Call un.GetWindowsVersion + !else + Call GetWindowsVersion + !endif + Pop `${OUTPUT_VALUE}` +!macroend + +!define GetWindowsVersion '!insertmacro "GetWindowsVersion"' + +!endif diff --git a/installer/windows/ParticleCLISetup.nsi b/installer/windows/ParticleCLISetup.nsi new file mode 100644 index 000000000..717992141 --- /dev/null +++ b/installer/windows/ParticleCLISetup.nsi @@ -0,0 +1,181 @@ +; Particle CLI installer script + +;-------------------------------- +; General + +; Name and file +!define PRODUCT_NAME "Particle CLI" +!define SHORT_NAME "ParticleCLI" +Name "${PRODUCT_NAME}" +OutFile "ParticleCLISetup.exe" +!define COMPANY_NAME "Particle Industries, Inc" +!define MUI_ICON "assets\particle.ico" + +; Installation directory +InstallDir "$LOCALAPPDATA\particle" +!define BINDIR "$INSTDIR\bin" + + +; CLI Executable +!define EXE "particle.exe" + +; OpenSSL installer +!addplugindir /x86-ansi Plugins/x86-ansi +!define OpenSSLFile "Win32OpenSSL_Light-1_1_0d.exe" + +; Don't request admin privileges +RequestExecutionLevel user + +; Show command line with details of the installation +ShowInstDetails show + +; Registry Entry for environment +; All users: +;!define Environ 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' +; Current user only: +!define Environ 'HKCU "Environment"' + +; Registry entry for uninstaller +!define UNINSTALL_REG 'HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SHORT_NAME}"' + +; Text to display when the installation is done +CompletedText 'Run "particle login" in the command line to start using the Particle CLI' + + +;-------------------------------- +; Dependencies + +; Add JSON and download plugins +; Modern UI +!include "MUI2.nsh" +; Architecture detection +!include "x64.nsh" +!include "TextFunc.nsh" +!include "LogicLib.nsh" + +!include "utils.nsh" + +; Don't show a certain operation in the details +!macro EchoOff + SetDetailsPrint none +!macroend +!macro EchoOn + SetDetailsPrint both +!macroend +!define EchoOff "!insertmacro EchoOff" +!define EchoOn "!insertmacro EchoOn" + +;-------------------------------- +; Installer pages + +; Welcome page +!define MUI_WELCOMEFINISHPAGE_BITMAP "assets\particle.bmp" +!define MUI_WELCOMEPAGE_TITLE "Install the ${PRODUCT_NAME}" +!define /file MUI_WELCOMEPAGE_TEXT "welcome.txt" + +!insertmacro MUI_PAGE_WELCOME + +; Open source licenses +!insertmacro MUI_PAGE_LICENSE "licenses.txt" + +; Select what to install +InstType "Full" +!insertmacro MUI_PAGE_COMPONENTS + +; Installation details page +!insertmacro MUI_PAGE_INSTFILES + +; Finish page +!define MUI_FINISHPAGE_SHOWREADME "" +!define MUI_FINISHPAGE_SHOWREADME_TEXT "Enable automatic updates" +!define MUI_FINISHPAGE_SHOWREADME_FUNCTION EnableAutoUpdates +!insertmacro MUI_PAGE_FINISH + +; Uninstall confirm page +!insertmacro MUI_UNPAGE_CONFIRM +; Uninstallation details page +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_LANGUAGE "English" + +;-------------------------------- +; Installer Sections + +Section "CLI" CLI_SECTION + SectionIn 1 3 + SetOutPath $INSTDIR + Call CopyExecutables + Call DisableAutoUpdates + Call AddCLIToPath +SectionEnd + +Section "OpenSSL (keys tools)" OPENSSL_SECTION + SectionIn 1 3 + Call InstallOpenSSL +SectionEnd + +Section "-Create uninstaller" + WriteRegStr ${UNINSTALL_REG} "DisplayName" "${PRODUCT_NAME}" + WriteRegStr ${UNINSTALL_REG} "Publisher" "${COMPANY_NAME}" + WriteRegStr ${UNINSTALL_REG} "UninstallString" '"$INSTDIR\Uninstall.exe"' + WriteRegDWORD ${UNINSTALL_REG} "NoModify" 1 + WriteRegDWORD ${UNINSTALL_REG} "NoRepair" 1 + + WriteUninstaller "$INSTDIR\Uninstall.exe" + DetailPrint "" +SectionEnd + + +LangString DESC_CLI ${LANG_ENGLISH} "Particle command-line interface. Add to PATH. Run as particle in the command line" +LangString DESC_OPENSSL ${LANG_ENGLISH} "Tools for generating new keys for devices. Needs admin priviledges." + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${CLI_SECTION} $(DESC_CLI) + !insertmacro MUI_DESCRIPTION_TEXT ${OPENSSL_SECTION} $(DESC_OPENSSL) +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +;-------------------------------- +; Uninstaller Sections + +Section "Uninstall" + RMDir /r /REBOOTOK "$INSTDIR" + + DeleteRegKey ${UNINSTALL_REG} + + Push "${BINDIR}" + Call un.RemoveFromPath +SectionEnd + + +Function CopyExecutables + CreateDirectory "${BINDIR}" + File "/oname=${BINDIR}\${EXE}" "..\..\build\particle-cli-win-x64.exe" +FunctionEnd + + +Function EnableAutoUpdates + ; CLI will install Node and all modules needed + nsExec::ExecToLog "${BINDIR}\${EXE} autoupdate --enable" +FunctionEnd + +Function DisableAutoUpdates + ; CLI will install Node and all modules needed + nsExec::ExecToLog "${BINDIR}\${EXE} autoupdate --disable" +FunctionEnd + + +Function InstallOpenSSL + DetailPrint "Downloading OpenSSL" + File "/oname=$TEMP/${OpenSSLFile}" ".\bin\${OpenSSLFile}" + DetailPrint "Installing OpenSSL" + nsExec::ExecToLog "$TEMP/${OpenSSLFile} /verysilent" + DetailPrint "Adding OpenSSL to path" + Push "C:\OpenSSL-Win32\bin" + Call AddToPath +FunctionEnd + +Function AddCLIToPath + DetailPrint "Adding CLI to path" + Push "${BINDIR}" + Call AddToPath +FunctionEnd + diff --git a/installer/windows/Plugins/amd64-unicode/INetC.dll b/installer/windows/Plugins/amd64-unicode/INetC.dll new file mode 100644 index 0000000000000000000000000000000000000000..fad7ad42e2daa0d74110a77acfbd5c73768e934f GIT binary patch literal 27136 zcmeHw3w%`7wfCMR2SQ*tARJUMGH4Ji0)YS~43Qi-17~!A0D+*Q5Rwd}gd|PQ@UT8Y zC#fXIX|>n3`e|Ejz16l}Yi)}W&?W>(c!!{Xf;Hfy6GjCeh2Vp8|7-6vnFOg-``z#N zyWg*aGkfo~*IIk6wbx$zaZa|gZn>YuGsY6|wJgT!kkTiM|9<&T8>;&b-PD);sn_0N zbq?R&VL2;`DqLmdrOV6nR=M)?N=ix%*Rn!ad7#8qRN~U+%y+FSEhrr0bS9q1^yL6u2WD8>>Ap)ys>@<>p`GaPgZ4ocVYm8C2)rqK<-;QsWPZr#0OnF6lK44te7G#p}U5am) zPZsdH6#t$5e`taJqOHnklTR-YxtHv8mz}oR=}9|1Z>N3jQ8n03Q|)w`ozAw?MRrcfZ}f zpl0k2yZ%u-ecDd9*y%nyZL`z&?ex5zCM^=2Ty{FfPH(W&96K$r)75rbWv7qY=`(g( zZ>M|gw9QUGwo`VqXs@50USX#r?R0{jYIZu$PM6tfiJkgw`R}vSs68IC>z}gIdOJO2 zrzh?76FcpDi=e#9PAA#vjdr@!PFLIM{dW3GJKbofyX^EWJ3ViwS0awmC)G|xDfYX7 zl_AcSvOEO#B38nd+f`qLyV!76(MjlHBbkSl<6kD=1?*b8=4zJ4#Uzu^9jII;k0(QB+)5lDDdGvTHbRY%KG0tU{ZA_Yz}c!Lbx_ z8Q_x7R(8sFAv_;gC2Vz<`W29dv@V1W#HSp&e0+<5MRFFgRY*%&0C}nx97u(-!5bS`{LIWDDT z$Q2-6gSu$XP3@xBcfhfbTcikBC3X$TPuxhuV(=@3q(ZM{98P)(I~ZK%5^$iNAx!!R z`;fF`6)Kl;SprB!eF-mjwLuI{wkt*N6oFRw&{)V)+D#_ThV#t>P6hNUg(UWJ1MsLl zOCXhyLGUNN${=S~ZArd0Xe$qGQZM9lD;EJv^bXZmfT9?6qG!m5C&QCd;k{jRLMnkz zd|bA#x{xD3cG(CtItuU|ZkK7SxY%fX#i$X#3?=IIS!`M-9+g*KP+kT($?~!BHkHvo z)@>Bg$PK`|MnjWmKTpK?qmj1&kd@rVcS-C*Dj%m` z4xAO7l58nH7h-nhPyJ3dDB^w;^?y7NDv-In$egc|H(&Q*en}(V)Tzj-Pfa~#&twfm1&)Fz}_

S*D?khWBr;t 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 aU_$N^{lp#lvHt0m@GK$x`}6;)1^yc=lV!^Q literal 0 HcmV?d00001 diff --git a/installer/windows/Plugins/amd64-unicode/nsJSON.dll b/installer/windows/Plugins/amd64-unicode/nsJSON.dll new file mode 100644 index 0000000000000000000000000000000000000000..4556b72f8f94b632249e10c08585f7901aa2c9a5 GIT binary patch literal 39936 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ðW2GbL*x>joG;o*WKF1!%BaWXqo^U+v zc;0c`@dsF=vyOAn!^uvyv%q<^^LnSw>2u!bEO)MSu62f;QD>*~Zs&c@JlxLf ndP}|4-dgVt@9o~Zyx;f!5SsinH2HYix%}U{=KZT*LlXGEWT(rI literal 0 HcmV?d00001 diff --git a/installer/windows/Plugins/x86-ansi/nsJSON.dll b/installer/windows/Plugins/x86-ansi/nsJSON.dll new file mode 100644 index 0000000000000000000000000000000000000000..2ed8b28270357dbf55c020d5262208e790acaddf GIT binary patch literal 28672 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 literal 0 HcmV?d00001 diff --git a/installer/windows/README.md b/installer/windows/README.md new file mode 100644 index 000000000..f723201f0 --- /dev/null +++ b/installer/windows/README.md @@ -0,0 +1,25 @@ +# Particle CLI Installer + +Downloads and installs the latest CLI wrapper from binaries.particle.io, +executes it a first time to install Node.js and the particle-cli module. + +*This installer is based on the CLI installer by Daniel Sullivan. Thanks!* + +## Releasing the installer + +- Concourse builds and signs the executable on each git push +- Download the dev version of the installer from and +- After testing those installers, open the Concourse `release-installer` job and click the + to trigger it. It will copy the files to and + +## Compile installer + +- Download and install Nullsoft Installer System (NSIS) version 3 +- Run `MakeNSISW ParticleCLISetup.nsi` to get `ParticleCLISetup.exe` + +## Included components + +The latest [windows-device-drivers](https://github.com/particle-iot/windows-device-drivers) are downloaded when building the CLI installer. + +The Device Firmware Update (DFU) tools are from + +See [licences.txt](/installer/windows/licenses.txt) for more info on the open source licenses. diff --git a/installer/windows/Screenshots/CLI installer 1.PNG b/installer/windows/Screenshots/CLI installer 1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..c4d938ec5d285428689f67b319d3aad74b845917 GIT binary patch literal 17636 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 K7GHVr{Qm)*7}7-m literal 0 HcmV?d00001 diff --git a/installer/windows/assets/particle.bmp b/installer/windows/assets/particle.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9cc3636d0bddf960c1b53a5dd194ac30e4a17112 GIT binary patch literal 52574 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 + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +================================================ + +dfu-util - Device Firmware Upgrade Utilities + +Copyright 2010-2016 Stefan Schmidt & Tormod Volden + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +================================================ + +OpenSSL + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2016 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ diff --git a/installer/windows/utils.nsh b/installer/windows/utils.nsh new file mode 100644 index 000000000..02689ce58 --- /dev/null +++ b/installer/windows/utils.nsh @@ -0,0 +1,172 @@ +; Make the stack empty +!macro ClearStack + ${Do} + Pop $0 + IfErrors send + ${Loop} +send: +!macroend + +!define ClearStack "!insertmacro ClearStack" + +; AddToPath - Appends dir to PATH +; (does not work on Win9x/ME) +; +; Usage: +; Push "dir" +; Call AddToPath + +Function AddToPath + Exch $0 + Push $1 + Push $2 + Push $3 + Push $4 + + ; NSIS ReadRegStr returns empty string on string overflow + ; Native calls are used here to check actual length of PATH + + ; $4 = RegOpenKey(HKEY_CURRENT_USER, "Environment", &$3) + System::Call "advapi32::RegOpenKey(i 0x80000001, t'Environment', *i.r3) i.r4" + IntCmp $4 0 0 done done + ; $4 = RegQueryValueEx($3, "PATH", (DWORD*)0, (DWORD*)0, &$1, ($2=NSIS_MAX_STRLEN, &$2)) + ; RegCloseKey($3) + System::Call "advapi32::RegQueryValueEx(i $3, t'PATH', i 0, i 0, t.r1, *i ${NSIS_MAX_STRLEN} r2) i.r4" + System::Call "advapi32::RegCloseKey(i $3)" + + IntCmp $4 234 0 +4 +4 ; $4 == ERROR_MORE_DATA + DetailPrint "AddToPath: original length $2 > ${NSIS_MAX_STRLEN}" + MessageBox MB_OK "PATH not updated, original length $2 > ${NSIS_MAX_STRLEN}" + Goto done + + IntCmp $4 0 +5 ; $4 != NO_ERROR + IntCmp $4 2 +3 ; $4 != ERROR_FILE_NOT_FOUND + DetailPrint "AddToPath: unexpected error code $4" + Goto done + StrCpy $1 "" + + ; Check if already in PATH + Push "$1;" + Push "$0;" + Call StrStr + Pop $2 + StrCmp $2 "" 0 done + Push "$1;" + Push "$0\;" + Call StrStr + Pop $2 + StrCmp $2 "" 0 done + + ; Prevent NSIS string overflow + StrLen $2 $0 + StrLen $3 $1 + IntOp $2 $2 + $3 + IntOp $2 $2 + 2 ; $2 = strlen(dir) + strlen(PATH) + sizeof(";") + IntCmp $2 ${NSIS_MAX_STRLEN} +4 +4 0 + DetailPrint "AddToPath: new length $2 > ${NSIS_MAX_STRLEN}" + MessageBox MB_OK "PATH not updated, new length $2 > ${NSIS_MAX_STRLEN}." + Goto done + + ; Append dir to PATH + DetailPrint "Add to PATH: $0" + StrCpy $2 $1 1 -1 + StrCmp $2 ";" 0 +2 + StrCpy $1 $1 -1 ; remove trailing ';' + StrCmp $1 "" +2 ; no leading ';' + StrCpy $0 "$1;$0" + WriteRegExpandStr ${Environ} "PATH" $0 + SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 + + done: + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +; RemoveFromPath - Removes dir from PATH +; +; Usage: +; Push "dir" +; Call RemoveFromPath + +Function un.RemoveFromPath + Exch $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + + ReadRegStr $1 ${Environ} "PATH" + StrCpy $5 $1 1 -1 + StrCmp $5 ";" +2 + StrCpy $1 "$1;" ; ensure trailing ';' + Push $1 + Push "$0;" + Call un.StrStr + Pop $2 ; pos of our dir + StrCmp $2 "" done + + DetailPrint "Remove from PATH: $0" + StrLen $3 "$0;" + StrLen $4 $2 + StrCpy $5 $1 -$4 ; $5 is now the part before the path to remove + StrCpy $6 $2 "" $3 ; $6 is now the part after the path to remove + StrCpy $3 "$5$6" + StrCpy $5 $3 1 -1 + StrCmp $5 ";" 0 +2 + StrCpy $3 $3 -1 ; remove trailing ';' + WriteRegExpandStr ${Environ} "PATH" $3 + SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 + + done: + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +; StrStr - find substring in a string +; +; Usage: +; Push "this is some string" +; Push "some" +; Call StrStr +; Pop $0 ; "some string" + +!macro StrStr un + Function ${un}StrStr + Exch $R1 ; $R1=substring, stack=[old$R1,string,...] + Exch ; stack=[string,old$R1,...] + Exch $R2 ; $R2=string, stack=[old$R2,old$R1,...] + Push $R3 + Push $R4 + Push $R5 + StrLen $R3 $R1 + StrCpy $R4 0 + ; $R1=substring, $R2=string, $R3=strlen(substring) + ; $R4=count, $R5=tmp + loop: + StrCpy $R5 $R2 $R3 $R4 + StrCmp $R5 $R1 done + StrCmp $R5 "" done + IntOp $R4 $R4 + 1 + Goto loop + done: + StrCpy $R1 $R2 "" $R4 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Exch $R1 ; $R1=old$R1, stack=[result,...] + FunctionEnd +!macroend +!insertmacro StrStr "" +!insertmacro StrStr "un." + diff --git a/installer/windows/welcome.txt b/installer/windows/welcome.txt new file mode 100644 index 000000000..a97c5d8a3 --- /dev/null +++ b/installer/windows/welcome.txt @@ -0,0 +1,4 @@ +This installer downloads the Particle Command Line Interface (CLI) and its dependencies. + +After this initial installation the CLI will keep itself up to date by installing new versions as they are released. + diff --git a/scripts/generate-win-installer.js b/scripts/generate-win-installer.js new file mode 100644 index 000000000..ae5ee22c0 --- /dev/null +++ b/scripts/generate-win-installer.js @@ -0,0 +1,44 @@ +const fs = require('fs-extra'); +const path = require('path'); +const https = require('https'); +const execa = require('execa'); +const openSSLDownloadUrl = 'https://binaries.particle.io/cli/installer/windows/Win32OpenSSL_Light-1_1_0d.exe'; +const installerPath = path.join(__dirname, '..', 'installer', 'windows', 'bin', 'Win32OpenSSL_Light-1_1_0d.exe'); + +(async () => { + await fs.ensureDir(path.dirname(installerPath)); + await downloadOpenSSL(openSSLDownloadUrl, installerPath); + console.log('Downloaded OpenSSL'); + // generate ParticleCLISetup installer + const args = [ + './installer/windows/ParticleCLISetup.nsi' + ]; + await execa('makensis', args, { stdio: 'inherit' }); + await fs.move('./installer/windows/ParticleCLISetup.exe', './build/ParticleCLISetup.exe', { overwrite: true }); + console.log('Generated ParticleCLISetup installer'); + console.log('Signing Windows Installers'); + await execa('node', ['./scripts/win-sign.js', 'ParticleCLISetup'], { stdio: 'inherit' }); + console.log('done'); +})(); + + +function downloadOpenSSL(url, dest) { + return new Promise((resolve, reject) => { + const file = fs.createWriteStream(dest); + https.get(url, (response) => { + if (response.statusCode !== 200) { + reject(new Error(`Failed to download file: Status Code ${response.statusCode}`)); + return; + } + response.pipe(file); + file.on('finish', () => { + file.close(); + resolve('Download Completed'); + }); + }).on('error', (err) => { + // Handle errors + fs.unlink(dest, () => {}); + reject(err); + }); + }); +}