From 8a7543c7bf7f245d87fa079c477c50b333dfba37 Mon Sep 17 00:00:00 2001 From: Gareth Date: Fri, 24 May 2024 17:23:54 -0700 Subject: [PATCH] feat: add windows installer and tray app (#294) --- .github/workflows/build.yml | 16 +++ .github/workflows/release.yml | 43 ++++++ .gitignore | 4 +- .goreleaser.yaml | 17 ++- build/windows/icon.ico | Bin 0 -> 108647 bytes build/windows/install.nsi | 178 ++++++++++++++++++++++++ backrest.go => cmd/backrest/backrest.go | 7 +- cmd/backrestmon/backrestmon.go | 173 +++++++++++++++++++++++ cmd/backrestmon/icon.ico | Bin 0 -> 108647 bytes go.mod | 42 ++++-- go.sum | 156 +++++++++++++++++---- scripts/generate-installers.sh | 20 +++ 12 files changed, 613 insertions(+), 43 deletions(-) create mode 100644 build/windows/icon.ico create mode 100644 build/windows/install.nsi rename backrest.go => cmd/backrest/backrest.go (96%) create mode 100644 cmd/backrestmon/backrestmon.go create mode 100644 cmd/backrestmon/icon.ico create mode 100755 scripts/generate-installers.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d3fbb84f..a1304baf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,6 +9,11 @@ on: paths-ignore: - "docs/**" - "*.md" + pull_request: + branches: ["main"] + paths-ignore: + - "docs/**" + - "*.md" workflow_dispatch: jobs: @@ -44,3 +49,14 @@ jobs: path: | dist/*.tar.gz dist/*.zip + + - name: Generate Installers + run: | + mkdir -p dist-installers + ./scripts/generate-installers.sh ./dist-installers + + - name: Upload Installers + uses: actions/upload-artifact@v3 + with: + name: backrest-snapshot-installers + path: dist-installers/*.exe diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 44d88749..f636b37d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,3 +52,46 @@ jobs: with: name: release-artifacts path: dist/* + + tagged-release-installers: + name: "Tagged Release Installers" + runs-on: "ubuntu-latest" + needs: tagged-release + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Get Release Artifact URL # used to append installer executables to the release after GoReleaser runs + id: geturl + run: | + upload_url=$(curl -sL https://api.github.com/repos/${{github.repository}}/releases/latest?access_token=${{ secrets.GITHUB_TOKEN }} | jq -r '.upload_url') + echo ::set-output name=upload_url::$upload_url + + - name: Generate Installers + run: | + mkdir -p dist-installers + ./scripts/generate-installers.sh ./dist-installers + + - name: Upload Release Asset x86_64 + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.geturl.outputs.upload_url }} + asset_path: ./dist-installers/Backrest-setup-x86_64.exe + asset_name: Backrest-setup-x86_64.exe + asset_content_type: application/octet-stream + + - name: Upload Release Asset arm64 + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.geturl.outputs.upload_url }} + asset_path: ./dist-installers/Backrest-setup-arm64.exe + asset_name: Backrest-setup-arm64.exe + asset_content_type: application/octet-stream diff --git a/.gitignore b/.gitignore index 7cf8cad6..be222ce9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -backrest backrest-* dist -backrest.exe __debug_bin +cmd/backrest/backrest +*.exe \ No newline at end of file diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 2f658d8d..d86dbe49 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -20,7 +20,7 @@ before: builds: - id: other - main: . + main: ./cmd/backrest env: - CGO_ENABLED=0 goos: @@ -31,7 +31,7 @@ builds: - amd64 - arm64 - id: linux - main: . + main: ./cmd/backrest env: - CGO_ENABLED=0 goos: @@ -40,6 +40,18 @@ builds: - amd64 - arm64 - arm + - id: backrestmon + main: ./cmd/backrestmon + binary: backrest-windows-tray + env: + - CGO_ENABLED=1 + - GO111MODULE=on + ldflags: -H=windowsgui + goos: + - windows + goarch: + - amd64 + - arm64 archives: - format: tar.gz @@ -59,6 +71,7 @@ archives: - LICENSE - README.md - CHANGELOG.md + allow_different_binary_count: true dockers: - image_templates: diff --git a/build/windows/icon.ico b/build/windows/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6a4440a3b34f44583f3d4a7b272b4ee8d9b1f730 GIT binary patch literal 108647 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 literal 0 HcmV?d00001 diff --git a/build/windows/install.nsi b/build/windows/install.nsi new file mode 100644 index 00000000..4ffa567a --- /dev/null +++ b/build/windows/install.nsi @@ -0,0 +1,178 @@ +!define BUILD_DIR "." +!define OUT_DIR "." +!define APP_NAME "Backrest" +!define COMP_NAME "garethgeorge" +!define WEB_SITE "https://github.com/garethgeorge/backrest" +!define VERSION "00.00.00.00" +!define COPYRIGHT "garethgeorge 2024" +!define DESCRIPTION "Application" +!define LICENSE_TXT "${BUILD_DIR}\LICENSE" +!define INSTALLER_NAME "${OUT_DIR}\Backrest-setup.exe" +!define MAIN_APP_EXE "backrest-windows-tray.exe" +!define INSTALL_TYPE "SetShellVarContext current" +!define REG_ROOT "HKCU" +!define REG_APP_PATH "Software\Microsoft\Windows\CurrentVersion\App Paths\${MAIN_APP_EXE}" +!define UNINSTALL_PATH "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" + +!define REG_START_MENU "Start Menu Folder" + +var SM_Folder + +###################################################################### + +VIProductVersion "${VERSION}" +VIAddVersionKey "ProductName" "${APP_NAME}" +VIAddVersionKey "CompanyName" "${COMP_NAME}" +VIAddVersionKey "LegalCopyright" "${COPYRIGHT}" +VIAddVersionKey "FileDescription" "${DESCRIPTION}" +VIAddVersionKey "FileVersion" "${VERSION}" + +###################################################################### + +SetCompressor ZLIB +Name "${APP_NAME}" +Caption "${APP_NAME}" +OutFile "${INSTALLER_NAME}" +BrandingText "${APP_NAME}" +XPStyle on +InstallDirRegKey "${REG_ROOT}" "${REG_APP_PATH}" "" +InstallDir "$PROGRAMFILES64\Backrest" + +###################################################################### + +!include "MUI.nsh" + +!define MUI_ABORTWARNING +!define MUI_UNABORTWARNING + +!insertmacro MUI_PAGE_WELCOME + +!ifdef LICENSE_TXT +!insertmacro MUI_PAGE_LICENSE "${LICENSE_TXT}" +!endif + +!insertmacro MUI_PAGE_DIRECTORY + +!ifdef REG_START_MENU +!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Backrest" +!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${REG_ROOT}" +!define MUI_STARTMENUPAGE_REGISTRY_KEY "${UNINSTALL_PATH}" +!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${REG_START_MENU}" +!insertmacro MUI_PAGE_STARTMENU Application $SM_Folder +!endif + +!insertmacro MUI_PAGE_INSTFILES + +!define MUI_FINISHPAGE_RUN "$INSTDIR\${MAIN_APP_EXE}" +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_CONFIRM + +!insertmacro MUI_UNPAGE_INSTFILES + +!insertmacro MUI_UNPAGE_FINISH + +!insertmacro MUI_LANGUAGE "English" + +###################################################################### + +Section -MainProgram +${INSTALL_TYPE} +SetOverwrite ifnewer +SetOutPath "$INSTDIR" +File "${BUILD_DIR}\backrest.exe" +File "${BUILD_DIR}\backrest-windows-tray.exe" +File "${BUILD_DIR}\LICENSE" +SectionEnd + +###################################################################### + +Section "Run at startup" +CreateDirectory $SMSTARTUP +CreateShortcut "$SMSTARTUP\$(^Name).lnk" "$INSTDIR\${MAIN_APP_EXE}" "" "${BUILD_DIR}\icon.ico" 0 +SectionEnd + +Section -Icons_Reg +SetOutPath "$INSTDIR" +WriteUninstaller "$INSTDIR\uninstall.exe" + +!ifdef REG_START_MENU +!insertmacro MUI_STARTMENU_WRITE_BEGIN Application +CreateDirectory "$SMPROGRAMS\$SM_Folder" +CreateShortCut "$SMPROGRAMS\$SM_Folder\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}" "" "${BUILD_DIR}\icon.ico" 0 +CreateShortCut "$DESKTOP\${APP_NAME} Console.lnk" "$INSTDIR\${MAIN_APP_EXE}" "" "${BUILD_DIR}\icon.ico" 0 +CreateShortCut "$DESKTOP\${APP_NAME} UI.lnk" "http://localhost:9898/" "" "${BUILD_DIR}\icon.ico" 0 +CreateShortCut "$SMPROGRAMS\$SM_Folder\Uninstall ${APP_NAME}.lnk" "$INSTDIR\uninstall.exe" "" "${BUILD_DIR}\icon.ico" 0 + +!ifdef WEB_SITE +WriteIniStr "$INSTDIR\${APP_NAME} website.url" "InternetShortcut" "URL" "${WEB_SITE}" +CreateShortCut "$SMPROGRAMS\$SM_Folder\${APP_NAME} Website.lnk" "$INSTDIR\${APP_NAME} website.url" "" "${BUILD_DIR}\icon.ico" 0 +!endif +!insertmacro MUI_STARTMENU_WRITE_END +!endif + +!ifndef REG_START_MENU +CreateDirectory "$SMPROGRAMS\Backrest" +CreateShortCut "$SMPROGRAMS\Backrest\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}" "" "${BUILD_DIR}\icon.ico" 0 +CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}" "" "${BUILD_DIR}\icon.ico" 0 +CreateShortCut "$SMPROGRAMS\Backrest\Uninstall ${APP_NAME}.lnk" "$INSTDIR\uninstall.exe" "" "${BUILD_DIR}\icon.ico" 0 + +!ifdef WEB_SITE +WriteIniStr "$INSTDIR\${APP_NAME} website.url" "InternetShortcut" "URL" "${WEB_SITE}" +CreateShortCut "$SMPROGRAMS\Backrest\${APP_NAME} Website.lnk" "$INSTDIR\${APP_NAME} website.url" "" "${BUILD_DIR}\icon.ico" 0 +!endif +!endif + +WriteRegStr ${REG_ROOT} "${REG_APP_PATH}" "" "$INSTDIR\${MAIN_APP_EXE}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayName" "${APP_NAME}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "UninstallString" "$INSTDIR\uninstall.exe" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayIcon" "$INSTDIR\${MAIN_APP_EXE}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayVersion" "${VERSION}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "Publisher" "${COMP_NAME}" + +!ifdef WEB_SITE +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "URLInfoAbout" "${WEB_SITE}" +!endif +SectionEnd + +###################################################################### + +Section Uninstall +${INSTALL_TYPE} +Delete "$INSTDIR\backrest.exe" +Delete "$INSTDIR\backrest-windows-tray.exe" +Delete "$INSTDIR\LICENSE" +Delete "$INSTDIR\uninstall.exe" +Delete "$SMSTARTUP\$(^Name).lnk" +!ifdef WEB_SITE +Delete "$INSTDIR\${APP_NAME} website.url" +!endif + +RmDir "$INSTDIR" + +!ifdef REG_START_MENU +!insertmacro MUI_STARTMENU_GETFOLDER "Application" $SM_Folder +Delete "$SMPROGRAMS\$SM_Folder\${APP_NAME}.lnk" +Delete "$SMPROGRAMS\$SM_Folder\Uninstall ${APP_NAME}.lnk" +!ifdef WEB_SITE +Delete "$SMPROGRAMS\$SM_Folder\${APP_NAME} Website.lnk" +!endif +Delete "$DESKTOP\${APP_NAME}.lnk" + +RmDir "$SMPROGRAMS\$SM_Folder" +!endif + +!ifndef REG_START_MENU +Delete "$SMPROGRAMS\Backrest\${APP_NAME}.lnk" +Delete "$SMPROGRAMS\Backrest\Uninstall ${APP_NAME}.lnk" +!ifdef WEB_SITE +Delete "$SMPROGRAMS\Backrest\${APP_NAME} Website.lnk" +!endif +Delete "$DESKTOP\${APP_NAME}.lnk" + +RmDir "$SMPROGRAMS\Backrest" +!endif + +DeleteRegKey ${REG_ROOT} "${REG_APP_PATH}" +DeleteRegKey ${REG_ROOT} "${UNINSTALL_PATH}" +SectionEnd diff --git a/backrest.go b/cmd/backrest/backrest.go similarity index 96% rename from backrest.go rename to cmd/backrest/backrest.go index 54a3d791..454774c5 100644 --- a/backrest.go +++ b/cmd/backrest/backrest.go @@ -131,7 +131,6 @@ func main() { } func init() { - zap.ReplaceGlobals(zap.Must(zap.NewProduction())) if !strings.HasPrefix(os.Getenv("ENV"), "prod") { c := zap.NewDevelopmentEncoderConfig() c.EncodeLevel = zapcore.CapitalColorLevelEncoder @@ -142,6 +141,12 @@ func init() { zapcore.DebugLevel, )) zap.ReplaceGlobals(l) + } else { + zap.ReplaceGlobals(zap.New(zapcore.NewCore( + zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), + zapcore.AddSync(os.Stdout), + zapcore.DebugLevel, + ))) } } diff --git a/cmd/backrestmon/backrestmon.go b/cmd/backrestmon/backrestmon.go new file mode 100644 index 00000000..8400f5b1 --- /dev/null +++ b/cmd/backrestmon/backrestmon.go @@ -0,0 +1,173 @@ +//go:build windows +// +build windows + +package main + +import ( + "context" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "runtime" + "syscall" + + "github.com/garethgeorge/backrest/internal/env" + "github.com/getlantern/systray" + "github.com/ncruces/zenity" + lumberjack "gopkg.in/natefinch/lumberjack.v2" + + _ "embed" +) + +//go:embed icon.ico +var icon []byte + +func main() { + l, err := createLogWriter() + if err != nil { + reportError(err) + return + } + defer l.Close() + + backrest, err := findBackrest() + if err != nil { + reportError(err) + return + } + + ctx, cancel := context.WithCancel(context.Background()) + + cmd := exec.CommandContext(ctx, backrest) + cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} + cmd.Env = os.Environ() + cmd.Env = append(cmd.Env, "ENV=production") + + pro, pwo := io.Pipe() + pre, pwe := io.Pipe() + cmd.Stdout = pwo + cmd.Stderr = pwe + + go func() { + io.Copy(l, io.MultiReader(pro, pre)) + }() + + if err := cmd.Start(); err != nil { + reportError(err) + cancel() + return + } + + systray.Run(func() { + systray.SetTitle("Backrest Tray") + systray.SetTooltip("Manage backrest") + systray.SetIcon(icon) + + // First item: open the WebUI in the default browser. + mOpenUI := systray.AddMenuItem("Open WebUI", "Open the Backrest WebUI in your default browser") + mOpenUI.ClickedCh = make(chan struct{}) + go func() { + for range mOpenUI.ClickedCh { + if err := openBrowser("http://localhost:9898"); err != nil { + reportError(err) + } + } + }() + + // Second item: open the log file in the file explorer + mOpenLog := systray.AddMenuItem("Open Log Dir", "Open the Backrest log directory") + mOpenLog.ClickedCh = make(chan struct{}) + go func() { + for range mOpenLog.ClickedCh { + cmd := exec.Command(`explorer`, `/select,`, logsPath()) + cmd.Start() + go cmd.Wait() + } + }() + + // Last item: quit button to stop the backrest process. + mQuit := systray.AddMenuItem("Quit", "Kills the backrest process and exits the tray app") + mQuit.ClickedCh = make(chan struct{}) + go func() { + <-mQuit.ClickedCh + cancel() + systray.Quit() + }() + }, func() { + cancel() + }) + + if err := cmd.Wait(); err != nil { + systray.Quit() + if ctx.Err() != context.Canceled { + reportError(fmt.Errorf("backrest process exited unexpectedly with error: %w", err)) + } + return + } +} + +func findBackrest() (string, error) { + // Backrest binary must be installed in the same directory as the backresttray binary. + ex, err := os.Executable() + if err != nil { + return "", err + } + dir := filepath.Dir(ex) + + wantPath := filepath.Join(dir, backrestBinName()) + + if stat, err := os.Stat(wantPath); err == nil && !stat.IsDir() { + return wantPath, nil + } + return "", fmt.Errorf("backrest binary not found at %s", wantPath) +} + +func backrestBinName() string { + if runtime.GOOS == "windows" { + return "backrest.exe" + } else { + return "backrest" + } +} + +func openBrowser(url string) error { + switch runtime.GOOS { + case "linux": + return exec.Command("xdg-open", url).Start() + case "windows": + return exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start() + case "darwin": + return exec.Command("open", url).Start() + default: + return fmt.Errorf("unsupported platform") + } +} + +func reportError(err error) { + zenity.Error(err.Error(), zenity.Title("Backrest Error")) +} + +func createLogWriter() (io.WriteCloser, error) { + logsDir := logsPath() + fmt.Printf("Logging to %s\n", logsDir) + if err := os.MkdirAll(logsDir, 0755); err != nil { + return nil, err + } + + l := &lumberjack.Logger{ + Filename: filepath.Join(logsDir, "backrest.log"), + MaxSize: 5, // megabytes + MaxBackups: 3, + MaxAge: 14, + Compress: true, + } + + return l, nil +} + +func logsPath() string { + dataDir := env.DataDir() + return filepath.Join(dataDir, "processlogs") +} diff --git a/cmd/backrestmon/icon.ico b/cmd/backrestmon/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6a4440a3b34f44583f3d4a7b272b4ee8d9b1f730 GIT binary patch literal 108647 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 literal 0 HcmV?d00001 diff --git a/go.mod b/go.mod index 2821dec1..f0772bed 100644 --- a/go.mod +++ b/go.mod @@ -3,11 +3,12 @@ module github.com/garethgeorge/backrest go 1.21 require ( - connectrpc.com/connect v1.16.1 + connectrpc.com/connect v1.16.2 github.com/alessio/shellescape v1.4.2 github.com/containrrr/shoutrrr v0.8.0 github.com/djherbis/buffer v1.2.0 github.com/djherbis/nio/v3 v3.0.1 + github.com/getlantern/systray v1.2.2 github.com/gitploy-io/cronexpr v0.2.2 github.com/golang-jwt/jwt/v5 v5.2.1 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 @@ -15,24 +16,43 @@ require ( github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb github.com/mattn/go-colorable v0.1.13 github.com/natefinch/atomic v1.0.1 - go.etcd.io/bbolt v1.3.9 + github.com/ncruces/zenity v0.10.12 + go.etcd.io/bbolt v1.3.10 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.22.0 - golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f - golang.org/x/net v0.24.0 + golang.org/x/crypto v0.23.0 + golang.org/x/net v0.25.0 golang.org/x/sync v0.7.0 - google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 - google.golang.org/grpc v1.63.2 - google.golang.org/protobuf v1.34.0 + google.golang.org/genproto/googleapis/api v0.0.0-20240521202816-d264139d666e + google.golang.org/grpc v1.64.0 + google.golang.org/protobuf v1.34.1 + gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) require ( - github.com/fatih/color v1.16.0 // indirect + github.com/akavel/rsrc v0.10.2 // indirect + github.com/dchest/jsmin v0.0.0-20220218165748-59f39799265f // indirect + github.com/fatih/color v1.17.0 // indirect + github.com/getlantern/context v0.0.0-20220418194847-3d5e7a086201 // indirect + github.com/getlantern/errors v1.0.4 // indirect + github.com/getlantern/golog v0.0.0-20230503153817-8e72de7e0a65 // indirect + github.com/getlantern/hex v0.0.0-20220104173244-ad7e4b9194dc // indirect + github.com/getlantern/hidden v0.0.0-20220104173330-f221c5a24770 // indirect + github.com/getlantern/ops v0.0.0-20231025133620-f368ab734534 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-stack/stack v1.8.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/josephspurrier/goversioninfo v1.4.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/stretchr/testify v1.8.4 // indirect + github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect + github.com/randall77/makefat v0.0.0-20210315173500-7ddd0e42c844 // indirect + go.opentelemetry.io/otel v1.27.0 // indirect + go.opentelemetry.io/otel/metric v1.27.0 // indirect + go.opentelemetry.io/otel/trace v1.27.0 // indirect go.uber.org/multierr v1.11.0 // indirect + golang.org/x/image v0.16.0 // indirect golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 // indirect + golang.org/x/tools v0.20.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e // indirect ) diff --git a/go.sum b/go.sum index b8468dc3..fcc24978 100644 --- a/go.sum +++ b/go.sum @@ -1,28 +1,64 @@ -connectrpc.com/connect v1.16.1 h1:rOdrK/RTI/7TVnn3JsVxt3n028MlTRwmK5Q4heSpjis= -connectrpc.com/connect v1.16.1/go.mod h1:XpZAduBQUySsb4/KO5JffORVkDI4B6/EYPi7N8xpNZw= +connectrpc.com/connect v1.16.2 h1:ybd6y+ls7GOlb7Bh5C8+ghA6SvCBajHwxssO2CGFjqE= +connectrpc.com/connect v1.16.2/go.mod h1:n2kgwskMHXC+lVqb18wngEpF95ldBHXjZYJussz5FRc= +github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw= +github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alessio/shellescape v1.4.2 h1:MHPfaU+ddJ0/bYWpgIeUnQUqKrlJ1S7BfEYPM4uEoM0= github.com/alessio/shellescape v1.4.2/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/containrrr/shoutrrr v0.8.0 h1:mfG2ATzIS7NR2Ec6XL+xyoHzN97H8WPjir8aYzJUSec= github.com/containrrr/shoutrrr v0.8.0/go.mod h1:ioyQAyu1LJY6sILuNyKaQaw+9Ttik5QePU8atnAdO2o= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dchest/jsmin v0.0.0-20220218165748-59f39799265f h1:OGqDDftRTwrvUoL6pOG7rYTmWsTCvyEWFsMjg+HcOaA= +github.com/dchest/jsmin v0.0.0-20220218165748-59f39799265f/go.mod h1:Dv9D0NUlAsaQcGQZa5kc5mqR9ua72SmA8VXi4cd+cBw= github.com/djherbis/buffer v1.1.0/go.mod h1:VwN8VdFkMY0DCALdY8o00d3IZ6Amz/UNVMWcSaJT44o= github.com/djherbis/buffer v1.2.0 h1:PH5Dd2ss0C7CRRhQCZ2u7MssF+No9ide8Ye71nPHcrQ= github.com/djherbis/buffer v1.2.0/go.mod h1:fjnebbZjCUpPinBRD+TDwXSOeNQ7fPQWLfGQqiAiUyE= github.com/djherbis/nio/v3 v3.0.1 h1:6wxhnuppteMa6RHA4L81Dq7ThkZH8SwnDzXDYy95vB4= github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmWgZxOcmg= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/getlantern/context v0.0.0-20190109183933-c447772a6520/go.mod h1:L+mq6/vvYHKjCX2oez0CgEAJmbq1fbb/oNJIWQkBybY= +github.com/getlantern/context v0.0.0-20220418194847-3d5e7a086201 h1:oEZYEpZo28Wdx+5FZo4aU7JFXu0WG/4wJWese5reQSA= +github.com/getlantern/context v0.0.0-20220418194847-3d5e7a086201/go.mod h1:Y9WZUHEb+mpra02CbQ/QczLUe6f0Dezxaw5DCJlJQGo= +github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7/go.mod h1:l+xpFBrCtDLpK9qNjxs+cHU6+BAdlBaxHqikB6Lku3A= +github.com/getlantern/errors v1.0.1/go.mod h1:l+xpFBrCtDLpK9qNjxs+cHU6+BAdlBaxHqikB6Lku3A= +github.com/getlantern/errors v1.0.4 h1:i2iR1M9GKj4WuingpNqJ+XQEw6i6dnAgKAmLj6ZB3X0= +github.com/getlantern/errors v1.0.4/go.mod h1:/Foq8jtSDGP8GOXzAjeslsC4Ar/3kB+UiQH+WyV4pzY= +github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7/go.mod h1:zx/1xUUeYPy3Pcmet8OSXLbF47l+3y6hIPpyLWoR9oc= +github.com/getlantern/golog v0.0.0-20230503153817-8e72de7e0a65 h1:NlQedYmPI3pRAXJb+hLVVDGqfvvXGRPV8vp7XOjKAZ0= +github.com/getlantern/golog v0.0.0-20230503153817-8e72de7e0a65/go.mod h1:+ZU1h+iOVqWReBpky6d5Y2WL0sF2Llxu+QcxJFs2+OU= +github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7/go.mod h1:dD3CgOrwlzca8ed61CsZouQS5h5jIzkK9ZWrTcf0s+o= +github.com/getlantern/hex v0.0.0-20220104173244-ad7e4b9194dc h1:sue+aeVx7JF5v36H1HfvcGFImLpSD5goj8d+MitovDU= +github.com/getlantern/hex v0.0.0-20220104173244-ad7e4b9194dc/go.mod h1:D9RWpXy/EFPYxiKUURo2TB8UBosbqkiLhttRrZYtvqM= +github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55/go.mod h1:6mmzY2kW1TOOrVy+r41Za2MxXM+hhqTtY3oBKd2AgFA= +github.com/getlantern/hidden v0.0.0-20220104173330-f221c5a24770 h1:cSrD9ryDfTV2yaur9Qk3rHYD414j3Q1rl7+L0AylxrE= +github.com/getlantern/hidden v0.0.0-20220104173330-f221c5a24770/go.mod h1:GOQsoDnEHl6ZmNIL+5uVo+JWRFWozMEp18Izcb++H+A= +github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA= +github.com/getlantern/ops v0.0.0-20220713155959-1315d978fff7/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA= +github.com/getlantern/ops v0.0.0-20231025133620-f368ab734534 h1:3BwvWj0JZzFEvNNiMhCu4bf60nqcIuQpTYb00Ezm1ag= +github.com/getlantern/ops v0.0.0-20231025133620-f368ab734534/go.mod h1:ZsLfOY6gKQOTyEcPYNA9ws5/XHZQFroxqCOhHjGcs9Y= +github.com/getlantern/systray v1.2.2 h1:dCEHtfmvkJG7HZ8lS/sLklTH4RKUcIsKrAD9sThoEBE= +github.com/getlantern/systray v1.2.2/go.mod h1:pXFOI1wwqwYXEhLPm9ZGjS2u/vVELeIgNMY5HvhHhcE= github.com/gitploy-io/cronexpr v0.2.2 h1:Au+wK6FqmOLAF7AkW6q4gnrNXTe3rEW97XFZ4chy0xs= github.com/gitploy-io/cronexpr v0.2.2/go.mod h1:Uep5sbzUSocMZvJ1s0lNI9zi37s5iUI1llkw3vRGK9M= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= @@ -38,6 +74,13 @@ github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb h1:PGufWXXDq9yaev6x github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E= github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= github.com/jarcoal/httpmock v1.3.0/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= +github.com/josephspurrier/goversioninfo v1.4.0 h1:Puhl12NSHUSALHSuzYwPYQkqa2E1+7SrtAPJorKK0C8= +github.com/josephspurrier/goversioninfo v1.4.0/go.mod h1:JWzv5rKQr+MmW+LvM412ToT/IkYDZjaclF2pKDss8IY= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lxn/walk v0.0.0-20210112085537-c389da54e794/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ= +github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -45,50 +88,109 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A= github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM= +github.com/ncruces/zenity v0.10.12 h1:o4SErDa0kQijlqG6W4OYYzO6kA0fGu34uegvJGcMLBI= +github.com/ncruces/zenity v0.10.12/go.mod h1:5OZIERViRR2fN0FcJCcisqxI+lYMDGzEDCEwB/+8iao= github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= +github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= +github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= -go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +github.com/randall77/makefat v0.0.0-20210315173500-7ddd0e42c844 h1:GranzK4hv1/pqTIhMTXt2X8MmMOuH3hMeUR0o9SP5yc= +github.com/randall77/makefat v0.0.0-20210315173500-7ddd0e42c844/go.mod h1:T1TLSfyWVBRXVGzWd0o9BI4kfoO9InEgfQe4NV3mLz8= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= +go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= +go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= +go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= +go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= +go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= +go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= +go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f h1:99ci1mjWVBWwJiEKYY6jWa4d2nTQVIEhZIptnrVb1XY= -golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/image v0.16.0 h1:9kloLAKhUufZhA12l5fwnx2NZW39/we1UhBesW433jw= +golang.org/x/image v0.16.0/go.mod h1:ugSZItdV4nOxyqp56HmXwH0Ry0nBCpjnZdpDaIHdoPs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190529164535-6a60838ec259/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= -google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 h1:DTJM0R8LECCgFeUwApvcEJHz85HLagW8uRENYxHh1ww= -google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6/go.mod h1:10yRODfgim2/T8csjQsMPgZOMvtytXKTDRzH6HRGzRw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 h1:DujSIu+2tC9Ht0aPNA7jgj23Iq8Ewi5sgkQ++wdvonE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/protobuf v1.34.0 h1:Qo/qEd2RZPCf2nKuorzksSknv0d3ERwp1vFG38gSmH4= -google.golang.org/protobuf v1.34.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/api v0.0.0-20240521202816-d264139d666e h1:SkdGTrROJl2jRGT/Fxv5QUf9jtdKCQh4KQJXbXVLAi0= +google.golang.org/genproto/googleapis/api v0.0.0-20240521202816-d264139d666e/go.mod h1:LweJcLbyVij6rCex8YunD8DYR5VDonap/jYl3ZRxcIU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e h1:Elxv5MwEkCI9f5SkoL6afed6NTdxaGoAo39eANBwHL8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/Knetic/govaluate.v3 v3.0.0/go.mod h1:csKLBORsPbafmSCGTEh3U7Ozmsuq8ZSIlKk1bcqph0E= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/scripts/generate-installers.sh b/scripts/generate-installers.sh new file mode 100755 index 00000000..efd75fef --- /dev/null +++ b/scripts/generate-installers.sh @@ -0,0 +1,20 @@ +#! /bin/bash + +outdir=$(realpath $1) # output directory for the installer binaries +srcdir=$(realpath $(dirname $0)/..) # source directory + +# for each supported windows architecture +for arch in x86_64 arm64; do + cd $(mktemp -d) + unzip $srcdir/dist/backrest_Windows_${arch}.zip + + cp -rl $srcdir/build/windows/* . + + if [ "$arch" == "x86_64" ]; then + docker run --rm -v $(pwd):/build binfalse/nsis install.nsi + else + docker run --rm -e TARGET_ARCH=arm64 -v $(pwd):/build binfalse/nsis install.nsi + fi + + cp Backrest-setup.exe $outdir/Backrest-setup-${arch}.exe +done