diff --git a/pkg/windows/installer/Salt-Minion-Setup.nsi b/pkg/windows/installer/Salt-Minion-Setup.nsi index 25eeb51c21..7879c4db22 100644 --- a/pkg/windows/installer/Salt-Minion-Setup.nsi +++ b/pkg/windows/installer/Salt-Minion-Setup.nsi @@ -546,6 +546,204 @@ Function Trim FunctionEnd +;------------------------------------------------------------------------------ +; StrStr Function +; - 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 ; $R3=strlen(substring) + Push $R4 ; $R4=count + Push $R5 ; $R5=tmp + StrLen $R3 $R1 ; Get the length of the Search String + StrCpy $R4 0 ; Set the counter to 0 + + loop: + StrCpy $R5 $R2 $R3 $R4 ; Create a moving window of the string that is + ; the size of the length of the search string + StrCmp $R5 $R1 done ; Is the contents of the window the same as + ; search string, then done + StrCmp $R5 "" done ; Is the window empty, then done + IntOp $R4 $R4 + 1 ; Shift the windows one character + Goto loop ; Repeat + + 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." + + +;------------------------------------------------------------------------------ +; AddToPath Function +; - Adds item to Path for All Users +; - Overcomes NSIS ReadRegStr limitation of 1024 characters by using Native +; Windows Commands +; +; Usage: +; Push "C:\path\to\add" +; Call AddToPath +;------------------------------------------------------------------------------ +Function AddToPath + + Exch $0 + Push $1 + Push $2 + Push $3 + Push $4 + + Messagebox MB_OK "0: $0$\n1: $1$\n2: $2$\n3: $3$\n4: $4" + + ; $4 = RegOpenKey(HKEY_CURRENT_USER, "Environment", &$3) + System::Call "advapi32::RegOpenKey(i 0x80000002, t'SYSTEM\CurrentControlSet\Control\Session Manager\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)) + System::Call "advapi32::RegQueryValueEx(i $3, t'PATH', i 0, i 0, t.r1, *i ${NSIS_MAX_STRLEN} r2) i.r4" + ; RegCloseKey($3) + System::Call "advapi32::RegCloseKey(i $3)" + + Messagebox MB_OK "0: $0$\n1: $1$\n2: $2$\n3: $3$\n4: $4" + + 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" + + ; We can use the NSIS command here. Only 'ReadRegStr' is affected + ; WriteRegExpandStr ${Environ} "PATH" $0 + + ; Broadcast registry change to open programs + SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 + + done: + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + +FunctionEnd + + +;------------------------------------------------------------------------------ +; RemoveFromPath Function +; - Removes item from Path for All Users +; - Overcomes NSIS ReadRegStr limitation of 1024 characters by using Native +; Windows Commands +; +; Usage: +; Push "C:\path\to\add" +; Call RemoveFromPath +;------------------------------------------------------------------------------ +Function un.RemoveFromPath + + Exch $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + + ; $4 = RegOpenKey(HKEY_CURRENT_USER, "Environment", &$3) + System::Call "advapi32::RegOpenKey(i 0x80000002, t'SYSTEM\CurrentControlSet\Control\Session Manager\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)) + System::Call "advapi32::RegQueryValueEx(i $3, t'PATH', i 0, i 0, t.r1, *i ${NSIS_MAX_STRLEN} r2) i.r4" + ; RegCloseKey($3) + System::Call "advapi32::RegCloseKey(i $3)" + + 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 + + +############################################################################### +# Specialty Functions +############################################################################### + + Function getMinionConfig confFind: