; webui4frpc Windows 安装程序 (NSIS) ; ; 由 scripts/build_installers.sh 调用,需在命令行传入: ; -DVERSION=0.1.0 -DARCH=amd64 -DBINSRC= -DOUTFILE=<输出 exe> !include "MUI2.nsh" !include "LogicLib.nsh" !include "StrFunc.nsh" ; Used to JSON-escape the free-text fields written into config.json below. ${Using:StrFunc} StrRep !ifndef VERSION !define VERSION "0.0.0" !endif !ifndef ARCH !define ARCH "amd64" !endif Name "webui4frpc ${VERSION}" OutFile "${OUTFILE}" Unicode true RequestExecutionLevel admin InstallDir "$PROGRAMFILES64\webui4frpc" InstallDirRegKey HKLM "Software\webui4frpc" "InstallDir" VIProductVersion "${VERSION}.0" VIAddVersionKey "ProductName" "webui4frpc" VIAddVersionKey "FileDescription" "Visual frpc controller with token-ring cluster" VIAddVersionKey "FileVersion" "${VERSION}" VIAddVersionKey "ProductVersion" "${VERSION}" VIAddVersionKey "LegalCopyright" "JianFeeeee" !define MUI_ABORTWARNING !insertmacro MUI_PAGE_LICENSE "LICENSE.txt" !insertmacro MUI_PAGE_DIRECTORY Page custom ConfigPage ConfigPageLeave !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_LANGUAGE "SimpChinese" !insertmacro MUI_LANGUAGE "English" Var Dialog Var LblAddr Var TxtAddr Var LblUser Var TxtUser Var LblPass Var TxtPass Var CfgAddr Var CfgUser Var CfgPass Var EscAddr Var EscUser Var EscDir Function .onInit StrCpy $CfgAddr "0.0.0.0:7500" StrCpy $CfgUser "admin" StrCpy $CfgPass "admin" FunctionEnd Function ConfigPage !insertmacro MUI_HEADER_TEXT "服务配置" "设置监听地址与登录凭据" nsDialogs::Create 1018 Pop $Dialog ${If} $Dialog == error Abort ${EndIf} ${NSD_CreateLabel} 0 0 100% 12u "监听地址 (host:port):" Pop $LblAddr ${NSD_CreateText} 0 14u 100% 12u "$CfgAddr" Pop $TxtAddr ${NSD_CreateLabel} 0 34u 100% 12u "管理员用户名:" Pop $LblUser ${NSD_CreateText} 0 48u 100% 12u "$CfgUser" Pop $TxtUser ${NSD_CreateLabel} 0 68u 100% 12u "管理员密码(请勿沿用默认值):" Pop $LblPass ${NSD_CreatePassword} 0 82u 100% 12u "$CfgPass" Pop $TxtPass nsDialogs::Show FunctionEnd Function ConfigPageLeave ${NSD_GetText} $TxtAddr $CfgAddr ${NSD_GetText} $TxtUser $CfgUser ${NSD_GetText} $TxtPass $CfgPass FunctionEnd Section "webui4frpc" SecMain SetOutPath "$INSTDIR" File "/oname=webui4frpc.exe" "${BINSRC}" File "README.md" File "LICENSE.txt" CreateDirectory "$INSTDIR\data" ; ---- 启动配置 ---- ; 口令写进独立文件、由 config.json 用 "file:" 引用:既不出现在启动脚本的 ; 命令行上(任务管理器 / wmic 可见),也不需要做 JSON 转义。 ${StrRep} $EscDir $INSTDIR "\" "\\" ${StrRep} $EscAddr $CfgAddr "\" "\\" ${StrRep} $EscAddr $EscAddr '$\"' '\"' ${StrRep} $EscUser $CfgUser "\" "\\" ${StrRep} $EscUser $EscUser '$\"' '\"' FileOpen $1 "$INSTDIR\secret-password.txt" w FileWrite $1 "$CfgPass$\r$\n" FileClose $1 ; 口令文件仅 SYSTEM / Administrators 可读(Program Files 默认 Users 可读) nsExec::ExecToLog 'icacls "$INSTDIR\secret-password.txt" /inheritance:r /grant:r *S-1-5-18:F *S-1-5-32-544:F' FileOpen $2 "$INSTDIR\data\config.json" w FileWrite $2 "{$\r$\n" FileWrite $2 ' "addr": "$EscAddr",$\r$\n' FileWrite $2 ' "user": "$EscUser",$\r$\n' FileWrite $2 ' "password": "file:$EscDir\\secret-password.txt",$\r$\n' FileWrite $2 ' "workdir": "data"$\r$\n' FileWrite $2 "}$\r$\n" FileClose $2 ; 启动脚本:只传 -config,不传任何凭据 FileOpen $0 "$INSTDIR\start-webui4frpc.cmd" w FileWrite $0 "@echo off$\r$\n" FileWrite $0 "rem webui4frpc 启动脚本(由安装程序生成)$\r$\n" FileWrite $0 "rem 凭据在 data\config.json(口令来自 secret-password.txt),不经过命令行。$\r$\n" FileWrite $0 "cd /d %~dp0$\r$\n" FileWrite $0 'webui4frpc.exe -config "%~dp0data\config.json"$\r$\n' FileClose $0 WriteRegStr HKLM "Software\webui4frpc" "InstallDir" "$INSTDIR" WriteRegStr HKLM "Software\webui4frpc" "Version" "${VERSION}" ; 添加/删除程序 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \ "DisplayName" "webui4frpc ${VERSION}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \ "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \ "DisplayVersion" "${VERSION}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \ "Publisher" "JianFeeeee" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \ "URLInfoAbout" "https://gitcode.com/JianFeeeee/webui4frpc" WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \ "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \ "NoRepair" 1 WriteUninstaller "$INSTDIR\uninstall.exe" ; 开始菜单 CreateDirectory "$SMPROGRAMS\webui4frpc" CreateShortcut "$SMPROGRAMS\webui4frpc\webui4frpc.lnk" \ "$INSTDIR\start-webui4frpc.cmd" "" "$INSTDIR\webui4frpc.exe" 0 CreateShortcut "$SMPROGRAMS\webui4frpc\打开管理界面.lnk" \ "http://127.0.0.1:7500" CreateShortcut "$SMPROGRAMS\webui4frpc\卸载 webui4frpc.lnk" "$INSTDIR\uninstall.exe" ; 防火墙放行(失败不阻断安装) nsExec::ExecToLog 'netsh advfirewall firewall add rule name="webui4frpc" \ dir=in action=allow program="$INSTDIR\webui4frpc.exe" enable=yes profile=any' SectionEnd Section "Uninstall" nsExec::ExecToLog 'netsh advfirewall firewall delete rule name="webui4frpc"' Delete "$INSTDIR\webui4frpc.exe" Delete "$INSTDIR\start-webui4frpc.cmd" Delete "$INSTDIR\secret-password.txt" Delete "$INSTDIR\data\config.json" Delete "$INSTDIR\README.md" Delete "$INSTDIR\LICENSE.txt" Delete "$INSTDIR\uninstall.exe" ; data 目录保留(含数据库与日志),由用户手动删除 MessageBox MB_YESNO|MB_ICONQUESTION \ "是否同时删除数据目录 $INSTDIR\data(数据库、转发配置、日志)?" \ IDNO KeepData RMDir /r "$INSTDIR\data" KeepData: RMDir "$INSTDIR" Delete "$SMPROGRAMS\webui4frpc\*.lnk" RMDir "$SMPROGRAMS\webui4frpc" DeleteRegKey HKLM "Software\webui4frpc" DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" SectionEnd